02 lenguajes de_programacion

131 visualizaciones

Publicado el

0 comentarios
0 recomendaciones
Estadísticas
Notas
  • Sé el primero en comentar

  • Sé el primero en recomendar esto

Sin descargas
Visualizaciones
Visualizaciones totales
131
En SlideShare
0
De insertados
0
Número de insertados
1
Acciones
Compartido
0
Descargas
2
Comentarios
0
Recomendaciones
0
Insertados 0
No insertados

No hay notas en la diapositiva.

02 lenguajes de_programacion

  1. 1. Diseño de compiladores Lenguajes de Programación
  2. 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. 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. 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. 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. 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. 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. 8. Environments vs. States EnvironmentNombres Variables (Direcciones) Valores State
  9. 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. 10. Environments vs. States• Por ejemplo…dos int x; usos del nombre “i” ... void f(...) { int i; ... i = 3; ... } ... x = i + 1
  11. 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. 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. 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. 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. 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. 16. 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
  17. 17. 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
  18. 18. 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
  19. 19. 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
  20. 20. 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
  21. 21. Scope dinámicoint x = 2;void b() ( int x = 1; printf (”%dn” , x); // Imprime 1}void c() { printf(“%dn” , x); // Imprime 1void main() { b(); c(); } main() b() c()
  22. 22. 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
  23. 23. 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
  24. 24. 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
  25. 25. 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
  26. 26. 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

×