Nombres, Ligaduras, Chequeo de Tipos y Alcance Luis Garreta [email protected] (Basados en el libro de Robert Sebesta) 1 Nombres, Ligaduras, Chequeo de Tipos y Alcance • • • • • • • • • • Nombres Variables El concepto de ligadura (Binding) Chequeo de Tipos Tipado Fuerte (Strong Typing) Compatibilidad de Tipos Alcance, Alcance y Tiempo de vida (lifetime) Ambientes de Referencia Designación de Constantes Inicialización deVariables 2 Introducción • Asunto Fundamental: semantica de variables • Lenguajes Imperativos son abstracciones de la arquitectura Von Neumann: – Memoria – Procesador • Variables caracterizadas por atributos: – Tipo: para el diseño, alcance, lifetime, chequeo de tipos, inicialización y compatibilidad de tipos 3 Nombres • Características de diseño: – Longitud, conectores, sensibilidad mayúsculas, palabras especiales (palabras reservadas, palabras claves : keyword) • Palabras Especiales – Ayuda en la legibilidad; usadas para delimitar o separar clausulas de declaraciones – Def: Una palabra clave es una palabra que es especial solo en ciertos contextos – Desventaja: pobre legibilidad – Def: Una palabra reserveda es una palabra que no puede ser usada como nombre definido por el usurio. 4 Variables: Definicion • Abstracción de una celda de memoria. • Sextupla de atributos: – nombre, dirección, valor, tipo, duración, alcance. • Nombre – No todas tienen uno (anónimas) 5 Variables : Dirección • Dirección de memoria con la cual se asocia (también llamada l­valor) – Una variable puede tener diferentes direcciones en diferentes tiempos durante la ejecución. – Una variable puede tener diferentes direcciones en diferentes lugares en un programa. – Alias : • Si dos nombres de variables se usan para acceder a la misma localización de memoria. • Alias son negativos para la legibilidad (programador debe recordar todos ellos) • Creación de alias: Punteros, referencias, uniones C/C++ y a través de parámetros. 6 Variables: Tipo, Valor, Celda • Tipo: – Determina su rango de valores – Determina el conjunto de operaciones definidas para valores de ese tipo. – En los flotantes, el tipo también determina la precisión. • Valor: – El contenido de la localización con la cual las variables son asociadas. • Celda de Memoria Abstracta – La celda física o colección de celdas asociadas a una variable 7 Ligadura: Definición Ligadura: Asociación del l­valor con el r­valor • El l­valor de una variables es su dirección • El r­valor de una variable es su valor • Tiempo de ligadura: – Es el tiempo en el cual la ligadura tiene lugar 8 Ligadura: Tiempos de Enlace Pósibles tiempos de enlace: – Diseño del lenguaje – ej., liga simbolos de operadores a operaciones. – Implementación del Lenguaje – ej.: liga tipos punto flotante a una representación. – Tiempo de Compilación –ej.: liga una variable a un tipo (C/C++,Java) – Tiempo de Carga –ej.: liga una variable a una celda de memoria (static en C) – Tiempo de Ejecución –ej.: liga una variable local no estática a una celda de memoria (Python). 9 Ligadura: Estática y Dinámica • Ligadura es estática si ocurre antes de la ejecución y permanece igual a través de la ejecución • Ligadura es dinámica si ocurre primero durante la ejecución y puede cambiar durante la ejecución. 10 Ligadura: Tipos • Tipos de ligaduras – ¿Cómo es especificado un tipo? – ¿Cuando la ligadura tiene lugar? – Si es estática, ¿el tipo puede ser especificado por una declaración explicita o implicita? 11 El Concepto de ligadura (V) • Def: Una declaración explicita es una declaración de programa usada para declarar tipos de variables. • Def: Una declaración implicita es un mecanismo por defecto para especificar tipos de variables (primera aparición de variable en el programa) • Ej: Python, Oz, BASIC, y Perl brindan declaraciones implicitas – Ventajas: escritura (writability) – Desventaja: confiabilidad, problemas en ejecución. 12 El Concepto de ligadura (VI) • Ligadura de Tipos Dinámica (Python, Oz, PHP) • Se específica a través de la declaración de asignación: ls = [2, 4, 6] ls = 17.3 # ls es una lista # Ahora, ls es real • Ventajas: flexibilidad (unidades de programas genéricas) • Desventajas: - Alto costo (Chequeo de tipos dinámicos e interpretación) - Detección de errores complicada y en tiempo de ejecución 13 El Concepto de ligadura (VII) • Storage Binding & Tiempo de vida (lifetime) – Asignación – obtener celda desde un banco de celdas. – Desasignación – regresar la celda al repositorio • Def: El tiempo de vida de una variable es el tiempo durante el cual la variable está ligada a una celda particular 14 Tiempo de Vida(I) • Categorias de variables por tiempo de vida: – Estática: ligada a la celda de memoria antes que la ejecución inicie y sigue ligada a la misma celda a lo largo de la ejecución. (Ej: Variables static en C) - Ventajas: eficiencia (direccionamiento directo), soporte de subprogramas sencitivos a la historia. - Desventajas: perdida de visión (¿Quién la modifica, cuando? 15 Tiempo de Vida(II) • Categorias de variables por tiempo de vida: – Stack­dynamic: almacenamiento de ligaduras son creadas para las variables cuando estas son elaboradas. • • • • Ej: variables locales subprogramas C y métodos JAVA/C++ Ventajas: permite recursión, conserva almacenamiento Desventajas: costos de asignación/desasignación Referencias ineficiente (Direccionamiento indirecto) 16 Tiempo de Vida(III) Categorías de variables por tiempo de vida: • Heap dinámico explicito: Asignadas y desasignadas por directivas explicitas, especificadas por el programador, las cuales tienen efecto durante la ejecución. – Referenciadas sólo a través de punteros y referencias – Ej: Objetos dinámicos en C++ (new/delete), todos los objetos en Java – Ventajas: brinda manejo de almacenamiento dinámico. – Desventajas: ineficiente y poco fiable (Confianza en el programador) 17 Tiempo de Vida(IV) Categorías de variables por tiempo de vida: • Heap dinámico implicito: Asignación y desasignación causada por declaraciones de asignación. – Ej: Variables en Python y oz, arreglos y strings en Perl. – Venjajas: Flexibilidad – Desventajas: • Ineficiente : todos los atributos son dinámicos • Perdida de detección de errores 18 Chequeo de Tipos (I) • Def: Chequeo de Tipos: operandos y operadores sean de tipos compatibles. • Def: Tipo Compatible: – – – – Es legal para el operador Legal bajo reglas del lenguaje (Conversión) Coerción: Compilador convierte implicitamente Casting: Programador convierte explicitamente. • Error de Tipo: Mala aplicación de operadores a operandos de tipo inapropiado 19 Tipado Fuerte • Ventajas del tipado fuerte: permite la detección del mal manejo de variables que resultan en errores de tipo. • Ejemplos de Lenguajes: – C / C++: No es. Void pointers. Uniones no se chequea tipos. – Java : (Casi) Fuertemente Tipado. 20 Compatibilidad de Tipos • Nuestro interés será en datos estructurados • Def: Compatibilidad de tipo por nombre: dos variables tienen compatibilidad de tipos si están en la misma declaración o en diferentes declaraciones con el mismo nombre de tipo. • Fácil de implementar pero altamente restricitiva: – Subrangos de tipos enteros no son compatibles con tipos enteros. – Parámetros formales deben ser del mismo tipo que sus correspondientes parámetros actuales (Pascal) 21 Compatibilidad de Tipos • Def: Compatibilidad de tipos por estructura: dos variables tienen compatibilidad de tipos si sus tipos tienen identicas estructuras. • Más flexible, pero díficil de implementar. 22 Compatibilidad de Tipos • Considere el problema de tipos estructurados: – ¿Dos tipos registro son compatibles si su estructura es la misma pero tienen diferentes nombres? – ¿Dos tipos de arreglos son compatibles si son los mismos excepto que los subídices son diferentes? (e.g. [1..10] and [0..9]). – ¿Dos tipos enumerados son compatibles si sus componentes son escritos de forma diferente? – Con compatibilidad de tipos estructurada, usted no puede diferenciar entre tipos de la misma estructura (e.g. diferentes unidades de velocidad, ambas float) 23 Compatibilidad de Tipos • Ejemplos en lenguajes: – C: por estructura, excepto para registros, de nombre – Java: por nombre, por estructura (clases) 24 Alcance (Ambito, Scope) • Def: el alcance de una variable es el rango de las declaraciones sobre la cual esta es visible • Def: Las variables no locales de una unidad de programa son esas que son visibles pero no declaradas alli. • Las reglas de alcance de un lenguaje determinan como las referencias a nombres son asociadas con variables. 25 Alcance(I) • Alcance estático – Basado en texto del programa – Para conectar una referencia de nombre a una variable, usted (o el compilador) deben encontrar la declaración – Proceso de Búsqueda: búsqueda de declaraciones, primero localmente, después en ambitos cerrados más grandes, hasta que uno es encontrado por el nombre dado. 26 Alcance(II) • Variables pueden ser escondidas de una unidad teniendo una variable “mas cercana” con el mismo nombre. • C++, Java permiten aceso a estas variables “escondidas” – C++: nombre clase::nombre – Python: archivo.nombre – Java: nombre clase.nombre (Solo si es estática) 27 Alcance(III) • Bloques: – Método para crear ambitos estáticos dentro de unidades de programas – Ejemplos: C, C++, Java for (...) { int index; ... } Oz declare tmp1 in; end 28 Alcance • Evaluación para Alcance Dinámico • Ejemplo: Asuma MAIN llama A y B A llama C y D B llama A y E 29 Ejemplo Alcance Estático MAI N MAI N A C A B D C B D E E 30 Ejemplo Alcance Estático MAIN A C MAIN B D A E C B D E 31 Alcance • Alcance Dinámico: – Basado en secuencias de llamado de unidades de programas, no su organización textual (temporal versus espacial) – Referencias a variables son conectadas a declaraciones buscando hacia atrás a través de la cadena de llamados de subprogramas que fuerzan la ejecución en este punto. 32 Ejemplo Alcance MAIN ­ declaración de x SUB1 ­ declaración de x ­ ... call SUB2 ... SUB2 ... ­ referencia to x ­ ... MAIN llama SUB1 SUB1 llama SUB2 SUB2 usa x ... call SUB1 … 33 Ejemplo Alcance • Alcance estático: – Referencia a x es hacia la x del MAIN • Alcance dinámico: – Referencia a x es hacia la x de SUB1 • Evaluación del Alcance dinámico: – Ventajas: conveniencia – Desventajas: pobre legibilidad 34 Alcance y Tiempo de Vida • Alcance y Tiempo de vida (lifetime) están algunas veces muy relacionado, pero son dos conceptos diferentes. • Considere una variable static en una función C/C++ 35 Ambientes de Referencia • Def: El ambiente de referencia de una declaración es la colección de todos los nombres que son visibles en una declaración. • En un lenguaje de alcance estático, este es las variables locales más todas las variables visibles en todos los ambitos que lo encierran. • Un subprograma es activo si su ejecución ha comenzado pero aún no ha terminado. • En un lenguaje de alcance dinámico, el ambiente de referencia es las variables locales mas todas las variables visibles en todos los subprogramas activos. 36 Inicialización de Variables • Def: La ligadura de una variaba a su valor al tiempo en que esta es ligada a almacenamiento es llamado inicialización • La inicialización es a menudo realizada sobre la expresión de la declaración. – e.g, Java int sum = 0; 37