Codigo intermedio

Qué es Código Intermedio?

El código intermedio es un código que puede generar un compilador y que es un punto de acercamiento al código objeto al que se desea llegar. Los códigos intermedios pueden ser  códigos  de  alto  nivel,  nivel  medio  o  bajo  nivel  dependiendo  de  cómo  se  haya diseñado dicho código y a qué código objeto se desea llegar al final. Pero lo que sí debe de cumplir el código intermedio es ser un código de más bajo nivel que el código fuente original. Recordemos que la definición de compilador es un programa que se encarga de transformar un código fuente de alto nivel a otro código objeto de más bajo nivel.

A continuación se describen 3 tipos de códigos intermedios: 

  • Uno de tipo gráfico (Representación gráfica, no implementación gráfica) 
  • Un código estandarizado (Originalmente diseñado por Microsoft) 
  • Un  código  de  máquina  virtual  (De  un  lenguaje  compilado  y  posteriormente interpretado)

Generador de Código Intermedio

Después de los análisis sintáctico y semántico, algunos compiladores generan una representación intermedia explicita del programa fuente.

Se puede considerar esta representación intermedia como un programa para una máquina abstracta. Esta representación intermedia debe tener dos propiedades importantes; debe ser fácil de producir y fácil de traducir al programa objeto.

La representación intermedia puede tener diversas formas. Una forma intermedia es la llamada “código de tres direcciones”, que es como el lenguaje ensamblador para una máquina en la que cada posición de memoria puede actuar como un registro. El código de tres direcciones consiste en una secuencia de instrucciones, cada una de las cuales tiene como máximo tres operandos. El programa fuente de (1.1) puede aparecer en código de tres direcciones como.

Esta representación intermedia tiene varias propiedades. Primera, cada instrucción de tres direcciones tiene a lo sumo un operador, además de la asignación. Por tanto, cuando se generan esas instrucciones, el compilador tiene que decidir el orden en que deben efectuarse las operaciones; la multiplicación precede a la adición en el programa fuente de (1. 1). Segunda, el compilador debe generar un nombre temporal para guardar los valores calculados por cada instrucción. Tercera, algunas instrucciones de ‘tres direcciones” tienen menos de tres operandos, por ejemplo, la primera y la última instrucciones de (1.3).

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.


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.

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. 







Comentarios

Entradas populares