UNIDAD VIII.-Generación de código intermedio.


8.1.- Funciones del generador de código intermedio.

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.





8.2.- Ventajas y desventajas.

Ventajas: dentro de  las ventajas de la generación de código intermedio se encuentran que: permite abstraer la máquina, separar operaciones de alto nivel de su implementación a bajo nivel, permite la reutilización de los front-ends y back-ends;  y permite optimizaciones generales.

Desventajas: implica una pasada más para el compilador (no se puede utilizar el modelo de una pasada), dificulta llevar a cabo optimizaciones específicas de la arquitectura destino; y  suele ser ortogonal a la máquina destino, la traducción a una arquitectura específica será más larga e ineficiente.

8.3.- Tipos de código intermedio.

AST (AbstractSyntaxTrees): forma condensada de árboles de análisis, con sólo nodos semánticos y sin nodos para símbolos terminales (se supone que el programa es sintácticamente correcto).

DAG (DirectedAcyclicGraphs): árboles sintácticos concisos.

TAC (Three-AddressCode): secuencia de instrucciones de la forma: operando, operador, operando,  requieren varias instrucciones y  permite la reorganización de código, manejo de ensamblador, utiliza direcciones de memoria y nemotécnicos, pueden ser instrucciones de 2, 3 o 4 por cada operación. 

No hay comentarios:

Publicar un comentario