Está en la página 1de 7

UNIDAD II GENERACIN DE CDIGO INTERMEDIO

INTRODUCCIN AL TEMA
Segn el modelo de arquitectura de un compilador en el que ste se divide en
frontend y backend, la etapa inicial traduce un programa fuente a una
representacin intermedia a partir de la cual la etapa final genera el cdigo objeto,

ya sea en forma de cdigo mquina o ensamblador. Los detalles del lenguaje


objeto se confinan en la etapa final, si esto es posible, lo que facilita la reutilizacin
del frontend para crear otros compiladores del mismo lenguaje pero que generan
cdigo para otras plataformas.
La filosofa verstil en la construccin de compiladores llega a su extremo en la
implementacin de lenguajes que son compilados y seudo interpretados en
ejecucin. Esto quiere decir que en tiempo de compilacin se genera un cdigo
mquina propio de un microprocesador virtual (llamado cdigo-P en UCSD Pascal,
bytecodes en Java, etc.) que, a su vez, se interpreta en tiempo de ejecucin a
travs de lo que se llama motor de ejecucin.
A estos lenguajes no se les puede catalogar como interpretados ya que lo que se
interpreta en tiempo de ejecucin no es exactamente el programa fuente; pero
tampoco se les puede considerar compilados del todo ya que lo que se genera en
tiempo de compilacin no es exactamente cdigo mquina. Esta filosofa de
diseo tiene la ventaja de que facilita la portabilidad de los programas.
Dado que las declaraciones de variables no generan cdigo, los temas siguientes
se centran en las sentencias propias de un lenguaje de programacin imperativo,
especialmente asignaciones y clusulas de control del flujo de ejecucin. La
generacin de cdigo intermedio se puede intercalar en el anlisis sintctico
mediante las apropiadas acciones semnticas

TEMA 2.1 NOTACIN INFIJA


La notacin infija es la ms utilizada por las personas por que es la ms
comprensible ya que ponen el operador entre los dos operandos. Por ejemplo
a+b-5. No existe una estructura simple para representar este tipo de notacin en la
computadora por esta razn se utilizan otras notaciones

TEMA 2.2 NOTACIN PREFIJA


La notacin prefija pone el operador primero que los dos operandos, por lo
que la expresin a+b-5 queda: +ab-5. Se repite este hasta que nos quede un solo
resultado.

TEMA 2.3 NOTACIN POSTFIJA


Llamada tambin sufija o polaca inversa, se usa para representar
expresiones sin necesidad de parntesis. Es particularmente atractiva para la
representacin de expresiones aritmticas. Como su nombre lo indica se refiere a
que el operador ocupa la posicin despus de los operandos
La expresin a+b-5 es en notacin postfija: ab+5Ejemplos:
a*b
a*(b+c/d)
a*b+c*d

ab*
abcd/+*
ab*cd*+

La conversin de infija a postfija Utiliza una pila donde se genera la salida,


inicialmente vaca. Las acciones semnticas asociadas a las reglas son:
E
E
E
T
T
T
F
F

::=
::=
::=
::=
::=
::=
::=
::=

E +
E T
T *
T /
F
i
(E)

T
T

Push +
Push -

F
F

Push *
Push /
Push i

F ::= - F

Push @

La asignacin, teniendo en cuenta que podemos no querer valor resultante.


Adems, no interesa tener en la pila el valor del identificador izquierdo, sino su
direccin.
a:=b*c+d

abc*d+:=

La transferencia (GOTO).
GOTO L

se transforma a

L GOTO

la instruccin condicional
if p then inst1 else inst2

se convierte en
p L1 TRZ inst1 L2 TR inst2
L1:
L2:

Subndices:
a[exp1; exp2; ...; expn]

se convierte en
a exp1 exp2 ... expn SUBIN-n

TEMA 2.4 CDIGO INTERMEDIO EN NOTACIN POLACA


Debe su nombre al matemtico polaco Lucasiewicz que invent la notacin
libre de parntesis. En esta notacin se escribe primero el nombre de la funcin
seguida de los operando de izquierda a derecha. Si un operando es a su vez
operacin con operando, se aplican las mismas reglas. Por ejemplo:
( a + b ) * ( ca ) equivale a + a b c a
No hay ambigedad alguna ni se necesitan parntesis para saber cmo
evaluar la expresin.
Cundo se necesita representar expresiones que no sean aritmticas, se
recurre a la notacin polaca extendida mediante instrucciones de saltos hacia
otras partes del cdigo interno. En el caso de los valores de un arreglo, se colocan
estos en una pila, para de all acceder a los valores de estos.

TEMA 2.5 CDIGO P

El cdigo P hace referencia a mquinas que utilizan o se auxilian de pilas


para generar cdigo objeto. En muchos caso la P se asociado a cdigo portable el
cual garantiza que el cdigo compilado en una mquina se pueda ejecutar en
otras.

TEMA 2.6 CDIGO INTERMEDIO EN TRIPLES


Las proposiciones de tres direcciones se parece mucho al ensamblador, el
cual es un lenguaje intermedio ms entendible para la mquina, debido a que las
estructuras de control (if, switch, while, do-while, for) son realmente etiquetas goto
disfrazadas
Con una estructura de tres campos se pueden omitir los valores temporales
y en su lugar utilizar los campos de operacin, argumento1 y argumento2.
Para evitar tener que introducir nombres temporales en la tabla de
smbolos, se hace referencia a un valor temporal segn la posicin de la
proposicin que lo calcula. Por ejemplo: la expresin a * b + c * d equivale a:
(1) (*,a,b)
(2) (*,c,d)
(3) (+,(1),(2))
Las propias instrucciones representan el valor del nombre temporal. No se
pone el resultado, se sustituye por referencias a tripletes. Como en a * b + 1 se
generara:
(1) (*,a,b)
(2) (+,(1),1)
La notacin de tres direcciones es una forma abstracta de cdigo
intermedio. Esta notacin se puede implementar como registros con campos para
el operador y operadores.
La instruccin condicional If X>Y then Z := X else Z := Y + 1 puede ser
representada como se muestra a continuacin:
1. (-, X, Y)
2. (JLE, (1), 5)
3. :=, Z, X
4

4.
5.
6.
7.

JMP,, (7)
+, Y, 1
:=, Z, (5)
...

Tambin permite condiciones simples y saltos. Por ejemplo, para la


siguiente sentencia:
WHILE (A > B) AND (A < = 2 * B 5) DO A : = A + B el
cdigo intermedio generado ser:
L1 : IF A > B GOTO L2
GOTO L3
L2 : T1 : = 2 * B
T2 : = T1 5
IF A < T2 GOTO L4
GOTO L3
L4 : A : = A + B
GOTO L1
L3 : . . . . . . .

TEMA 2.7 CDIGO INTERMEDIO EN CUDRUPLOS


Un cudruplo es una estructura de tipo registro con cuatro campos que
representan a la operacin u OP, el argumento1, el argumento2 y el resultado, El
campo OP contiene un cdigo interno para el operador. Las proposiciones con
operadores unarios no usan el argumento2. Los campos que no se usan se dejan
vacos o un valor NULL.
Por ejemplo: la expresin A := B+C+D equivale a:
(1) (+, B, C, T1)
(2) (+, D, T1, T2)
(3) (:=, a, , T2)
La proposicin de tres direcciones x = y + z se podra representar mediante
la cudruplo (ADD, x,y, z).

TEMA 2.8 GENERACIN DE VARIABLES Y CONSTANTES


Las declaraciones de variables y constantes deben separarse de tal manera
que queden las expresiones una por una de manera simple. Por ejemplo int a,b,c;
se descompone en int a; int b; int c; respectivamente
5

TEMA 2.9 GENERACIN INSTRUCCIN DE ASIGNACIN


Las operaciones de asignacin deben quedar expresadas por una
expresin sencilla, si est es compleja se debe reducir hasta quedar un operador
sencillo. Por ejemplo: x = a+b/5; debe quedar de la forma y = b/5; z = a+y; x=z.
Los arreglos se descomponen en estructuras bsicas de manejo de manera
simple, as por ejemplo: char *a=Hola; se reduce a: a[0]=H; a[1]=o; a[2]=l;
a[3]=a; a[4]=\0;

TEMA 2.10 GENERACIN DE INSTRUCCIONES DE CONTROL


1. Los bloques bsicos son trozos de cdigo intermedio en los que el flujo de
control es lineal, es decir, trozos de cdigo cuyas instrucciones se ejecutan
una detrs de otra sin saltos intermedios. Los bloques bsicos tienen por
tanto una nica instruccin de comienzo de bloque y una nica instruccin
de salida del bloque. Por ejemplo, la siguiente secuencia de instrucciones
de tres direcciones forma un bloque bsico.
IF (b*-c)>0 THEN exit;
(100) t1:=-c
(101) a:=b*t1
(102) if(a>0) goto (712)
2. Instruccin If
Las condiciones deben expresarse de manera lo ms sencilla posible de tal
forma que puedan evaluarse por partes. Por ejemplo una instruccin como:
if (a == b && c!=5 && d%3==0) se evala primero x = (a==b && c!=5); y = x
&& d%3==0; if (y)
Las instrucciones de decisin compleja como switch se reducen a una
versin complejas de ifs
3. Instrucciones de ciclos
6

Los ciclos se descomponen en un ciclo genrico, por lo que ciclos while, for
y do-while tienen la misma representacin interna. En el caso de C, todo queda en
forma de while. Las condiciones lgicas tambin pueden ser evaluadas por
partes.

TEMA 2.11 GENERACIN FUNCIONES


Las funciones pueden ser reducidas a referencias de un cdigo nico
almacenado en lnea. Y sus parmetros se colocan en variables temporales al
igual que el valor de retorno.