Está en la página 1de 5

MATERIAL DE APOYO DE LA SEMANA 3

Docente: Ing. Alexi L. Ruiz


Materia: Compiladores II

Generación de Código Intermedio


El código fuente puede ser traducido en su código de la máquina destino,
entonces, ¿por qué hemos de traducir el código fuente en un código intermedio
que luego se traduce en su código de destino? Vamos a ver las razones por las
que necesitamos un código intermedio.

Código Intermedio

Código Fuente Código de Destino

 Si un compilador traduce el idioma de origen a su ordenador de destino


sin tener la opción de generar código intermedio, a continuación, en
cada nueva máquina, una nativa del compilador completo es necesario.

 Código Intermedio elimina la necesidad de un nuevo compilador


completo para cada máquina de la sección de análisis mismo de todos
los compiladores.

 La segunda parte del compilador, síntesis, se modifica de acuerdo a la


máquina de destino.
 Es más fácil de aplicar las modificaciones del código fuente para
mejorar rendimiento del código mediante la aplicación de técnicas de
optimización código el código intermedio.

Representación Intermedia

Códigos intermedios puede ser representado en una variedad de formas y


tienen sus propios beneficios.

 Alto nivel IR - Alto nivel de representación de código intermedio está


muy cerca de la lengua de origen. Pueden ser fácilmente generados
desde el código fuente y podemos aplicar fácilmente modificaciones de
código para mejorar el rendimiento. Pero para optimización de la
máquina destino, es menos preferido.

 Bajo Nivel IR - Este es cerca de la máquina de destino, lo que lo hace


adecuado para registro y asignación de memoria, un conjunto de
instrucciones selección, etc. es bueno para optimizaciones
dependientes de la máquina.

Código intermedio puede ser específica para cada idioma (p. ej., código de
bytes de Java) o independiente de la lengua (tres-código de dirección).
Código Three-Address

Generador de código intermedio recibe la entrada de su predecesor,


analizador semántico, en la forma de un árbol de sintaxis anotado. Árbol de
sintaxis que luego se puede convertir en una representación lineal, por
ejemplo, postfix notación. Código intermedio tiende a ser código independiente
de la máquina. Por lo tanto, generador de código supone que tiene número
ilimitado de almacenamiento en memoria (registro) para generar el código.

Por ejemplo:

El generador de código intermedio, tratar de dividir esta expresión en sub-


expresiones y, a continuación, generar el código correspondiente.

R que se utilizan como registros en el programa de destino.

Un código de dirección tiene un máximo de tres direcciones para calcular la


expresión. Un código de dirección puede estar representado en dos formas :
cuádruples y triples.

Cuadruplica
Cada instrucción cuadruplica exposición se divide en cuatro campos: operador,
arg1, arg2, y resultado. El ejemplo anterior se representa a continuación
cuadruplica en formato:
Triples
Cada instrucción en triples presentación tiene tres campos: op, arg1, arg2.Los
resultados de las respectivas sub-expresiones son indicados por la posición de
expresión. Similitud con Triples representan DAG y árbol de sintaxis. Son
equivalentes a DAG al tiempo que representan las expresiones.

Triples ante el problema de optimización código un inmovilismo mientras que,


en la medida en que los resultados son posicionales y cambiar el orden o la
posición de una expresión puede causar problemas.

Indirectos Triples
Esta representación es una mejora sobre representación triples. Se usa
punteros en lugar de su posición para almacenar los resultados. Esto permite a
los optimizadores libremente volver a colocar la sub-expresión para producir un
código optimizado.

Declaraciones

Una variable o procedimiento tiene que ser declarado antes de que se pueda
utilizar. Declaración implica asignación de espacio en la memoria y la entrada
de tipo y nombre de la tabla de símbolos. Un programa puede ser codificada y
diseñado siguiendo la estructura de la máquina destino en mente, pero es
posible que no siempre se pueda convertir con precisión un código fuente para
su idioma de destino.

Tomando el conjunto del programa, como una colección de procedimientos y


sub-procedimientos, es posible declarar que todos los nombres locales en el
procedimiento. Asignación de memoria se realiza de manera consecutiva y
nombres son asignados a la memoria en la secuencia en la que se declara en
el programa. Podemos utilizar el desplazamiento variable y ponerlo a cero
{offset = 0} que denotan la dirección base.

La fuente lenguaje de programación y la arquitectura del equipo de destino


puede variar en la forma los nombres se almacenan, por lo tanto, se utiliza
direccionamiento relativo. Mientras que el primer nombre se asigna memoria a
partir de la posición de memoria 0 {offset= 0}, el siguiente nombre declaró
después, debe ser asignada la memoria junto a la primera.

Ejemplo:

Tomamos el ejemplo de lenguaje de programación C en una variable de tipo


entero se le asigna 2 bytes de memoria y una variable de tipo float se asigna 4
bytes de memoria.

Para entrar en este detalle en una tabla de símbolos, un


procedimientoentrar puede ser utilizado. Este método puede tener la siguiente
estructura:

Este procedimiento debe crear una entrada en la tabla de símbolos, de nombre


de la variable, en su tipo y el tipo de desplazamiento de dirección relativa en su
área de datos.

También podría gustarte