Vous êtes sur la page 1sur 5

Tipos y Representaciones del Cdigo Intermedio.

Existen muchas formas de cdigo intermedio, de hecho, el diseador del compilador puede definir la mquina abstracta que considere mas adecuada al lenguaje fuente o a la clase de mquinas a las que va destinado. Las representaciones que ms se emplean son:

rboles semnticos y grafos acclicos dirigidos Cdigo de tres direcciones. Cuartetos, Tercetos o Tercetos indirectos.

Existen algunas mquinas abstractas o lenguajes intermedios ya clsicos en generacin de cdigo que se han definido para la compilacin de lenguajes concretos, como el cdigo P, que se utiliza en la compilacin de Pascal, o la mquina de Warren para la compilacin del lenguaje Prolog.

rboles semnticos y grafos acclicos dirigidos


Una forma de representar el cdigo generado por un compilador es mediante una estructura de tipos arborescente, a la que se denomina rbol semntico a fin de diferenciarlo del rbol sintctico o rbol del anlisis sintctico que representa la estructura gramatical. As, por ejemplo, para la representacin de la sentencia: a:=b*-c+b*-c, se tiene:

En el rbol semntico los nodos son ocupados por operadores y sus operandos se obtienen evaluando las operaciones de sus nodos descendientes. Pueden usarse grafos acclicos dirigidos (DAG) para obtener una representacin condensada de los rboles semnticos. Cuando se encuentran subestructuras idnticas dentro de un mismo rbol basta usar mltiples referencias a la misma subestructura, sin necesidad de duplicar la subestructura repetida. Esta representacin consigue por si misma una mejora considerable en el tamao y la eficiencia del cdigo generado.

Cdigo de tres direcciones


La representacin mediante cdigo de tres direcciones se basa en un conjunto de instrucciones capaces de manejar un mximo de tres direcciones de memoria. En general dos de estas direcciones corresponden a los argumentos y la tercera al resultado. Una instruccin de tres direcciones por ejemplo puede consistir en sumar el contenido de dos direcciones y situar el resultado en una tercera direccin, o saltar a una determinada direccin si el valor contenido en una direccin es mayor que el contenido en otra, etc. instruccin +:= if.>.goto arg1 x a arg2 y b resultado z L

Fig 2. Ejemplos de cdigo de tres direcciones Usando un adecuado conjunto de instrucciones de este tipo, cualquier sentencia o conjunto de sentencias del cdigo fuente, puede traducirse por una secuencia de instrucciones de tres direcciones. Por ejemplo, la sentencia a:=b*(c+d) puede traducirse como la secuencia de instrucciones de tres direcciones: (100) (101) instr. +:= *:= arg1 c b arg2 d t1 rest. t1 a

En donde las letras minsculas representan las direcciones de memoria asociadas a cada una de las variables del programa, y t1 representa una direccin de memoria temporal (auxiliar) que permite realizar los clculos. Para mayor comodidad se escribe el cdigo auxiliar con la notacin infija: (100) (101) t1 := a := c b + d * t1

Esta representacin es equivalente a la representacin mediante rbol semntico o mediante grafo acclico dirigido que se ha visto anteriormente, siempre que se limite la ramificacin del rbol a un mximo de dos descendientes. Para obtener la

representacin en cdigo de tres direcciones basta con recorrer el rbol ascendentemente de izquierda a derecha y generar una variable temporal para cada nodo intermedio del rbol, resumiendo mediante ella la estructura descendiente. As, por ejemplo, a partir de los grafos de la figura 1b y 1c, se obtienen las siguientes secuencias de cdigo intermedio: (100) (101) t1 (102) t2 (103) (104) (105) Fig 3a. Cdigo fig. 1c t4 := b * t3 t5 := t2 + t4 a := t5 corresp. fig. 1b (103) a := t3 t3 := - c (102) t3 := t2 + t1 := - c t2 := b * t1 (100) (101) t1 := - c t2 := b *

Fig 3b. Cdigo corresp.

El conjunto de instrucciones de tres direcciones del cdigo intermedio debe definirse adecuadamente segn el lenguaje a compilar, y teniendo en cuenta que cada instruccin del mismo debe convertirse fcilmente en una o varias instrucciones del cdigo mquina. No cabe por tanto definir un lenguaje intermedio universal, pero a ttulo de ejemplo se va a estudiar el tipo de instrucciones que pueden usarse:

Instrucciones de asignacin: directa: de un operando: de dos operandos: c Saltos en ejecucin: incondicionales: condicionales: then goto L etiquetas: Definicin de parmetros y llamada a procedimientos: definicin de parmetros: llamada: n

a := b a := opunario b a := b opbinario

goto L if a opcond label L

param X call p,

Por lo general se usan conjuntamente varias instrucciones de tres direcciones para realizar la llamada a un procedimiento o funcin. Primero se definen las variables que van a usarse como parmetros y luego se transfiere el control mediante una instruccin de llamada, indicando la direccin del procedimiento y el nmero de parmetros.

Operaciones de direccionamiento indirecto: en el argumento: [i] en el resultado: y Operaciones con punteros: asignacin de direccin: asignacin de valor: asignacin indirecta:

x := y x [i] :=

x := & y x := * y * x := y

La representacin que se ha utilizado hasta el momento se llama de cuartetos, ya que utiliza cuatro campos para almacenar cada instruccin. Existe otra tcnica que permite representar el cdigo de tres direcciones mediante solo tres campos. Para ello se mantiene la secuencia de instrucciones de cdigo intermedio en un vector. Ya que toda instruccin lleva aparejada una direccin como resultado, cuando sea necesario aludir a la direccin del resultado se har mediante el nmero correspondiente a la posicin del vector en la que se calcul. Por tanto, esta representacin slo almacena los campos correspondientes a la instruccin y a los dos argumentos y se llama de tercetos. As, representando mediante tercetos el cdigo del ejemplo anterior se obtiene: (100) (101) (102) (103) (104) (105) instr. --:= *:= --:= *:= +:= := arg1 c b c b (101) a arg2 (100) (102) (103) (104)

El uso de tercetos tiene una evidente ventaja sobre los cuartetos, ya que no es necesario generar un sinfn de variables temporales. Adems es ms compacta y por tanto ocupa menos espacio en memoria.Por contra, la representacin mediante tercetos es ms complicada y puede dificultar la optimizacin de cdigo, ya que cualquier variacin en la secuencia de instrucciones obliga a un reposicionamiento de las referencias. Este problema puede solventarse usando la representacin de tercetos indirectos,que consiste en utilizar un vector auxiliar para almacenar la secuencia de instrucciones. Por ejemplo, el cdigo anterior se representara mediante dos vectores, el primero de ellos contiene la secuencia de instrucciones y el segundo las instrucciones: referencia arg2 (1) (2) (100) (3) (102) (102) --:= c (100) (101) (100) (101) --:= *:= c b direccin instr. arg1

(4) (102) (5) (103) (6) (104)

(103) (104) (105)

(103) (104) (105)

*:= +:= :=

b (101) a

De esta forma, para eliminar el cdigo duplicado en la fase de optimizacin basta con eliminar estas instrucciones de la tabla de referencias y modificar solamente la instruccin que se optimiza: referencia arg2 (1) (2) (100) (3) (101) (4) (104) (105) (105) := a (104) (104) +:= (101) (100) (101) (100) (101) --:= *:= c b direccin instr. arg1