Documento 89535

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