Está en la página 1de 5

24/03/2015

Aspectos de los LP

Diseo de compiladores
Lenguajes de Programacin

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

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

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

Scope

Scope

El scope de una declaracin X, es la regin del


programa en la que el uso de X, hace
referencia a esta declaracin
Tambin se la conoce como mbito de un
smbolo o de una declaracin

int x = 2;

Scope de x

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

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

24/03/2015

Scope esttico
Un lenguaje usa scope esttico o lxico, si
mirando el programa podemos determinar el
scope de un smbolo X
El scope se determina siguiendo la estructura
del programa
Generalmente se basa en el concepto de
bloques anidados

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

// Imprime 1

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

Scope dinmico
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
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);
}

Los lenguajes tipo C utilizan scope esttico


La estructura del programa, determina el
scope de los smbolos
Lenguajes posteriores como C#, Java y C++
agregaron el concepto de modificador de
acceso

// Imprime 1

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

Scope esttico y bloques

c()

b()

b()

c()

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

private, public, protected

24/03/2015

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 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 declaracin 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

24/03/2015

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
x=y+1
Cambia el valor denotado por x

class Persona { String nombre }


La interpretacin nombre cambia para cada
instancia de la clase

Environments vs. States

Environments vs. States


Environment

Environment

Es una funcin que mapea nombres en


direcciones de memoria
Nombres

State
Variables
(Direcciones)

Es una funcin que mapea direcciones de


memoria en valores
Valores

State

Environments vs. States


Por ejemplodos
usos del nombre i

int x;
...
void f(...) {
int i;
...
i = 3;
...
}
...
x = i + 1

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

24/03/2015

Pasaje de parmetros
Parmetros actuales (argumentos)
Los que usamos en la invocacin a una funcin

Parmetros formales
Los que estn en la declaracin de la funcin

Nos interesa como podemos asociar ambos


Tenemos dos grandes formas de hacerlo
Por valor (Call by value) y por referencia (Call by
reference)

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

También podría gustarte