Generacion de Codigo
Generacion de Codigo
Generacion de Codigo
Generadores de cdigo
ngel Nmesis Cruz Osorio
6 semestre
Ingeniera en Computacin
Introduccin
El siguiente trabajo es con la intencin de conocer un poco acerca de la ltima fase de un
compilador, que es la generacin de cdigo, este generalmente consiste en cdigo de mquina
relocalizable o cdigo ensamblador.
Contenido
El generador de cdigo toma como entrada una representacin del programa fuente y produce
como salida un programa objeto equivalente.
Aspectos a considerar en el diseo
Algunos detalles dependen de la mquina objeto y del sistema operativo, pero hay aspectos que
estn casi unidos en los problemas de generacin de cdigo, a continuacin solo se vern los mas
genricos.
Entrada al generador
Esta consta de la representacin intermedia del programa fuente producida por la etapa inicial,
junto con informacin de la tabla de smbolos que se utiliza para determinar las direcciones
durante la ejecucin de los objetos de datos denotados por los nombres de la representacin
intermedia.
Antes de la generacin de cdigo se asume que la etapa inicial ya hiso al anlisis lxico, sintctico y
semntico es decir q la entrada no contiene errores, aunque en algunos compiladores la
comprobacin semntica se realiza junto con la generacin de cdigo.
Salida del generador
Al igual que el cdigo intermedio esta salida puede ser en: lenguaje mquina absoluto, lenguaje
mquina relocalizable o lenguaje ensamblador. El lenguaje mquina absoluto tiene la ventaja de
que se puede colocar en una posicin fija de memoria y ejecutarse inmediatamente. Un programa
en lenguaje mquina relocalizable permite que los subprogramas se puedan compilar por
separado, aunque haya que enlazarlo y cargarlo existe mucha flexibilidad al poder compilar por
separado y poder llamar a otros programas q ya fueron compilados. Una salida en un programa
ensamblador facilita el proceso de generacin de cdigo, el precio que se paga es el ensamble
despus de la generacin de cdigo adems es una alternativa razonable para una maquina con
poca memoria.
Administracin de la memoria
El tipo en una declaracin determina el ancho, es decir, la cantidad de memoria necesaria para el
nombre declarado. Segn la informacin de la tabla de smbolos, se puede determinar una
direccin relativa para el nombre dentro de un rea de datos para el procedimiento.
Si se est generando cdigo de mquina, hay que convertir las etiquetas de las proposiciones de
tres direcciones en direcciones de instrucciones.
Seleccin de instrucciones
La naturaleza del conjunto de instrucciones de la mquina objeto determina la dificultad de la
seleccin de instrucciones, es importante que el conjunto de instruccin sea uniforme y completo.
Si no se toma en cuenta le eficiencia del programa objeto, la seleccin de instrucciones es sencilla,
para cada tipo de proposicin de tres direcciones, se puede disear un esqueleto de cdigo que
perfila el cdigo objeto que ha de generarse para esa construccin. Por ejemplo, la secuencia de
proposiciones
a :=b +c
d :=a +e
se podra traducir a
MOV b, R0
ADD c, R0
MOV R0, a
MOV a, R0
ADD e, R0
MOV R0, d
Esta clase de generacin de cdigo, proposicin a proposicin, a menudo produce cdigo de mala
calidad, la cuarta proposicin es redundante y tambin la tercera si a no se utiliza posteriormente.
Una mquina objeto con un conjunto de instrucciones rico puede proporcionar varios modos de
aplicar una determinada operacin, una traduccin ingenua del cdigo intermedio puede conducir
a un cdigo objeto correcto pero inaceptablemente ineficaz. Por ejemplo, si la maquina objeto
tiene una instruccin de incremento(INC), entonces la proposicin de tres direcciones a:=a+1 se
puede implantar ms eficientemente mediante la instruccin INC a, en lugar de
MOV a, R0
ADD #1, R0
MOV R0, a
Asignacin de registros
Las instrucciones que implican operandos en registros son generalmente ms cortas y rpidas que
las de operandos en memoria. El uso de registros se divide a menudo en dos subproblemas:
1. Durante la asignacin de los registros, se selecciona el conjunto de variables que residir
en los registros en un momento del programa.
2. Durante una fase posterior de asignacin de los registros, se escoge el registro especfico
en el que residir una variable.
Es difcil encontrar una asignacin ptima de registros a variables, incluso con valores en un solo
registro. Este problema se complica ms cuando el hardware, el sistema operativo o ambos, en la
mquina objeto pueden exigir que cumplan ciertas convenciones del uso de registros.
Eleccin del orden de evaluacin
El orden en el que se realicen los clculos puede variar la eficiencia del cdigo objeto. Algunos
ordenamientos de los clculos necesitan menos registros que otros para guardar resultados
intermedios.
Grafos de flujo y bloques bsicos
Una representacin de proposiciones de tres direcciones, llamada grafo de flujo, es til para
entender los algoritmos de generacin de cdigo. Los nodos del grafo de flujo representan
clculos y las aristas representan el flujo de control, algunos algoritmos de asignacin de registros
utilizan grafos de flujo para encontrar los lazos internos donde se supone que un programa
emplea la mayor parte de su tiempo.
Bloques bsicos
Es una secuencia de preposiciones consecutivas en las que el flujo de control entra al principio y
sale al final sin detenerse y sin posibilidad de saltar excepto al final. Un bloque bsico calcula un
conjunto de instrucciones, se dice que dos bloques bsicos son equivalentes si calculan el mismo
conjunto de expresiones. Se pueden aplicar varias transformaciones a un bloque bsico sin
modificar el conjunto de expresiones calculadas por el bloque. Muchas de estas transformaciones
son tiles para mejorar la calidad del cdigo que finalmente ser generado a partir de un bloque
bsico. Hay dos clases importantes de transformaciones locales que se pueden aplicar a los
bloques bsicos; las transformaciones que preservan la estructura y las transformaciones
algebraicas.
Las principales transformaciones que preservan la estructura en bloques bsicos son:
1. Eliminacin de subexpresiones comunes
2. Eliminacin de cdigo inactivo
3. Renombramiento de variables temporales
4. Intercambio de dos proposiciones adyacentes independientes
Grafos de flujo
Se puede aadir la informacin sobre el flujo de control al conjunto de bloques bsicos que
componen un programa, construyendo un grafo dirigido llamado grafo de flujo. Los nodos del
grafo de flujo son los bloques bsicos. Un nodo se distingue como inicial cuando el bloque cuyo
lder es la primera proposicin. Hay una arista dirigida del bloque B1 al bloque B2 si B2 puede ir
inmediatamente despus de B1 en una secuencia de ejecucin, es decir si
1. Hay un salto condicional o incondicional desde la ltima proposicin de B1 a la primera
proposicin de B2, o
2. B2 sigue inmediatamente a B1 en el orden del programa, y B1 no termina con un salto
incondicional.
Se dice que B1 es un predecesor de B2, y que B2 es un sucesor de B1.
Conclusin
El tema de generacin de cdigo es bastante amplio pero a su vez algo difcil de comprender, y
creo que de implementarlo es aun mas difcil, hay que tener un poco de respeto a las personas
que se dedican a desarrollar este tipo de trabajos.
Bibliografa
Compiladores. Principios, tcnicas y herramientas