Sei sulla pagina 1di 5

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.

 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:

a = b + c * d;

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


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

r1 = c * d;

r2 = b + r1;

r3 = r2 + r1;

a = r3

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:

Op. Arg1 Arg2 Resultado


* c d r1

+ b r1 r2

+ r2 r1 r3

= r3 a

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.

Op Arg1 Arg2

* c d

+ b (0)

+ (1) (0)

= (2)

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.

int a;

float b;

Allocation process:

{offset = 0}

int a;

id.type = int

id.width = 2

offset = offset + id.width

{offset = 2}

float b;
id.type = float

id.width = 4

offset = offset + id.width

{offset = 6}

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


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

enter(name, type, offset)

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


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

Potrebbero piacerti anche