Está en la página 1de 21

Compiladores

Generacin de cdigo

Introduccin
La fase final de nuestro modelo de compilador es el generador de cdigo Toma por entrada una RI del fuente y produce su equivalente en cdigo objeto Las tcnicas que veremos son independientes de si se realiza o no optimizacin

Introduccin
Los requerimientos que, tradicionalmente, se imponen en un generador de cdigo son muy demandantes El cdigo generado debe ser correcto y de alta calidad (debe hacer uso efectivo de los recursos de la mquina objeto) El generador, adems, debe ser eficiente

Introduccin
El problema de generar cdigo ptimo es no decidible
Son problemas NP completos No hay algoritmos polinomiales que resuelvan el problema

En la prctica, se utilizan heursticas que generan cdigo bueno (aunque probablemente no ptimo)

Aspectos generales
Entrada al generador de cdigo (RI) Programas objeto Administracin de memoria Seleccin de instrucciones Adjudicacin de registros Eleccin de orden de evaluacin

Entrada al generador de cdigo


La entrada consiste en la RI del cdigo fuente, producida por el frontend, junto con la informacin de la tabla de smbolos La TS se utiliza para determinar las direcciones en tiempo de ejecucin de los objetos de datos denotados por los nombres en la RI Asumimos que la RI es de suficiente bajo nivel con tipos de datos que se pueden mapear razonablemente a la arquitectura objeto

Entrada al generador de cdigo


Asumimos que el chequeo de tipos ya fue realizado, con la adecuada insercin de operadores de cambio de tipos, y dems Asumimos que no hay errores semnticos obvios (Ej., intentar indizar un arreglo con un punto flotante)

Entrada al generador de cdigo


Esta fase se basa en la asuncin de que la RI no tiene errores (aunque en algunos compiladores, el chequeo se realiza a la vez que la generacin de cdigo)

Cdigo objeto
La salida del generador es el cdigo o programa objeto, el cual puede tomar distintas formas:
cdigo mquina absoluto cdigo mquina reubicable cdigo assembler

Cdigo objeto
Producir cdigo mquina absoluto como salida conlleva la ventaja de que puede ser ubicado en un lugar fijo de memoria y ejecutado inmediatamente Cdigo reubicable (tambin llamado mdulo objeto) permite tener mdulos que se compilan por separado. Luego se unen (linking) y se cargan

Cdigo objeto
En este caso se gana mucha flexibilidad en funcin del trabajo que conlleva la unin y carga. Si la mquina objeto no se hace cargo de la reubicacin, el compilador debe producir informacin explcita para el linker

Cdigo objeto
Finalmente, producir cdigo assembler como salida facilita el proceso de compilacin. Podemos generar instrucciones simblicas y usar las macros de assembler como ayudas. Finalmente, facilita la optimizacin a mano del cdigo generado. El precio es que aparece una etapa final de ensamblado

Administracin de memoria
Consiste en determinar la posicin de memoria en la que los diferentes smbolos del programa almacenan la informacin Depende de la estrategia utilizada para la gestin de memoria, el mecanismo puede variar

Seleccin de instrucciones
La naturaleza del conjunto de instrucciones de la mquina objeto, determina la dificultad de la seleccin de instrucciones La uniformidad y completitud del conjunto de instrucciones son factores muy importantes. Si la mquina objeto no soporta cada tipo de datos de forma uniforme, entonces se necesitan estrategias alternativas

Seleccin de instrucciones
Si no nos interesa la eficiencia, para cada tipo de sentencia en C3D podemos disear un esqueleto de cdigo que muestra el cdigo objeto a generar para esa construccin Ej.: x:=y+z
MOV Y, R0 ADD Z, R0 MOV R0, X

Esto genera cdigo pobre

Seleccin de instrucciones
Por ejemplo:
a := b + c d := a + e

Se traduce a
MOV b, R0 ADD c, R0 MOV R0, a MOV a, RO ADD e, R0 MOV R0, d redundante? redundante?

Seleccin de instrucciones
La calidad del cdigo generado se mide en funcin de
Tamao Velocidad

En funcin de la variedad de instrucciones uno puede seleccionar la instruccin ms performante (ej. INC vs MOV - ADD - MOV). Para los casos no triviales, es un problema muy complejo.

Asignacin de registros
Operar sobre registros es ms rpido y eficiente que operar sobre memoria
Por ello, la adjudicacin eficiente de registros tiene un gran impacto en la performance

Asignacin de registros
El uso de registros puede dividirse en dos subproblemas:
Durante la reserva de registros (allocation), se seleccionan el conjunto de variables que vivir en registros en un punto del programa. Durante la (posterior) asignacin de registros (assignation), se elige el registro especfico para cada variable.

Orden de evaluacin
El orden en que algunas computaciones se llevan a cabo puede afectar la eficiencia del cdigo objeto Algunos ordenes requieren menos registros para almacenar valores intermedios Seleccionar el orden ptimo es tambin NP-completo

Orden de evaluacin
El orden en que algunas computaciones se llevan a cabo puede afectar la eficiencia del cdigo objeto Algunos ordenes requieren menos registros para almacenar valores intermedios Seleccionar el orden ptimo es tambin NP-completo

También podría gustarte