Generación de Código Intermedio Ventajas Facilitar la fase de optimización. Aumentar la portabilidad del compilador de una máquina a otra. Facilitar la división en fases del proyecto. Utilizar el mismo analizador en diferentes generadores. Poder optimizar independientemente de la máquina. ¿para qué sirve? 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. Después de los análisis sintáctico y semántico, algunos compiladores generan una representación intermedia explicita del programa fuente. Esta representación intermedia debe tener dos propiedades importantes; debe ser fácil de producir y fácil de traducir al programa objeto. Tipos de representaciones intermedias Propiedades Fácil de producir en el análisis semántico. Fácil de traducir a código máquina real. Instrucciones simples y concisas. Árboles de sintaxis abstracta. Notación Polaca Inversa. Código P. Códigos de tres direcciones. Notación Polaca Inversa Los operadores van después de los operandos. S=A+B*C -> SABC*+= Ventajas. Facilidad de generar código. Es la notación más sencilla para generar código intermedio. Código de Tres Direcciones Sentencias del estilo x = y op z Cada línea de código tiene un operador y hasta tres direcciones Uso generoso de variable temporales Directamente relacionado con evaluación de expresiones Ejemplo: a = b*(c+d): tmp1 = c+d tmp2 = b*tmp1 a = tmp2 Código P Extensión RPN para máquina completa (etiquetas, saltos) Razones históricas. Primer caso de máquina virtual. Similares ventajas e inconvenientes a la Notación Polaca Inversa. Árboles Son árboles de derivación en los que no existe información superflua. Cada nodo hoja representa un operando y cada no-hoja un operador.