Departamento de Informática Lenguajes de Programación Universidad Técnica Federico Santa María Departamento de Informática Universidad Técnica Federico Santa María Lenguajes de Programación Nombres • Identificador para designar un elemento del lenguaje 2.2 Nombres, Ligado y Ámbito – (e.g. variable, tipo, constante, función, etc.) • Aspectos de diseño Ligado estático y dinámico, reglas de ámbito y prueba de tipos. – Largo (significativo) del nombre – Tipos de caracteres aceptados (e.g. conector _) – Sensibilidad a mayúsculas y minúsculas – Palabras reservadas 1 RMA/2000 Departamento de Informática RMA/2000 Departamento de Informática Lenguajes de Programación Universidad Técnica Federico Santa María Universidad Técnica Federico Santa María Variables Lenguajes de Programación Dirección de una Variable • Abstracción de un objeto de memoria, que tiene los siguientes atributos: – – – – – – II- 2 Nombre (identificador) Dirección (l-value: ¿Dónde está localizada?) Valor (r-value: contenido) Tipo (tipo de dato que almacena y operaciones válidas) Tiempo de vida (¿Cuándo se crea y se destruye?) Ámbito (¿Dónde se puede referenciar?) • Un nombre puede ser asociado con diferentes direcciones en diferentes partes y tiempo de ejecución de un programa – El mismo nombre puede ser usado para referirse a diferentes objetos (direcciones), según el ámbito. – Diferentes nombres pueden referirse a un mismo objeto (alias), lo que puede provocar efectos laterales. • Ejemplo: Union y punteros en C y C++. RMA/2000 II- 3 Departamento de Informática RMA/2000 Departamento de Informática Lenguajes de Programación Universidad Técnica Federico Santa María Universidad Técnica Federico Santa María Ligado (Binding) Dirección, tipo → Nombre Código → Símbolo • Variables deben ser ligadas a un tipo antes de usarlas. • Ligado Estático: con declaración explícita o implícita – lenguajes modernos usan sólo declaración explícita – C y C++ hacen la diferencia entre declaración y definición • El tiempo de ligado se refiere al instante en que sucede la asociación: • Ligado Dinámico: en el momento de la asignación – Ventaja: Permite programar en forma genérica – Desventaja: disminuye capacidad de detección de errores y aumento del costo (ejecución) – Estática: diseño o implementación del lenguaje; compilación, enlace o carga del programa – Dinámica: ejecución del programa RMA/2000 Lenguajes de Programación Ligado de Tipos a Variables • Definición: Proceso de asociación de un atributo a una entidad del lenguaje. – Variable: – Operador: II- 4 II- 5 RMA/2000 II- 6 Departamento de Informática Universidad Técnica Federico Santa María Departamento de Informática Lenguajes de Programación Universidad Técnica Federico Santa María Ligado a Memoria y Tiempo de Vida • El carácter de un lenguaje está en gran medida determinado por cómo se administra la memoria. • A la variables se les puede asignar y liberar memoria de un espacio común (liberación implícita requiere de un recolector de basura). • Las variables escalares, según tipo de ligado, se clasifican en: 1) Variables Estáticas (Ligadas antes de la ejecución) • Ventajas – Útil para variables globales – Para variables sensibles a la historia de un subprograma (e.g. uso de static en variables de funciones C y C++) – Acceso directo permite mayor eficiencia • Desventajas – Falta de flexibilidad – No soportan recursión – Impide compartir memoria entre diferentes variables – Estáticas – Dinámica de stack – Dinámica de heap (explícita o implícita) RMA/2000 II- 7 Departamento de Informática Universidad Técnica Federico Santa María RMA/2000 Universidad Técnica Federico Santa María • La memoria se asigna y libera en forma explícita por el programador, usando un operador del lenguaje o una llamada al sistema • Típicamente el tipo se liga estáticamente • En Pascal se asigna memoria en el momento de ingresar al bloque que define el ámbito de la variable. – C++ dispone del operador new y delete – C usa llamada al sistema malloc() y free() – Java no permite la liberación explícita • Ventaja: útil para estructuras dinámicas usando punteros. • En C y C++ las variables son por defecto de este tipo (denominadas variables automáticas). RMA/2000 Lenguajes de Programación 3) Variables Dinámicas de Heap (explícita) • Ligadas (a la memoria) en el momento en que la ejecución alcanza el código asociado a la declaración. • Desventaja: Dificultad en su uso correcto II- 9 Departamento de Informática RMA/2000 II- 10 Departamento de Informática Lenguajes de Programación Universidad Técnica Federico Santa María Lenguajes de Programación Verificación de Tipo 4) Variables Dinámicas de Heap (implícita) (Type Checking) • Para generalizar, supongamos: • Se ligan al heap sólo cada vez que ocurre una asignación (usadas en ALGOL 68 y APL) – La asignación es un operador binario con una variable y una expresión como operandos – Un subprograma es un operador cuyos parámetros son sus operandos • Ventajas: – Alto grado de flexibilidad (un nombre sirve para cualquier cosa) – Permite escribir código genérico • Verificación de tipo es asegurar que los operandos de un operador son de tipo compatible. • Un tipo compatible es uno legal o que mediante reglas el compilador lo puede convertir a legal. • La conversión automática de tipo se denomina coerción • Desventaja: – Alto costo de ejecución – Pérdida en la capacidad de detección de errores RMA/2000 II- 8 Departamento de Informática Lenguajes de Programación 2) Variables Dinámicas de Stack Universidad Técnica Federico Santa María Lenguajes de Programación II- 11 RMA/2000 II- 12 Departamento de Informática Departamento de Informática Lenguajes de Programación Universidad Técnica Federico Santa María Tipificado Fuerte (strong typing) ... Verificación de Tipo • Si todos los tipos se ligan estáticamente ⇒ verificación de tipos se puede hacer estáticamente. • Ligado dinámico requiere realizar una verificación de tipo en tiempo de ejecución. • Lenguajes modernos prefieren una verificación de tipo estática • Verificación de tipo se complica cuando se permite almacenar valores de diferente tipo en una variable => (e.g. Registro con variante en Pascal y Union en C). RMA/2000 II- 13 Departamento de Informática • Un lenguaje es de tipificado fuerte si permite detectar siempre los errores de tipo – Cada nombre debe ser ligado estáticamente a un tipo – Ligado dinámico a memoria requiere verificación en tiempo de ejecución • Ejemplos: – ¡Pascal casi lo es! (registro con variante es excepción) – C y C++ no lo son (parámetros en funciones y union) – Java si lo es (permite forzar conversión de tipo) RMA/2000 Ejemplo: Pascal TYPE mes_t = 1..12; VAR indice : mes_t; contador: integer; • Compatibilidad de nombre – Las variables están en la misma declaración o usan el mismo nombre de tipo – Fácil implementación, pero muy restrictivo {otro ejemplo} TYPE celsius = real; fahrenheit = real; • Compatibilidad de estructura – Si los tipos tienen la misma estructura – Más flexible, pero de difícil implementación {otro ejemplo} TYPE tipo1 = ARRAY [1..10] OF integer; tipo2 = ARRAY [1..10] OF integer; {tipo1 <> tipo2} tipo3 = tipo2; {equivalencia declarativa} • Algunos lenguajes permiten forma intermedia! (e.g. Equivalencia declarativa en Pascal) RMA/2000 II- 15 Departamento de Informática RMA/2000 II- 16 Departamento de Informática Lenguajes de Programación Universidad Técnica Federico Santa María Lenguajes de Programación Universidad Técnica Federico Santa María Ejemplo: C y C++ Ámbito • Rango de sentencias en el cual un nombre es visible. • Nombres pueden ser sólo referenciadas dentro del ámbito. • Nombres no locales son los que son visibles dentro de un bloque, pero han sido declarado fuera de él. real c2 }; real c2 }; x; y = x; /* error de compatibilidad */ typedef char* pchar; pchar p1, p2; char* p3 = p1; RMA/2000 Lenguajes de Programación Universidad Técnica Federico Santa María Compatibilidad de Tipos s1 s2 II- 14 Departamento de Informática Lenguajes de Programación Universidad Técnica Federico Santa María struct s1 {int c1; struct s2 {int c1; Lenguajes de Programación Universidad Técnica Federico Santa María II- 17 RMA/2000 II- 18 Departamento de Informática Departamento de Informática Universidad Técnica Federico Santa María Lenguajes de Programación Lenguajes de Programación Universidad Técnica Federico Santa María Ámbito Estático Ejemplo: Pascal program main; var x: integer; • Ámbito estático: puede ser determinado antes de la ejecución (El primero: ALGOL) • Usado en la mayoría de los lenguajes imperativos. • Es normal permitir el anidamiento en una jerarquía de ámbitos (excepto: C, C++, Java y Fortran), que define una ascendencia estática RMA/2000 II- 19 Departamento de Informática procedure p1; begin { p1} … x … end; {p1} procedure p2; var x: integer; begin { p2} … x … end; {p2} p1 main p2 begin {main} … end. {main} RMA/2000 II- 20 Departamento de Informática Universidad Técnica Federico Santa María Lenguajes de Programación Universidad Técnica Federico Santa María Ejemplo: C Ámbito Dinámico extern int i; int j = 100; static int k; • Ámbito de nombres no locales está definido por secuencia de llamadas a subprogramas • Anidamiento de llamadas define ascendencia dinámica • Problemas: void f1 (…) { int i,m; … } void f2 (…) { int static k=0; if (!k) { printf(“primera vez\n”); k=1}; for ( i n t j = 0 ; j++; j < 9 9 ) { ¨ … } ; } RMA/2000 II- 21 Departamento de Informática Universidad Técnica Federico Santa María Lenguajes de Programación – No permite proteger variables locales – No se pueden verificar estáticamente los tipos – Programas son difíciles de leer y más lentos RMA/2000 II- 22 Departamento de Informática Lenguajes de Programación Universidad Técnica Federico Santa María Ejemplo: Ambito Dinámico Lenguajes de Programación Constantes con Nombre program main; var x: integer; • Son variables que se ligan a un valor en el momento de ligar la memoria; luego el valor permanece constante • Sirven para mejorar la lectura • La inicialización puede permitir expresiones procedure p1; begin { p1} … x … end; {p1} procedure p2; var x: integer; begin { p2} … x … end; {p2} b e g i n { main} … end . { m a i n } RMA/2000 II- 23 RMA/2000 II- 24 Departamento de Informática Universidad Técnica Federico Santa María Lenguajes de Programación Ejemplo: C y C++ #define MAX 100 const int max = 100; for (int i=0;i++; i<MAX ) { … }; for (int j=0;i++; i< max) { … }; RMA/2000 II- 25