Vous êtes sur la page 1sur 28

Diseo de compiladores

Lenguajes de Programacin

Aspectos de los LP
Antes de comenzar con la construccin de un compilador, debemos comprender los conceptos basicos del lenguaje de programacin con el que queremos trabajar No es el propsito cubrir todos los aspectos de todos los lenguajes de programacin

Esttico vs. Dinmico


Uno de los aspectos mas importantes a definir cuando construimos un compilador, es que decisiones puede tomar el compilador sobre el programa

Esttico vs. Dinmico


Si el lenguaje usa una poltica que permite que el compilador decida sobre un asunto, entonces decimos que el compilador utiliza una poltica esttica, o que el asunto puede ser decidido en tiempo de compilacin Por el contrario, una poltica que solo permite decidir cuando ejecutamos, se define como dinmica, o que requiere una decisin en runtime

Scopes (mbito)
Otro punto a considerar, es el scope de las declaraciones El scope de una declaracin de X, es la regin del programa, en la que el uso de X, hacen referencia a esta declaracin Un lenguaje usa scope esttico o lxico, si mirando el programa podemos determinar el scope de un smbolo X

Scopes (mbito)
Por el contrario, un lenguaje utiliza scope dinmico, si con la ejecucin del programa, el uso de la variable X puede hacer referencia a diferentes declaraciones de X La mayora de los lenguajes utilizan scope esttico o lxico

Environments vs. States


Otro aspecto importante, es si los cambios que ocurren al ejecutar el programa, afectan los elementos de datos, o la interpretacin 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

Environments vs. States


Environment

Nombres
Variables (Direcciones) Valores

State

Environments vs. States


Environment
Es una funcin que mapea nombres en direcciones de memoria

State
Es una funcin que mapea direcciones de memoria en valores

Environments vs. States


Por ejemplodos usos del nombre i
int x; ... void f(...) { int i; ... i = 3; ... } ... x = i + 1

Scope esttico y bloques


Los lenguajes tipo C utilizan scope estatico La estructura del programa, determina el scope de los smbolos Lenguajes posteriores como C#, Java y C++ agregaron el concepto de modificador de acceso
private, public, protected

Scope esttico y bloques


La mayora de estos lenguajes utiliza una construccin denominada bloque para afectar el scope de los smbolos Un bloque es una agrupacin de sentencias C utiliza { } para definir un bloque Otros lenguajes utilizan begin end

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 parmetros
El scope de estas declaraciones estn restringidos a la funcin en la que estn contenidos

Scope en C
El scope de una declaracin top-level de un nombre X, consiste en todo el programa, salvo aquellas funciones en donde el nombre X tambin haya sido declarado
int x; ... void f(...) { char x; ... x = 3; ... } ... x = i + 1

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

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

Bloques
Decimos que una declaracin 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

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

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

Scope dinmico
Una tcnica de scope es dinmica, si esta basada en factores que solo pueden ser determinados al ejecutar el programa Con scope dinmico, el uso de un nombre X, se refiere a la declaracin de X, en la funcin mas recientemente llamada con esa declaracin

Scope dinmico
int x = 2; void b() ( int x = 1; printf (%d\n , x); }

// Imprime 1

void c() { printf(%d\n , x); // Imprime 1 void main() { b(); c(); }

main()

b()

c()

Pasaje de parmetros
Lo que nos interesa, es como los parmetros actuales (los que usamos en la invocacin a un procedimientos), son asociados con los parmetros formales (los que estn en la declaracin del procedimiento) Tenemos tres formas de pasar parametros
Call by value, Call by reference, Call by name

Call by value
El parmetro actual es evaluado (si es una expresin), y su valor es copiado en el parmetro formal Es el mtodo usado en C, Java, C# y el mas comn en C++ Los parmetros actuales no se ven afectados por los cambios realizados en el procedimiento Podemos pasar por valor, la direccin de memoria de una variable

Call by reference
En este caso, se pasa la direccin de los parmetros actuales, colocando la misma en los parmetros formales El acceso a travs de los parmetros formales, se hace siguiendo esta direccin
Parmetros ref en C++

Los cambios en los parmetros formales, afectan los parmetros actuales

Call by name
Este mecanismo ya no es usado hoy Funciona como una expansin de una macro en el procedimiento Cada parmetro formal, es reemplazado literalmente por el parmetro actual En el caso de pasar expresiones como parmetro, esto genera comportamientos poco intuitivos

Aliasing
Esto se da cuando tenemos pasaje de parmetros por referencia (o por valor, pasando la misma direccin 2 veces) Dos parmetros formales diferentes, pueden apuntar al mismo parmetro actual Esto genera una situacin de alias entre ambos parmetros formales