Slides Chapter 5 Variables, types, names, scope, and lifetime

Anuncio
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
Descargar