Codigo Intermedio
Enviado por alan9110 • 29 de Agosto de 2014 • 1.113 Palabras (5 Páginas) • 372 Visitas
GENERADOR DE CODIGO INTERMEDIO
Esta fase del compilador no es en realidad una parte separada del compilador, la mayoría de los compiladores generan código como parte del proceso de análisis sintáctico, esto es debido a que requieren del árbol de sintaxis y si este no va a ser construido físicamente, entonces deberá acompañar al analizador sintáctico al barrer el árbol implícito. En lugar de generar código ensamblador directamente, los compiladores generan un código intermedio que es más parecido al código ensamblador, las operaciones por ejemplo nunca se hacen con más de dos operandos. Al no generarse código ensamblador el cual es dependiente de la computadora especifica, sino código intermedio, se puede reutilizar la parte del compilador que genera código intermedio en otro compilador para una computadora con diferente procesador cambiando solamente el generador de código ensamblador al cual llamamos back-end, la desventaja obviamente es la lentitud que esto conlleva.
La tarea de síntesis suele comenzar generando un código intermedio. El código
intermedio no es el lenguaje de programación de ninguna máquina real, sino que corresponde a una máquina abstracta, que se debe de definir lo más general posible, de forma que sea posible traducir este código intermedio a cualquier máquina real.
El objetivo del código intermedio es reducir el número de programas necesarios para construir traductores, y permitir más fácilmente la transportabilidad de unas máquinas a otras. Supóngase que se tienen n lenguajes, y se desea construir traductores entre ellos. Sería necesario construir n*(n-1) traductores.
Sin embargo si se construye un lenguaje intermedio, tan sólo son necesarios 2*n traductores.
Así por ejemplo un fabricante de compiladores puede construir un compilador para diferentes máquinas objeto con tan sólo cambiar las dos últimas fases de la tarea de síntesis.
Las máquinas abstractas deben definirse completamente: por una parte se definirá su arquitectura y por otra su repertorio de instrucciones. Habitualmente las arquitecturas típicas de máquinas abstractas son: Máquinas basadas en pila, basadas en registros, combinación de pilas y registros, orientadas a objetos. También se pueden clasificar desde el punto de vista de la cantidad y complejidad de sus instrucciones en máquinas CISC (Complex Instruction Set Computer)y RISC (Reduced Instruction Set Computer).
La forma de las instrucciones del código intermedio puede variar según sea el diseño de la máquina abstracta. Por ejemplo la expresión:
(A+B)*(C+D)
Puede traducirse al siguiente conjunto de cuartetos:
(+, A, B, T1)
(+, C, D, T2)
(*, T1, T2, T3)
Donde ( + , A , B , T1 ) se interpreta como suma A y B y coloca el resultado temporalmente en T1. El resto de los cuartetos se interpretan de forma similar. T1, T2, y T3 pueden ser registros de la máquina o posiciones de memoria temporales. Otra forma de notación es la llamada notación polaca inversa (Reverse Polish Notation o RPN).
Así la expresión anterior(+, A, B, T1) en notación polaca inversa es:
AB + CD + *
Código intermedio o código objetivo como un atributo sintetizado
La generación de código intermedio (o generación de código objetivo directa sin código intermedio) se puede ver como un cálculo de atributo similar a muchos de los problemas de atributo estudiados en el capítulo 6. En realidad, si el código generado se ve como un atributo de cadena (con instrucciones separadas por caracteres de retorno de línea), entonces este código se convierte en un atributo sintetizado que se puede definir utilizando una gramática con atributos, y generado directamente durante el análisis
...