2. Aspectos de los LP
• Antes de comenzar con la construcción de un
compilador, debemos comprender los
conceptos basicos del lenguaje de
programación con el que queremos trabajar
• No es el propósito cubrir todos los aspectos de
todos los lenguajes de programación
3. Estático vs. Dinámico
• Uno de los aspectos mas importantes a definir
cuando construimos un compilador, es que
decisiones puede tomar el compilador sobre
el programa
4. Estático vs. Dinámico
• Si el lenguaje usa una política que permite que
el compilador decida sobre un asunto,
entonces decimos que el compilador utiliza
una política estática, o que el asunto puede
ser decidido en tiempo de compilación
• Por el contrario, una política que solo permite
decidir cuando ejecutamos, se define como
dinámica, o que requiere una decisión en
runtime
5. Scopes (Ámbito)
• Otro punto a considerar, es el scope de las
declaraciones
• El scope de una declaración de X, es la región
del programa, en la que el uso de X, hacen
referencia a esta declaración
• Un lenguaje usa scope estático o léxico, si
mirando el programa podemos determinar el
scope de un símbolo X
6. Scopes (Ámbito)
• Por el contrario, un lenguaje utiliza scope
dinámico, si con la ejecución del programa, el
uso de la variable X puede hacer referencia a
diferentes declaraciones de X
• La mayoría de los lenguajes utilizan scope
estático o léxico
7. Environments vs. States
• Otro aspecto importante, es si los cambios
que ocurren al ejecutar el programa, afectan
los elementos de datos, o la interpretación de
los nombres usados para acceder a esos datos
• Por ejemplo, x = y + 1
• Cambia el valor denotado por x
• Sin embargo, un atributo “nombre” dentro de
una clase, cambia para cada instancia de la
clase
9. Environments vs. States
• Environment
– Es una función que mapea nombres en
direcciones de memoria
• State
– Es una función que mapea direcciones de
memoria en valores
10. Environments vs. States
• Por ejemplo…dos int x;
usos del nombre “i” ...
void f(...) {
int i;
...
i = 3;
...
}
...
x = i + 1
11. Scope estático y bloques
• Los lenguajes tipo C utilizan scope estatico
• La estructura del programa, determina el
scope de los símbolos
• Lenguajes posteriores como C#, Java y C++
agregaron el concepto de modificador de
acceso
– private, public, protected
12. Scope estático y bloques
• La mayoría de estos lenguajes utiliza una
construcción denominada bloque para afectar
el scope de los símbolos
• Un bloque es una agrupación de sentencias
• C utiliza { … } para definir un bloque
• Otros lenguajes utilizan begin … end
13. Scope en C
• Un programa en C consiste en una secuencia
de declaraciones top-level de variables y
funciones
• Las funciones pueden tener declaraciones de
variables. Estas incluyen variables locales y
parámetros
– El scope de estas declaraciones están restringidos
a la función en la que están contenidos
14. Scope en C
• El scope de una int x;
declaración top-level de ...
un nombre X, consiste void f(...) {
char x;
en todo el programa, ...
salvo aquellas funciones x = ‘3’;
en donde el nombre X ...
también haya sido }
declarado ...
x = i + 1
15. Bloques
• Es un tipo de sentencia, puede aparecer en
lugar de cualquier tipo de sentencia del
programa
• Esta formada por una secuencia de
declaraciones seguida de una secuencia de
sentencias
• El anidamiento de bloques, es lo que se
conoce como estructura de bloques
16.
17. Bloques
• Decimos que una declaracion D pertence a un
bloque B, si B es el bloque mas cercano que
contiene a D
• O sea, D esta dentro de B, pero no dentro de
un bloque B’ que se encuentre en B
• Esto nos permite definir reglas de scope para
cuando trabajamos con bloques
18. Bloques
• Decimos que una declaración D pertenece a
un bloque B, si B es el bloque mas cercano
que contiene a D
• O sea, D esta dentro de B, pero no dentro de
un bloque B’ que se encuentre en B
• Esto nos permite definir reglas de scope para
cuando trabajamos con bloques
19. Bloques
• Si una declaracion D de un nombre X,
pertenece a un bloque B, entonces el scope de
D, es el bloque B, incluyendo cualquier nivel
de anidamiento, pero excluyendo los bloques
B’ en los que X sea redefinida
20.
21. Control de acceso explicito
• En los lenguajes orientados a objetos, las
clases introducen una nueva forma de scope
para sus miembros
• En una clase C, el scope de un miembro X, es
la clase C, junto con cualquier clase derivada,
excepto si esta clase derivada redefine el
miembro X
– Los modificadores public, private y protected
afectan esto
22. Scope dinámico
• Una técnica de scope es dinámica, si esta
basada en factores que solo pueden ser
determinados al ejecutar el programa
• Con scope dinámico, el uso de un nombre X,
se refiere a la declaración de X, en la función
mas recientemente llamada con esa
declaración
23. Scope dinámico
int x = 2;
void b() (
int x = 1;
printf (”%dn” , x); // Imprime 1
}
void c() { printf(“%dn” , x); // Imprime 1
void main() { b(); c(); }
main() b() c()
24. Pasaje de parámetros
• Lo que nos interesa, es como los parámetros
actuales (los que usamos en la invocación a un
procedimientos), son asociados con los
parámetros formales (los que están en la
declaración del procedimiento)
• Tenemos tres formas de pasar parametros
– Call by value, Call by reference, Call by name
25. Call by value
• El parámetro actual es evaluado (si es una
expresión), y su valor es copiado en el parámetro
formal
• Es el método usado en C, Java, C# y el mas común
en C++
• Los parámetros actuales no se ven afectados por
los cambios realizados en el procedimiento
• Podemos pasar por valor, la dirección de
memoria de una variable
26. Call by reference
• En este caso, se pasa la dirección de los
parámetros actuales, colocando la misma en
los parámetros formales
• El acceso a través de los parámetros formales,
se hace siguiendo esta dirección
– Parámetros “ref“ en C++
• Los cambios en los parámetros formales,
afectan los parámetros actuales
27. Call by name
• Este mecanismo ya no es usado hoy
• Funciona como una expansión de una macro
en el procedimiento
• Cada parámetro formal, es reemplazado
literalmente por el parámetro actual
• En el caso de pasar expresiones como
parámetro, esto genera comportamientos
poco intuitivos
28. Aliasing
• Esto se da cuando tenemos pasaje de
parámetros por referencia (o por valor,
pasando la misma dirección 2 veces)
• Dos parámetros formales diferentes, pueden
apuntar al mismo parámetro actual
• Esto genera una situación de alias entre
ambos parámetros formales