Evaluación del riesgo tecnologías informáticas.pdf
COMPILADORES1.pdf
1. Compiladores
Benjamín Joaquín Martínez
1.2 Dada la asignación en C
a [i+1] = a[i] + 2
Dibuje un árbol de análisis gramatical y árbol sintáctico para la expresión utilizando como guía el
ejemplo semejante de la sección 1.3
Expresión
Expresión de asignación
Expresión Expresión
=
Expresión de
subindice
Expresión aditiva
Expresión [ Expresión aditiva ]
Identificador
a
Expresión Expresión
+
Identificador
i
Numero
1
Expresión
+ Expresión
Expresión de subíndice Numero
2
Expresión [ Expresión ]
Identificador
a
Identificador
i
2. 1.5 Si su compilador aceptara la entrada directamente desde el teclado, determine si dicho
compilador lee el programa entero antes de generar mensajes de error o bien genera mensajes
de error a medida que los encuentra. ¿Qué implicación tiene hacer esto en el número de
pasadas?
Los errores pueden ser detectados durante casi cualquier fase de la compilación. (pág. 18 párrafo
1) Pero es conveniente procesar todo el programa fuente varias veces antes de generar el código.
Ya que en cada pasada se construye un árbol sintáctico o un código intermedio a partir de la
fuente (pág. 15 párrafo 5) y dependiendo del lenguaje un compilador puede ser hasta de una
pasada, lo que equivaldría a leer el programa entero antes de generar algún manejo de error, pero
en la mayoría de los compiladores se usan más de una pasada para cada fase de compilación
(sintáctico, semántico, etc.) (Pág. 16 párrafo 1)
Expresión de asignación
Expresión de
subíndice
Expresión aditiva
Identificador
a
Expresión aditiva
Identificador
i
Numero
1
Expresión
de
subíndice
Identificador
a
Identificador
i
Numero
2
3. 1.4. Esta pregunta supone que usted trabaja con un compilador que tiene una opción para
producir salida en lenguaje ensamblador.
a. Determine si su compilador realiza optimizaciones de incorporación de constantes.
Hablando del árbol sintáctico en varios casos es más fácil optimizar una forma linealizada
de árbol que está más cercano al código ensamblador (pág. 11 párrafo 1) .
Se pueden realizar de manera directa sobre el árbol al colapsar algún subárbol secundario
de su nodo raíz con su valor constante. (pág. 10, párrafo 4)
b. Una optimización relacionada pero más avanzada es la de propagación de constantes:
una variable que actualmente tiene un valor constante es reemplazada por ese valor en
las expresiones. Por ejemplo, el código (en sintaxis de C)
x = 4;
y = x + 2;
se reemplazaría, utilizando propagación de constantes ( e incorporación de constantes),
por el código
x = 4;
y = 6;
Determine si su compilador efectuó propagación de constantes.
Haciendo el árbol sintáctico la incorporación de constantes se hace al colapsar el nodo de la
expresión x por su valor constante 4. Pero no hay una operación adicional para x más que la
asignación de una constante.
Si x = 4; y y = x+2;
El código intermedio se reduce a x = 4; y=6;
Se incorpora la constante en y = x+2; y = 4+2;
Y se propaga al generar una nueva constante a partir de otra en y =6;
4. C. Proporcione tantas razones como pueda de por qué la propagación de constantes es más
difícil que la incorporación de constantes.
En la incorporación de constantes solo se reemplaza un espacio referenciado en memoria por su
valor constante. Lo que equivale a colapsar el nodo donde está la expresión de asignación.
Pero en la propagación de constantes, se conllevan más pasos, esto equivaldría a realizar más
operaciones colapsando todo en un subárbol. .
La propagación de constantes ocupa entonces el uso de variables temporales para alojar el
resultado intermedio de las operaciones en estos subárboles.
Es más complicado que la incorporación de constantes pues en la primera hacemos más rápida la
ejecución pero la segunda busca eliminar operaciones redundantes o innecesarias.
Sentencia de asignación
Identificador
y
Expresión aditiva
2
Sentencia de
asignación
x 4
4
6
Colapsa el
nodo por
incorporación
de constante
Colapsa nodo
por
propagación
de constantes
Sentencia de asignación
y
6
Código
intermedio
5. d. Una situación relacionada con la propagación de constantes y la incorporación de constantes
es el uso de las constantes nombradas en un programa. Utilizando una constante nombrada x en
vez de una variable podemos traducir el ejemplo anterior como el siguiente código en C;
const int x = 4;
…
y= x + 2;
…
Determine si su compilador realiza propagación/incorporación bajo estas circunstancias.
¿En que difiere esto del inciso b?
No hace la propagación de constantes. Se salta la incorporación de constantes en
Const int x = 4;
Pero haría la incorporación de constantes en y = x + 2;
Dando como código intermedio
Const int x = 4; y =6;