Teoría del Lenguaje
Lenguajes de Programación
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
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
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
Ámbito
• Otro punto a considerar, es el ámbito de las
declaraciones
• El ámbito 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 ámbito estático o léxico, si
mirando el programa podemos determinar el
ámbito de un símbolo X
Ámbitos
• Por el contrario, un lenguaje utiliza ámbito
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 ámbito
estático o léxico
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
Environments vs. States
Nombres
Variables
(Direcciones)
Valores
Environment
State
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
Environments vs. States
int x;
...
void f(...) {
int i;
...
i = 3;
...
}
...
x = i + 1
• Por ejemplo…dos
usos del nombre “i”
Ámbito estático y bloques
• Los lenguajes tipo C utilizan ámbito
estatico
• La estructura del programa, determina el
ámbito de los símbolos
• Lenguajes posteriores como C#, Java y C++
agregaron el concepto de modificador de
acceso
– private, public, protected
Ámbito estático y bloques
• La mayoría de estos lenguajes utiliza una
construcción denominada bloque para afectar
el ámbito de los símbolos
• Un bloque es una agrupación de sentencias
• C utiliza { … } para definir un bloque
• Otros lenguajes utilizan begin … end
Ámbito 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 ámbito de estas declaraciones están
restringidos a la función en la que están
contenidos
Ámbito en C
• El ámbito de una
declaración top-level de
un nombre X, consiste
en todo el programa,
salvo aquellas funciones
en donde el nombre X
también 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 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 ámbito para
cuando trabajamos con bloques
Bloques
• Si una declaracion D de un nombre X,
pertenece a un bloque B, entonces el ámbito
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
ámbito para sus miembros
• En una clase C, el ámbito 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
Ámbito dinámico
• Una técnica de ámbito es dinámica, si
esta basada en factores que solo pueden
ser determinados al ejecutar el
programa
• Con ámbito 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
Ámbito 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()
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 dos formas básicas de pasar
parametros: Call by value y Call by reference
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
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
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

Lenguajes de programacion

  • 1.
  • 2.
    Aspectos de losLP • 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.
    Ámbito • Otro puntoa considerar, es el ámbito de las declaraciones • El ámbito 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 ámbito estático o léxico, si mirando el programa podemos determinar el ámbito de un símbolo X
  • 6.
    Ámbitos • Por elcontrario, un lenguaje utiliza ámbito 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 ámbito 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
  • 8.
  • 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 intx; ... void f(...) { int i; ... i = 3; ... } ... x = i + 1 • Por ejemplo…dos usos del nombre “i”
  • 11.
    Ámbito estático ybloques • Los lenguajes tipo C utilizan ámbito estatico • La estructura del programa, determina el ámbito de los símbolos • Lenguajes posteriores como C#, Java y C++ agregaron el concepto de modificador de acceso – private, public, protected
  • 12.
    Ámbito estático ybloques • La mayoría de estos lenguajes utiliza una construcción denominada bloque para afectar el ámbito de los símbolos • Un bloque es una agrupación de sentencias • C utiliza { … } para definir un bloque • Otros lenguajes utilizan begin … end
  • 13.
    Ámbito 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 ámbito de estas declaraciones están restringidos a la función en la que están contenidos
  • 14.
    Ámbito en C •El ámbito de una declaración top-level de un nombre X, consiste en todo el programa, salvo aquellas funciones en donde el nombre X también haya sido declarado int x; ... void f(...) { char x; ... x = ‘3’; ... } ... x = i + 1
  • 15.
    Bloques • Es untipo 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
  • 17.
    Bloques • Decimos queuna 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 ámbito para cuando trabajamos con bloques
  • 18.
    Bloques • Si unadeclaracion D de un nombre X, pertenece a un bloque B, entonces el ámbito de D, es el bloque B, incluyendo cualquier nivel de anidamiento, pero excluyendo los bloques B’ en los que X sea redefinida
  • 20.
    Control de accesoexplicito • En los lenguajes orientados a objetos, las clases introducen una nueva forma de ámbito para sus miembros • En una clase C, el ámbito 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
  • 21.
    Ámbito dinámico • Unatécnica de ámbito es dinámica, si esta basada en factores que solo pueden ser determinados al ejecutar el programa • Con ámbito 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
  • 22.
    Ámbito 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()
  • 23.
    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 dos formas básicas de pasar parametros: Call by value y Call by reference
  • 24.
    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
  • 25.
    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
  • 26.
    Aliasing • Esto seda 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