Professional Documents
Culture Documents
FACULTAD
DE
INGENIERA
DE
Monografa que como parte de la asignatura de Lenguaje de Compiladores presentan los alumnos: CERQUIN DAZ, JEAN CARLOS FLORES ROMERO, JOS EDUARDO PAMPA VARA, ELVIS ROMERO VARGAS, BRYAN ANDERSON
GENERACIN
DE
CDIGO
INTERMEDIO
OPTIMIZACIN
JULIO, 2011
F a c u l t a d d e I n f o r m t i c a
I n g e n i e r a
I n g e n i e r a
P g i n a
GENERACIN
DE
CDIGO
INTERMEDIO
OPTIMIZACIN
Resumen
En esta monografa veremos como traducir las construcciones de los lenguajes de programacin como: las declaraciones, asignaciones y proposiciones de flujo de control a una representacin intermedia. La mayor parte de las traducciones de estas proposiciones se pueden implantar durante el anlisis sintctico utilizando las tcnicas de traduccin vistas en el diseo de esquemas de traduccin dirigido por sintaxis (ETDS).
F a c u l t a d d e I n f o r m t i c a
I n g e n i e r a
I n g e n i e r a
P g i n a
GENERACIN
DE
CDIGO
INTERMEDIO
OPTIMIZACIN
NDICE
INTRODUCCIN.........................................................................................................................................5 1. TIPOS DE REPRESENTACIONES INTERMEDIAS: CDIGO DE 3-DIRECCIONES.......................6 2. CDIGO INTERMEDIO COMO UN ATRIBUTO SINTETIZADO........................................................8 3. GENERACIN DE CDIGO PARA EXPRESIONES Y SENTENCIAS DE CONTROL ..................11 4. OPTIMIZACIN DE CDIGO...................................................................................................................11 CONCLUSIONES.............................................................................................................................................20 5. BIBLIOGRAFA............................................................................................................................................21 5.1. REFERENCIAS BIBLIOGRFICAS.........................................................................................................................21 5.2. REFERENCIAS ELECTRNICAS...........................................................................................................................21
F a c u l t a d d e I n f o r m t i c a
I n g e n i e r a
I n g e n i e r a
P g i n a
GENERACIN
DE
CDIGO
INTERMEDIO
OPTIMIZACIN
Introduccin
El proceso de compilacin se compone de dos partes: La parte que depende solo del lenguaje fuente (etapa inicial o frontend): Corresponde con la parte del anlisis (lxico, sintctico y semntico). La parte que depende solo del lenguaje objeto (etapa inicial o backend): Corresponde con la parte de sntesis (generacin de cdigo). En la parte inicial se traduce un programa fuente a una representacin intermedia a partir de la cual la etapa final genera un cdigo objeto. De tal manera que los detalles que tienen que ver con las caractersticas del lenguaje objeto (cdigo ensamblador, cdigo mquina, etc.), la arquitectura de la maquina (nmero de registros, tamao de los tipos de datos, memoria cache, etc.) el entorno de ejecucin (estructura de registros y memoria de la maquina) y el sistema operativo se engloban en la etapa final y se aslan del resto. La generacin de cdigo es la tarea ms complicada de un compilador. Las ventajas de utilizar esta representacin intermedia, independiente de la maquina son: - Se puede crear un compilador para una nueva mquina distinta uniendo la etapa final de la nueva mquina a una etapa inicial ya existente, facilitando la re destinacin. - Se puede aplicar, a la representacin intermedia, un optimizador de cdigo independiente de la mquina. En el siguiente grafico se muestran las dos etapas y como se relacionan entre s a travs de la representacin intermedia.
F a c u l t a d d e I n f o r m t i c a
I n g e n i e r a
I n g e n i e r a
P g i n a
GENERACIN
DE
CDIGO
INTERMEDIO
OPTIMIZACIN
1.
F a c u l t a d d e I n f o r m t i c a
I n g e n i e r a
I n g e n i e r a
P g i n a
GENERACIN
DE
CDIGO
INTERMEDIO
OPTIMIZACIN
F a c u l t a d d e I n f o r m t i c a
I n g e n i e r a
I n g e n i e r a
P g i n a
GENERACIN
DE
CDIGO
INTERMEDIO
OPTIMIZACIN
como
un
atributo
El cdigo intermedio puede ser considerado como un atributo sintetizado. El cdigo intermedio es visto como una cadena de caracteres y se puede disear un esquema de traduccin dirigido por la sintaxis (ETDS) que genere dicho cdigo al recorrer el rbol de anlisis sintctico en orden postfijo. Consideremos como ejemplo la siguiente gramtica simplificada que genera expresiones aritmticas. Dada la expresin E E1 +E2 se calcula el valor del no-terminal E en un nombre temporal t. Por el momento, se crea un nuevo nombre cada vez que se necesita. Ms tarde veremos un sencillo mtodo para reutilizar los nombres temporales. Cada no-terminal tiene dos atributos: E.lugar, nombre temporal que contendr el valor de E, (t1; t2; : : :). E.cod, serie de todas las proposiciones de cdigo de 3-direcciones que calculan E.
F a c u l t a d d e I n f o r m t i c a
I n g e n i e r a
I n g e n i e r a
P g i n a
GENERACIN
DE
CDIGO
INTERMEDIO
OPTIMIZACIN
Ambos atributos son sintetizados. La funcin nuevotemp() genera nombres distintos t1, t2, ... cada vez que es llamada. Las llaves indican una instruccin de cdigo de 3-direcciones. El smbolo // representa la concatenacin de los trozos de cdigo.
ETDS para expresiones aritmticas Veamos el ejemplo x = x + 3 + 4. La figura muestra el rbol sintctico. El cdigo de 3-direcciones correspondiente es:
t1 = x + 3 t2 = t1 + 4 x = t2
F a c u l t a d d e I n f o r m t i c a
I n g e n i e r a
I n g e n i e r a
P g i n a
GENERACIN
DE
CDIGO
INTERMEDIO
OPTIMIZACIN
F a c u l t a d d e I n f o r m t i c a
I n g e n i e r a
I n g e n i e r a
P g i n a 1 0
GENERACIN
DE
CDIGO
INTERMEDIO
OPTIMIZACIN
NOTA: este mtodo no es aplicable para temporales que se utilizan ms de una vez. Por ejemplo, al evaluar una expresin en una proposicin condicional. A estos valores hay que asignarles nombres temporales creados con un nombre propio.
3.
4.
Optimizacin de cdigo
La optimizacin de cdigo intermedio se puede realizar a: a) Nivel Local: Solo se utiliza la informacin de un bloque bsico para realizar la optimizacin.
b) Nivel Global: Usan informacin de varios bloques bsicos. El termino optimizacin de cdigo es inadecuado ya que no se garantiza el obtener, en sentido matemtico, el mejor cdigo posible atendiendo a maximizar o minimizar una funcin objetivo (tiempo de ejecucin y espacio). El trmino de mejora de cdigo sera el ms apropiado que el de optimizacin. Ahora bien nos enfocaremos bsicamente en la optimizacin de cdigo de tres direcciones, pues son siempre transportables en la etapa final, son optimizaciones independientes de la mquina, por otro lado las optimizaciones a nivel de mquina, como la asignacin de registros y la utilizacin de instrucciones especficas de la mquina, se salen del contexto de este tema. La mayora de los programas emplean el 90 % del tiempo de ejecucin en el 10 % de su cdigo, es por eso que se recomienda identificar las partes de los programas que se ejecutan eficientemente, en la prctica son los lazos internos los mejores candidatos para realizar dichas transformaciones. Adems de la optimizacin a nivel de cdigo intermedio, se puede reducir el tiempo de ejecucin de un programa actuando a otros niveles: A nivel de cdigo fuente y a nivel de cdigo objeto.
F a c u l t a d d e I n f o r m t i c a
I n g e n i e r a
I n g e n i e r a
P g i n a 1 1
GENERACIN
DE
CDIGO
INTERMEDIO
OPTIMIZACIN
Un bloque bsico es una unidad fundamental de cdigo. Es una secuencia de proposiciones donde el flujo de control entra en el principio del bloque y sale al final del bloque. Los bloques bsicos pueden recibir el control desde mas de un punto de programa (Se puede llegar desde varios sitios a una etiqueta) y el control puede salir desde mas de una proposicin (se podra ir a una etiqueta o seguir con la siguiente instruccin. Cuando aplicamos optimizacin dentro de un bloque bsico, solo nos tenemos que preocupar sobre los efectos de optimizacin en los valores de las variables a la entrada del bloque y los valores que tienen a la salida del bloque, que han de ser los mismos que en el cdigo original sin transformar. El algoritmo para particionar un programa se describe a continuacin: 1 Encontrar todas las proposiciones que comienzan el principio de un bloque Bsico: La primera sentencia del programa. Cualquier proposicin del programa que es el objetivo de un salto. Cualquier proposicin que sigue a una bifurcacin. 2 Para cualquier proposicin que comienza un bloque bsico, el bloque Consiste de esa proposicin y de todas las siguientes hasta el principio del siguiente bloque o el final del programa. El flujo de control de un programa puede visualizarse como un grafo dirigido de bloques bsicos, al cual se le llama grafo de flujo. Como ejemplo consideraremos este trozo de cdigo escrito en pseudocdigo que suma los diez primeros nmeros que se muestra en la tabla (a).
F a c u l t a d d e I n f o r m t i c a
I n g e n i e r a
I n g e n i e r a
P g i n a 1 2
GENERACIN
DE
CDIGO
INTERMEDIO
OPTIMIZACIN
Algunas definiciones previas: Dada una proposicin de 3-direcciones de la forma a = b op c decimos que la proposicin referencia b y c y que define a. Se dice que un nombre en un bloque bsico vive al final del bloque si su valor es referenciado en otro bloque bsico en el programa. Se dice que un nombre est muerto si no es referenciado en el resto del programa. Se presentan algunas transformaciones ms tiles para mejorar el cdigo, las cuales son locales, y se pueden realizar observando solo las proposiciones de un bloque bsico.
F a c u l t a d d e I n f o r m t i c a
I n g e n i e r a
I n g e n i e r a
P g i n a 1 3
GENERACIN
DE
CDIGO
INTERMEDIO
OPTIMIZACIN
Observamos (a) que la expresin t3* t1 se calcula 2 veces, por lo tanto podemos escribir el cdigo de la figura (b). Esto solo es posible si los operandos que estn implicados en el clculo de la expresin no han modificado su valor en el intermedio.
Propagacin de Copias:
La propagacin de copias considera las proposiciones de la forma a = b. Despus de esta sentencia sabemos que a y b tienen el mismo valor, por tanto, podemos remplazar cada vez que aparezca a por b, con la esperanza de que podamos remplazar todas las ocurrencias de a hasta que se convierta en un nombre muerto y se pueda entonces eliminar la proposicin de copia. A partir del cdigo anterior podemos eliminar la proposicin de copia t6 = t4. Sustituimos t6 por t4 (vase la figura (a)). Ahora se aprecia de nuevo que hay una subexpresion comn que puede ser eliminada, obteniendo el cdigo que se muestra en la figura (b) y finalmente realizando otra vez la propagacin de copias obtenemos (c).
F a c u l t a d d e I n f o r m t i c a
I n g e n i e r a
I n g e n i e r a
P g i n a 1 4
GENERACIN
DE
CDIGO
INTERMEDIO
OPTIMIZACIN
Vemos que despus de haber hecho una optimizacin es posible dar paso a aplicar nuevas optimizaciones.
Transformaciones Aritmticas:
Se pueden hacer uso de transformaciones algebraicas simples para reducir la cantidad de computacin transformando operaciones mas costosas por otras menos costosas. Existen tres tipos de transformaciones algebraicas bsicas:
P g i n a 1 5
GENERACIN
DE
CDIGO
INTERMEDIO
OPTIMIZACIN
optimizacin se le llama calculo previo de constantes (Ing. constant folding). El cdigo de la figura 7.9 puede ser mejorado, dando cabida a la figura 7.10 (a). Haciendo una propagacin de copias y eliminacin de cdigo muerto, tenemos el cdigo de la figura 7.10 (b). Realizando de nuevo un calculo previo de constantes obtenemos 7.10 (c). Y finalmente podemos hacer de nuevo la propagacin de copias y la eliminacin de cdigo muerto para obtener el cdigo de la figura 7.10 (d).
Transformaciones Algebraicas:
Podemos hacer uso de las identidades algebraicas para simplificar el cdigo. Las principales identidades son:
Partiendo de la figura 7.10 (d) podemos obtener el cdigo de la figura 7.11 (a). De nuevo si usamos propagacin de copias y eliminacin de cdigo muerto, obtenemos el cdigo de la figura 7.11 (b).
Reduccin de Intensidad:
En la mayora de las maquinas las operaciones de multiplicacin y divisin, son substancialmente mas costosas que las operaciones de suma y resta, y a su vez las potencias son mas costosas que las multiplicaciones y divisiones, por tanto siempre que sea posible se debe sustituir un operador mas costoso por uno menos
F a c u l t a d d e I n f o r m t i c a I n g e n i e r a I n g e n i e r a
P g i n a 1 6
GENERACIN
DE
CDIGO
INTERMEDIO
OPTIMIZACIN
costoso. A esto se le conoce como reduccin de intensidad, las identidades mas comunes son:
Otra transformacin tpica es usar desplazamiento de bits cuando se divide o multiplica por potencias de 2
Comparando este cdigo con el original que tenia ocho preposiciones, siete temporales, dos adiciones, una substraccin, cuatro multiplicaciones y una divisin, lo hemos reducido a tres preposiciones que implican dos adiciones y una multiplicacin.
F a c u l t a d d e I n f o r m t i c a
I n g e n i e r a
I n g e n i e r a
P g i n a 1 7
GENERACIN
DE
CDIGO
INTERMEDIO
OPTIMIZACIN
Variables de induccin:
Se trata de identificar las variables que permanecen ligadas entre si en la ejecucin, estn relacionadas entre si de forma que conocido el valor de una, se puede obtener la otra. Supongamos el siguiente fragmento de cdigo donde se ha supuesto que los elementos de la matriz ocupan 4 bytes y ya se ha realizado cierta optimizacin.
En este fragmento se aprecia que a [2] en la tabla (b), significa la direccin de a mas un desplazamiento t2. Sabemos que t2 no cambia en ningn momento salvo en t4 = 4*j, por tanto justo despus de la proposicin j = j + 1 se cumple que t2 = 4 * j + 4, y se puede sustituir la asignacin t2 = 4 * j por t2 = t2 + 4, debiendo inicializar el valor de t2 = 0.
F a c u l t a d d e I n f o r m t i c a I n g e n i e r a I n g e n i e r a
P g i n a 1 8
GENERACIN
DE
CDIGO
INTERMEDIO
OPTIMIZACIN
Siempre que haya variables de induccin se pueden hacer sustituciones de este tipo y eliminar todos menos una.
F a c u l t a d d e I n f o r m t i c a
I n g e n i e r a
I n g e n i e r a
P g i n a 1 9
GENERACIN
DE
CDIGO
INTERMEDIO
OPTIMIZACIN
Conclusiones
El objetivo del cdigo intermedio es reducir el nmero de programas necesarios para construir traductores, y permitir ms fcilmente la transportabilidad de unas mquinas a otras. Los compiladores generan un cdigo intermedio que es ms parecido al cdigo ensamblador, las operaciones por ejemplo nunca se hacen con ms de dos operandos. El cdigo intermedio es un cdigo abstracto independiente de la mquina para la que se genera el cdigo objeto. Ha de cumplir dos requisitos importantes: ser fcil de producir a partir del anlisis sintctico, y ser fcil de traducir al lenguaje objeto. Hay muchas variaciones en la cantidad de optimizacin de cdigo que ejecutan los distintos compiladores. En lo que hacen mucha optimizacin llamados Compiladores optimizadores , una parte significativa del tiempo del compilador se ocupa en esta fase. Las limitaciones de memoria son un problema mucho menor, y es posible requerir que una unidad de compilacin entera se mantenga en memoria, en especial si se dispone de la compilacin por separado en el lenguaje.
F a c u l t a d d e I n f o r m t i c a
I n g e n i e r a
I n g e n i e r a
P g i n a 2 0
GENERACIN
DE
CDIGO
INTERMEDIO
OPTIMIZACIN
5.
Bibliografa
principios, tcnicas y herramientas, Tema 8, 9, 10 (pag. 478666). Practice, Tema 8, paginas: 398-481. Cdigo Intermedio. Pginas 39-45
F a c u l t a d d e I n f o r m t i c a
I n g e n i e r a
I n g e n i e r a
P g i n a 2 1