CaFco - PS II - EJ-04 UNIDAD III GENERACION DE CODIGO CUADRUPLOS NOTACION POLACA OPTIMIZACION DE...
-
Upload
prudencia-blas -
Category
Documents
-
view
6 -
download
0
Transcript of CaFco - PS II - EJ-04 UNIDAD III GENERACION DE CODIGO CUADRUPLOS NOTACION POLACA OPTIMIZACION DE...
CaFco - PS II - EJ-04
UNIDAD III
GENERACION DE CODIGO
CUADRUPLOS
NOTACION POLACA
OPTIMIZACION DE CODIGO
CaFco - PS II - EJ-04
Generación de Código Intermedio
Lenguajes Intermedios
Representaciones Gráficas
Código de tres Direcciones
CaFco - PS II - EJ-04
Generación de Código Intermedio
Analizador Léxico
Analizador sintáctico
Analizador Semántico
Gen. De Cod. Inter
Optimador de Codigo
Gen. de Codigo
Manejador de ErroresAdmor. Tabla Simbolos
Análisis
Síntesis
CaFco - PS II - EJ-04
Representaciones grafícas
a) Notación postfija: es la forma para representaciones intermedias.
b) árboles sintácticos: describe la estructura jerárquica natural de una expresión dada.
c) GDA: grafo dirigido aciclico, proporciona la misma información que el árbol sintáctico, pero de una forma mas compacta, ya que se identifican las subexpresiones (expresiones calculadas mas de una vez) dentro de un bloque.
CaFco - PS II - EJ-04
Ejemplo:Expresión a:= b*-c + b*-c
asigna
a +
**
b minosu b minosu
c c
Postfija:
a b c menosu * b c menosu * + asigna
Árbol Sintácticoc
asigna
a +
*
b minosu
GDA
CaFco - PS II - EJ-04
Generación de Código Intermedio
• El código intermedio es una interpretación de las operaciones que se tienen en un lenguaje generados para una máquina virtual -una máquina inexistente pero con las características que toda computadora posee.
• El código de tres direcciones: que recibe este nombre porque emplea tres entidades o direcciones para reconocer los operandos y el resultado de una operación. Se representa generalmente como:
Resultado Operando1 Operador Operando2
CaFco - PS II - EJ-04
Código de tres direcciones
El código de tres direcciones es como el lenguaje ensamblador
Ya que consiste en una secuencia de instrucciones donde cada una tiene como máximo 3 operándoos.
Propiedades:
a) Cada instrucción tiene a lo sumo un operador, además de la asignación. (el compilador decide la prioridad del operador)
b) El compilador debe generar un nombre temporal para guardar los valores calculados.
c) Aparte de calcular expresiones también pueden manejar construcciones de flujo de control y llamadas a procedimientos
CaFco - PS II - EJ-04
Ejemplo: a:=b*-c+b*-c
t1::= - c
t2::= b * t1
t3:= - c
t4::= b * t3
t5::= t2 + t4
a := t5
asigna
a +
**
b minosu b minosu
c c
CaFco - PS II - EJ-04
Ejemplo: a:=b*-c+b*-c
t1::= - c
t2::= b * t1
t3:= t2 + t2
a := t3
asigna
a +
*
b minosu
c
CaFco - PS II - EJ-04
La optimización de código no es un problema fácil, y depende de cual sea el nivel deseado de optimización.
Toda optimización conlleva la transformación de un código en otro más eficiente.
La optimización de código puede realizarse durante la propia generación o como paso adicional, ya sea intercalado entre el análisis semántico y la generación de código (se optimizan las cuádruplas) o situado después de ésta (se optimiza a posteriori el código generado).
OPTIMIZACION DE CODIGO
CaFco - PS II - EJ-04
Requisitos que debe cumplir toda optimización. Mantener el significado en la transformación de optimización. Ser mesurable la optimización obtenida mediante la transformación. El esfuerzo de transformar para optimizar debe compensar con la optimización conseguida.
¿Cómo se puede mejorar el rendimiento?.Analizando los Flujos de Control.
Analizando los Flujos de Datos.
Tipos de optimizaciones. Peephole. Independiente de la Máquina. Dependiente de la máquina.
Optimización de Código
CaFco - PS II - EJ-04
Optimización Peephole
Consiste en obtener un lenguaje
transformado con un número menor de
instrucciones.
CaFco - PS II - EJ-04
Optimización Independiente de la Máquina
REDUCCIÓN SIMPLE: Evaluar expresiones que son conocidos sus
operandos en tiempo de compilación.
REACONDICIONAMIENTO DE LAS INSTRUCCIONES: Reducir el número
de temporales.
ELIMINAR REDUNDANCIAS.
REDUCCIÓN DE POTENCIA: Sustituir operaciones software por
operaciones Hardware.
Ejemplo la potencia de 2, se puede sustituir por desplazamientos.
REDUCIR LA EJECUCIÓN ITERATIVA DE BLOQUES INNECESARIOS:
Sacar bloques fuera de los lazos.
CaFco - PS II - EJ-04
Optimización Dependiente de la Máquina
• Reasignar los registros de internos de la máquina
adecuadamente.
• Usar operaciones especiales de la máquina para expresar
operaciones complejas.
• Utilizar los recursos y periféricos de la máquina más
adecuados para cada momento de ejecución.
CaFco - PS II - EJ-04
ORGANIZACIÓN DEL COMPILADOR OPTIMIZADOR
OPTIMIZADOR
DE CÓDIGO
ETAPAS
PREVIAS
ANÁLISIS
DEL FLUJO
DE CONTROL
ANÁLISIS DEL
FLUJO DE
DATOS
GENERADOR DE
CÓDIGO
TRANSFORMACIONES
CaFco - PS II - EJ-04
COMPILADORES OPTIMIZADORES.- Son aquellos compiladores que
aplican transformaciones a los programas para mejorar el código.
ANÁLISIS DEL FLUJO DE CONTROL.- Proceso que identifica los
lazos dentro del grafo de flujo de un programa.
ANÁLISIS DEL FLUJO DE DATOS.- Proceso para recopilar
información sobre el modo en que se utilizan las variables en un
programa. Considera varios algoritmos para recopilar información, y
el impacto de construcciones de lenguaje como los procedimientos y
apuntadores.
TRANSFORMACIONES.- Mejoras que se realizan al código con el fin
de obtener programas en lenguaje objeto eficientes.
ORGANIZACIÓN DEL COMPILADOR OPTIMIZADOR
CaFco - PS II - EJ-04
Instrucciones especiales ("idioms")
Formas para que se de la optimización
Ej: if (x&4 || x&8) ... se puede representar: TEST X,12 JZ L
... L: Reordenación del código
Por ejemplo: sea la expresión a=b/c*d; MOV AX,B XOR DX,DX DIV AX,C MUL AX,D MOV A,AX
Si la reordenamos así: a=b*d/c;, aprovechando que la multiplicación y la división son asociativas, tenemos: MOV AX,B MUL AX,D DIV AX,C MOV A,AX
CaFco - PS II - EJ-04
Ejecución en tiempo de compilación
Eliminación de redundancias
Ejemplo:
int a,b,c,d;
a = a+b*c; (*,b,c,t1) (*,b,c,t1)
(+,a,t1,t2) (+,a,t1,t2)
(=,t2,,a) (=,t2,,a)
d = a+b*c; (*,b,c,t3)
(+,a,t3,t4) (+,a,t1,t4)
(=,t4,,d) (=,t4,,d)
b = a+b*c; (*,b,c,t5)
(+,a,t5,t6)
(=,t6,,b) (=,t4,,b)
Una solución: el programador podría reescribir su programa así: int a,b,c,d,e; e = b*c; (*,b,c,t1) (=,t1,,e) a = a+e; (+,a,e,t2) (=,t2,,a) d = a+e; (+,a,e,t3) (=,t3,,d) b = d; (=,d,,b)
CaFco - PS II - EJ-04
Reordenación de operaciones
Por ejemplo: sea la expresión (a*b)+(c+d).
Sus cuádruplas equivalentes serían:
(*,a,b,t1)
(+,c,d,t2)
(+,t1,t2,t1)
En este caso, utilizamos dos variables auxiliares (t1, t2).
Pero si aprovechamos la asociatividad de la suma para reordenar de esta manera:
(*,a,b,t1)
(+,t1,c,t1)
(+,t1,d,t1)
necesitaremos sólo una variable auxiliar.
Optimización de bucles
Regiones
Asignaciones muertas
CaFco - PS II - EJ-04
Hay varias formas en las que un compilador puede mejorar un programa sin modificar la función que calcula. La eliminación de subexpresiones comunes, la propagación de copias, la eliminación de código inactivo, y el cálculo previo de constantes son ejemplos comunes de dichas transformaciones que preservan la función.
•Subexpresiones comunes.
•Propagación de copias.
•Eliminación de código inactivo.
•Optimizaciones de bucles.
•Traslado de código.
•Variables de inducción y reducción de intensidad.
Transformaciones que preservan la función.
CaFco - PS II - EJ-04
Subexpresiones comunes
Una ocurrencia de una expresión E se denomina subexpresión común si E ha sido previamente calculada y los valores de la variable dentro de E no han cambiado desde el cálculo anterior. Se puede evitar recalcular la expresión si se puede utilizar el valor calculado previamente.
CaFco - PS II - EJ-04
Propagación de copias
Las asignaciones de la forma f:=g llamadas proposiciones de copias, o copias simplemente es otro tipo de transformación que mejora el código, y que varios algoritmos introducen. La idea en que se basa la propagación de copias es utilizar g por f, siempre que sea posible despues de la proposición de copia f:=g.Esto puede no parecer una mejora, pero como se ve, da la oportunidad de eliminar asignaciones.
a:= d+e b:= d+e
c:= d+e
t:= d+ea:= t
t:= d+eb:= t
c:= t
x:= t3
a[t2]:= t5
a[t4]:= t3
goto B2
CaFco - PS II - EJ-04
Eliminación de código inactivo
Una variable esta activa en un punto de un programa si su valor puede ser utilizado posteriormente en caso contrario está inactiva en ese punto. Una idea afín es el código inactivo o inútil, proposiciones que calculan valores que nunca llegan a utilizarse.
Ejemplo:depura:=falseIf (depura) print (“El codigo es correcto”)
Generalmente, deducir en el momento de la compilación que el valor de una expresión es una constante y utilizar la constante en su lugar se conoce como cálculo previo de constantes.
CaFco - PS II - EJ-04
Optimizaciones de lazos
El tiempo de ejecución de un programa puede mejorar si disminuye la cantidad de instrucciones en un lazo interno, incluso si se incrementa la cantidad de código fuera del lazo.Hay 3 técnicas importantes para la optimización de lazos:
El traslado de código.- Esta transformación toma una expresión que produce el mismo resultado independientemente del número de veces que se ejecute un lazo y coloca la expresión antes del lazo.
Eliminación de variables de inducción.- Eliminar aquellos valores que se relacionan o permanecen atados, pues cuando uno se modifica, el otro valor también cambiará.
Reducción de intensidad.- Sustituir un operador más caro po otro más barato. x**2= x*x 2*x= x+x x/2 = x*0.5