Está en la página 1de 28

Generacin de cdigo.

Procesadores de
Lenguaje I

Generacin de Cdigo Intermedio


Proceso de Sntesis

Lenguaje Intermedio
Generacin de Cdigo

Ventajas del cdigo intermedio

Facilitar la fase de optimizacin


Aumentar la portabilidad del compilador de una mquina a otra
Se puede utilizar el mismo analizador para diferentes generadores
Se pueden utilizar optimizadores independientes de la mquina

Facilitar la divisin en fases del proyecto

Fuente

Scanner

Parser

Generador
de
Cdigo

LI

Objeto

TDS

Generacin de cdigo. Procesadores de


Lenguaje I

Generacin de Cdigo Intermedio

Aumentar la portabilidad del compilador de una mquina a otra


Se puede utilizar el mismo analizador para diferentes generadores
Se pueden utilizar optimizadores independientes de la mquina

back-ends

front-ends
Pascal

Ada
C++
Java

Generador
de
Cdigo Intemedio

Optimizacin
independiente
de mquina

Intel X

Dec-Alpha

Motorola

N+M vs N*M

Generacin de cdigo. Procesadores de


Lenguaje I

Fase de Anlisis
position := initial + rate * 60
lexical analyzer
id1 := id2 + id3 * 60
syntax analyzer

:=
+

id1

id2l

60

id3
semantic analyzer

:=
Symbol
Table

rate.

id2l

inttoreal

id3

position ....
initial .

E
r
r
o
r
s

id1

60
intermediate code generator

Generacin de cdigo. Procesadores de


Lenguaje I

Fase de Sntesis
Symbol Table
position ....
initial .
rate.

intermediate code generator

E
r
r
o
r
s

temp1 := inttoreal(60)
temp2 := id3 * temp1
temp3 := id2 + temp2
id1 := temp3

3 address code

code optimizer
temp1 := id3 * 60.0
id1 := id2 + temp1
final code generator
MOVF id3, R2
MULF #60.0, R2
MOVF id2, R1
ADDF R1, R2
MOVF R1, id1

Generacin de cdigo. Procesadores de


Lenguaje I

Tipos de representaciones
intermedias

La representacin del cdigo intermedio depende


de la mquina objeto:

0-direcciones: cdigo para mquinas de pila (cdigo P)


2-direcciones: cdigos para mquinas con operaciones
sobre registros de memoria
3-direcciones: cdigo para mquinas de arquitectura
RISC

En todo caso, aade un recorrido descendente


adicional para generar el cdigo final

Generacin de cdigo. Procesadores de


Lenguaje I

Tipos de representaciones
intermedias
Propiedades:

Fcil de producir en el anlisis semntico


Fcil de traducir a cdigo mquina real
Instrucciones simples y concisas, de fcil optimizacin

Tipos

rboles de Sintaxis Abstracta


Notacin Polaca Inversa (RPN)
Cdigo P
Cdigos de tres direcciones
Cuartetos
Tercetos
Tercetos Indirectos

Generacin de cdigo. Procesadores de


Lenguaje I

Representaciones intermedias:
RPN
Notacin Polaca Inversa (RPN)

Los operadores van despus de los operandos


S=A+B*C

SABC*+=

Ventajas
Facilidad para generar cdigo a partir de ella
Es la notacin ms sencilla para el lenguaje intermedio

Inconvenientes
El cdigo es difcil de entender
Poca flexibilidad
No es til para optimizacin de cdigo

Generacin de cdigo. Procesadores de


Lenguaje I

Representaciones intermedias: P
Cdigo P

Extensin RPN para mquina completa (etiquetas, saltos)


Razones histricas (intrpretes Pascal)
Primer caso de mquina virtual
Todas las operaciones toman como argumentos la pila
Cargar/almacenar: lod, lda, ldc, sto
Aritmtica: adi, sbi, mpi
Saltos: ujp, fjp, lab

Similares ventajas e inconvenientes (es un CI muy


prximo a un lenguaje ensamblador)

Generacin de cdigo. Procesadores de


Lenguaje I

Representaciones intermedias: P
Ejemplos Cdigo P
Ejemplo 1:
x:=y+1

Ejemplo 2:
if cond then x=3

Codigo P
lda x // carga direccion x
lod y // carga valor y
ldc 1 // carga constante 1
adi
// suma 2 pos pila
sto
// almacena tope en inf.

Codigo P
lod cond // carga cond
fjp L1
// si falso salta a L1
lda x
// carga direccion x
ldc 3
// carga constante 3
sto
// almacena tope en inf
lab L1 // etiqueta L1

y
&x

cond

&x

Generacin de cdigo. Procesadores de


Lenguaje I

rboles de Sintaxis Abstracta


Son rboles de derivacin en los que no existe
informacin superflua
Cada nodo hoja representa un operando y cada nohoja un operador
Ejemplos

E
T
F

rbol

ASA

T
F
B

S:=A+B*C

IF A<B THEN X:=B

:=
B

A[I]:=B
:=

IF
+

<
*

:=
B

[]
B

B
I

Generacin de cdigo. Procesadores de


Lenguaje I

Cdigos de Tres Direcciones


Sentencias del estilo x = y op z

Cada lnea de cdigo tiene un operador y hasta


tres direcciones
Es una representacin lineal del ASA
Uso generoso de variable temporales
Directamente relacionado con evaluacin de
expresiones

Ejemplo: a = b*(c+d) se traduce a:


tmp1 = c+d
tmp2 = b*tmp1
a = tmp2

Generacin de cdigo. Procesadores de


Lenguaje I

Cdigos de Tres Direcciones


Ejemplos (relacionar con ASA)
Ejemplo 1:
a=b*-c+4

Codigo 3 direcciones
t1=-c
t2=b*t1
t3=4
t4=t3+t2
a=t4

Ejemplo 2:
if cond then then_statements
else
else_statements;
else_statements;
end if;
if;
Codigo 3 direcciones
t1 = cond
iff t1 else_label
codigo para then_statements
then_statements
goto endif_label
else_label:
codigo para else_statements
else_statements

endif_label:
endif_label:

Generacin de cdigo. Procesadores de


Lenguaje I

Instrucciones en Cdigo 3
direcciones

Asignaciones: x:=y op z (op aritmtico o lgico)


Asignaciones 1 argumento x:= op y
Copia x:=y
Salto incondicional: goto L (L etiqueta)
Salto condicional gotoc x L frecuente.: iff x L (if false)
Salto condicional if x relop y goto L
Etiquetas: label L
Llamada a subrutina:
param x1
...
param xn
call p,n
ret

Asignaciones indexadas
x:=y[i]
x[i]=y

Asignaciones con punteros


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

Generacin de cdigo. Procesadores de


Lenguaje I

Cdigos de 3 direcciones
Cada lnea de cdigo tiene un operador y hasta tres direcciones

Tipos: Cuartetos, Tercetos, Tercetos Indirectos


Cuartetos

Se representan por cuatro valores:


(<OPERADOR>,<Operando1>,<Operando2>,<Resultado>)
Ejemplos
Expresin

Cuartetos

Otra representacin

S:=A+B*C

*
+
:=

B C
A T1
T2 S

IF A<B THEN X:=B

<
A
IFF
E1
:=
B
LABEL

T1
T2

(*, B, C, T1)
(+, A, T1, T2)
(:=,T2, , S )

E1
E2
X
E2

(<,
A, B, E1)
(IFF,
E1, , E2 )
(:=,
B, , X )
(LABEL, , , E2)

Generacin de cdigo. Procesadores de


Lenguaje I

Implementacin de cdigo 3
direcciones
Implementacin con cuartetos

4 campos: (op,y,z,x) para x=y op z


Campos se anulan si no se necesitan, ej.: (rd,x,,)

Implementacin con tercetos

El cuarto elemento siempre es un temporal


En lugar de nombrarlo, utilizar el propio ndice del
terceto

Ejemplo: a = b+(c*d)
[cuartetos]
1. (mul,c,d,t1)
2. (add,b,t1,t2)
3. (:=,a,t2,_)

[tercetos]
1: (mul,c,d)
2: (add,b,(1))
3: (:=,a,(2))

Generacin de cdigo. Procesadores de


Lenguaje I

Tercetos
Los cuartetos son la herramienta ms general
Inconvenientes

Ocupan demasiado espacio


Requieren muchas variables auxiliares para
almacenar los resultados intermedios

Los tercetos resuelven este problema


suprimiendo el operando del resultado, queda
implcito y asociado a dicho terceto
(<OPERADOR>, <Operando1>, <Operando2>)
Hacen referencia a otro terceto
Son equivalentes a rboles de Sintaxis Abstracta

Generacin de cdigo. Procesadores de


Lenguaje I

Tercetos y Tercetos Indirectos


Ejemplos
Expresin

Tercetos

S:=A+B*C

1
2
3
1
2
3
4

IF A<B THEN X:=B

(*, B, C)
(+, A, (1))
(:=, 2, S)
(<, A, B)
(IFF,(1),(4))
(:=, B, X)
(,,)

Los Tercetos Indirectos son anlogos a los anteriores


pero en lugar de ejecutarse secuencialmente se ejecutan
segn un vector llamado SECUENCIA

Son ms fciles de optimizar


Ocupan menos memoria, el mismo terceto aparece una vez

Generacin de cdigo. Procesadores de


Lenguaje I

Tercetos Indirectos, Ejemplos


Expresin
S:=A+B*C
X:=A+B*C

WHILE X<B DO X:=X+1

Tercetos Ind.
1 (*, B, C)
2 (+, A, (1))
3 (:=, (2), S)
4 (:=, (2), X)
VE=(1, 2, 3, 1, 2, 4)
1 (<, X, B)
2 (gotoc, (1), (4))
3 (goto, , (7))
4 (+, X, 1)
5 (:=, (4), X)
6 (goto, , (1))
7 (, , )
VE=(1, (2, 3, 4, 5, 6)+, 7)

Generacin de cdigo. Procesadores de


Lenguaje I

Generacin de Cdigo Intermedio:


Declaraciones

Definicin de atributos con CI (sintetizado) + acciones


semnticas
Construccin explcita de la tabla de smbolos

Se crean entradas para cada variable segn su tipo

Reserva de espacio en funcin del tipo empleado


offset es una variable global con direccin de la tabla actual
T.tipo, T.ancho: atributos que caracterizan cada entrada en

la tabla

Simplificacin: tabla de un solo procedimiento

Extensiones para declaraciones en procedimientos y


mbitos anidados

Generacin de cdigo. Procesadores de


Lenguaje I

Declaraciones (1 procedimiento)
Producciones
P
D
DD; D
Did: T
Tinteger
Treal
Tarray[num]
of T

TT

Reglas semnticas
{offset=0}

{ponerTabla(id.lex, T.tipo, offset)


offset=offset+T.ancho}
{T.tipo=integer
T.ancho=4}
{T.tipo=real
T.ancho=8}
{T0.tipo=array(num.lex, T1.tipo)
T0.ancho=num.lex*T1.ancho}
{T0.tipo=pointer(T1.tipo)
T0.ancho=4}

10

Generacin de cdigo. Procesadores de


Lenguaje I

Tercetos para Expresiones


Se construyen nombres temporales para los nodos interiores del
rbol sintctico
Se calcula el valor del no terminal E en el lado izquierdo de EE+E
dentro de un nuevo temporal t: E1 a t1; E2 a t2; t= t1+t2

E.lugar, es el nombre que contendr el valor de E (lugar en TS)


E.cdigo, es la secuencia instrucciones de tres direcciones para E
La funcin tempnuevo() devuelve una secuencia de nombres distintos
t1, t2, , t3,... en sucesivas llamadas
Las variables tienen el nombre id.lex, y se accede a su declaracin en
la tabla de smbolos como lookup(id.lex) (detectar errores)
gen(.) genera cdigo de tres direcciones

El nmero de temporales podra optimizarse posteriormente

Generacin de cdigo. Procesadores de


Lenguaje I

Asignaciones y Aritmtica
Producciones Regla Semntica
S id := E
E E+E

{p=lookup(id.lex);
if (p!=null) S.cdigo := E.cdigo || gen(p := E.lugar)}
{E0.lugar := tempnueva();
E0.cdigo := E1.cdigo || E2.cdigo ||
gen(E0.lugar := E1.lugar + E2.lugar)}

E E*E

{E0.lugar := tempnueva();
E0.cdigo := E1.cdigo || E2.cdigo ||
gen(E.lugar := E1.lugar * E2.lugar)}

E -E

{E0.lugar := tempnueva();
E0.cdigo := E1.cdigo || gen(E0.lugar:=menosu E1.lugar)}

E (E)

{E0.lugar := E1.lugar;
E0.cdigo := E1.cdigo}
{p=lookup(id.lex), if (p!=null) E.lugar := p;}

E id

11

Generacin de cdigo. Procesadores de


Lenguaje I

Conversiones de Tipos
Producciones Regla Semntica
S id := E

{p=lookup(id.lex);
S.cdigo := E.cdigo || gen(p := E.lugar)}
{E0.lugar := tempnuevo();
if (E1.tipo=integer and E2.tipo=integer) then
c=gen(E0.lugar := E1.lugar + E2.lugar)
E0.tipo=int
if (E1.tipo=real and E2.tipo=real) then
c=gen(E0.lugar := E1.lugar + E2.lugar)
E0.tipo=real
if (E1.tipo=integerl and E2.tipo=real) then
c=gen(E0.lugar :=inttoreal E1.lugar + E2.lugar)
E0.tipo=real
if (E1.tipo=real and E2.tipo=integer) then
c=gen(E0.lugar :=l E1.lugar + inttoreal E2.lugar)
E0.tipo=real}
E0.cdigo := E1.cdigo || E2.cdigo ||c

E E+E

t1:=multi(i,j)
t3:=inttoreal t1
t2:=addr(y, t3)

Ej.: x:=y+i*j

x:=t2

Generacin de cdigo. Procesadores de


Lenguaje I

Evaluacin de Declaraciones y
Expresiones
TS

Ej.: a: int; c: real;


a=0;c=a*4.0+1;
P
Ds
Ds
Ds

id : T

id : T

(c) (real)

(a) (int)

entero

real

100

104

Ss
D

S
id = E

(a)

Cdigo
Intermedio:

Ss
S

(0)

Ss

id =E

(c)

E + E

(1)

t1:=0
a:=t1
t2:=inttoreal a
t3:= t2 *4.0
t4:= t3+1
c:=t4

E * E

(a)

(4)

12

Generacin de cdigo. Procesadores de


Lenguaje I

Evaluacin de Declaraciones y
Expresiones

Con atributo cdigo: concatenar atributos sintetizados


a: int; c: real;
t1:=0
a=0;c=a*4.0+1;
a:=t1
t2:=inttoreal a

Ss

t3:= t2 *4
t4:= t3+1

Ss

c:=t4

t1:=0

id = E

(a)

a:=t1

(0)
id

(c)

Ss

E
+

E
E * E

(a)

(4)

t2:=inttoreal a

(1)

t2:=inttoreal a
t3:= t2 *4
t4:= t3+1
c:=t4

t2:=inttoreal a
t3:= t2 *4
t4:= t3+1

t3:= t2 *4

Generacin de cdigo. Procesadores de


Lenguaje I

Evaluacin de Declaraciones y
Expresiones
Sin atributo cdigo: escribir cdigo globalmente
a: int; c: real;
a=0;c=a*4.0+1;
Ss

t1:=0

a:=t1

Ss

t2:=inttoreal a

t1:=0

id = E

(a)

t3:= t2 *4

a:=t1

(0)
id

(c)

E
+

t2:=inttoreal a

E * E

(a)

Ss

c:=t4

t4:= t3+1
c:=t4

t4:= t3+1

Salida global

(1)

t3:= t2 *4

(4)

13

Generacin de cdigo. Procesadores de


Lenguaje I

CGI sin utilizar atributo cdigo


Producciones

Regla Semntica

S id := E {p=lookup(id.lex);
if (p!=null) emitir(p := E.lugar)}

E E+E

{E0.lugar := tempnuevo();
emitir(E0.lugar := E1.lugar + E2.lugar)}

E E*E

{E0.lugar := tempnuevo;
emitir(E0.lugar := E1.lugar * E2.lugar)}

E -E

{E0.lugar := tempnuevo();
emitir(E0.lugar:=menosu E1.lugar)}

E (E)

{E0.lugar := E1.lugar;}

E id

{p=lookup(id.lex), if (p!=null) E.lugar := p;}

Generacin de cdigo. Procesadores de


Lenguaje I

Literales numricos
Dos posibilidades:

estricta (lugar es una direccin de memoria)


lugar es un texto

Producciones Regla Semntica


a) E num
b) E num
a=3+b+7+c

{E.lugar := nuevatemp(); emitir(E.lugar := num.lex)}


{E.lugar := num.lex)}
tmp1=3

tmp1=3+b

tmp2=tmp1+b

tmp2=tmp1+7

tmp3=7

tmp3=tmp2+c

tmp4=tmp2+tmp3

a=tmp3

tmp5=tmp4+c
a=tmp5

14

Generacin de cdigo. Procesadores de


Lenguaje I

Expresiones con Arrays (1D)


Suponiendo almacenamiento secuencial, las direcciones se calculan
desde la direccin base (direccin en memoria) con desp. lineal:

a[i+1]:: dir_base(a)+(i+1)*sizeof(a)

Ejemplo:
a[i+1]=a[j+2]+3;

E0id [E1]

{p=lookup(id.lex)
E0.lugar=tempnuevo()
t=tempnuevo()
gen(t = E1.lugar * size(p))
gen(E0.lugar =p[ t ] )
}
Sid [E1]=E2 {p=lookup(id.lex)
t=tempnuevo()
gen(t = E1.lugar * size(p))
gen( p[ t ]= E2.lugar)
}

t1=j+2
t2=t1*size(a)
t3=a[t2];
t4=t3+3
t5=i+1
t6=t5*size(a)
a[t6]=t4

Tambin puede hacerse con indirecciones (punteros)


a=p[i]

t1=&p;
t2=t1+i;
a=*t2

Generacin de cdigo. Procesadores de


Lenguaje I

Evaluacin de Arrays (1D)


Sin atributo cdigo: escribir cdigo globalmente
a[i+1]=a[j+2]+3;
t5:= t1*size(a)
a[t5]:=t4

t3:=t2*size(a)

id

(a)

E
id

(i)

E
+

]
E

t1:=i+1

num

(1)

t4:=a[t3]

id

(a)

E
id

(j)

E
+

]
t2:=j+2

E
num

(2)

Ejemplo:
a[i+1]=a[j+2]+3;
t1:=i+1
t2:=j+2
t3:=t2*size(a)
t4:=a[t3]
t5:= t1*size(a)
a[t5]:=t4

Salida global

15

Generacin de cdigo. Procesadores de


Lenguaje I

Expresiones con registros y punteros


Registros

Los registros tienen campos con desplazamiento fijo

base de cplx
typedef struct cplx{
cplx.real
desplaz.
campo imag
double real;
cplx.imag
double imag;

};
cdigo 3 dir independiente: funcin offset (tipo,campo) en la TS

Eid . id

E.lugar=tempnuevo();
t1=tempnuevo();
t2=tempnuevo();
gen(t1 =& id1.lex)
gen(t2 = t1 +offset( id1.lex ,id2.lex ));
gen(E.lugar =* t2);

Punteros tienen traduccin directa

i=*x;
*x=i;

Generacin de cdigo. Procesadores de


Lenguaje I

Expresiones con registros y punteros


Combinaciones de punteros y registros

cplx *c1, *c2;

c1 ->real=c2->imag;

cplx.real
cplx.imag

base de cplx
desplaz. campo imag

Eid -> id {
E.lugar=tempnuevo();
t=tempnuevo();
gen(t = id1 +offset( id1.lex ,id2.lex ));
gen(E.lugar =* t);
}

16

Generacin de cdigo. Procesadores de


Lenguaje I

Expresiones con registros y punteros


Ejemplos

cplx *c1, *c2;

c1 ->real=c2->imag;

base de cplx

cplx.real

desplaz. campo imag

cplx.imag

Ejemplo:
num.real=num.imag;

Ejemplo:
c1->real= c2-> num.imag;

t2=&num
t3=t1+offset(num,imag)
t1=*t1
t4=&num
t5=t4+offset(num,real)
*t5=t1

t2=c1+offset(c1,imag)
t3=*t2
t4=c2+offset(c2,real)
*t4=t3

Generacin de cdigo. Procesadores de


Lenguaje I

Evaluacin de Arrays Multidimensionales


Un array se accede como un bloque
de posiciones consecutivas. Si empieza
en 0:
w

a[i]

a[1]
a[0]

base
i2

posicion a[i]: base+i*w

Matriz 2 dimensiones (por filas): A[i1][i2]

posicion: base+(i1*n2+i2)*w

i1

A[0][0]

A[0][i2]

A[i1][0]

A[i1][i2]

Generalizacin a k dimensiones: A[i1][i2][ik]

posicion: base+((((i1*n2+i2)*n3+i3))*nk+ik )*w

Ecuacin recurrente:

n2

e1=i1
em=em-1*nm+im

17

Generacin de cdigo. Procesadores de


Lenguaje I

Evaluacin de Arrays Multidimensionales

E representa la evaluacin de una expresin, L el acceso a una


variable

L.offset es distinto de null si L es un acceso con desplazamiento (array


segn instruccin de cdigo intermedio)
L.lugar es la posicin de comienzo

El smbolo recurrente Lista efecta el clculo de posicin de los ndices


con la ecuacin recursiva:

Lista0::=Lista1 , E

Lista.lugar almacena el valor em

Lista.ndim es la dimensin (Lista0.ndim= Lista1.ndim+1)

Al terminar el ltimo ndice hay que multiplicar por w

El tipo array mantiene sus propiedades, en la tabla de smbolos: id.lex


tiene asociada una direccin: Lista.array

Tamao total: ancho (Lista.array)

Lmite de una dimensin: limite(Lista.array, m)

Generacin de cdigo. Procesadores de


Lenguaje I

Evaluacin de Arrays Multidimensionales


Producciones
S L := E
E L
E num
L id
L Lista]

ListaLista][E

Listaid [E

Regla Semntica
{if (L.offset == null) gen(L.lugar= E.lugar
else gen(L.lugar [ L.offset ]=E.lugar}
{if (L.offset == null) gen(E.lugar= L.lugar
else E.lugar=tempnuevo(); gen(E.lugar =L.lugar [ L.offset ])}
{E.lugar=tempnuevo(); gen(E.lugar = num.val)}
{p=lookup(id.lex), L.lugar := p, L.offset=null}
{L.lugar= tempnuevo();
L.offset= tempnuevo();
gen(L.lugar := base(Lista.array) )
gen(L.offset = Lista.lugar * ancho (Lista.array))}
{t= tempnuevo(), m=Lista1.ndim+1
gen(t = Lista1.lugar * limite(Lista1.array,m))
gen(t = t + E.lugar)
Lista0.array=Lista1.array
Lista0.lugar=t, Lista0.ndim=m}
{p=lookup(id.lex), Lista.array= p
Lista.lugar=E.lugar
Lista.ndim=1}

18

Generacin de cdigo. Procesadores de


Lenguaje I

Evaluacin de Arrays Multidimensionales

Ej.: x:=M[3][1] (M de tipo array{[04]x[04],int})


S1
L1

base
limite(i)
ancho
celda

:= E1

id

L2

(x)

Cdigo
Intermedio:

Lista1 ]

t1:=3
t2:=1

E3

Lista2 ] [

id

(M)

E2

num (1)

num (3)

t3:=t1*5
t3:=t3+ t2
t4:=base(M)
t5:=t3*4
t6:=t4[t5]
x:=t6

Generacin de cdigo. Procesadores de


S1: /S1->L1=E1/
Lenguaje I
L1: L1.lugar=x /L1->id/
L1.offset=null
E1: /E1->L2/
L2: /L2->Lista1]/
Lista1: /Lista1->Lista2][E3/
Lista2: /Lista2->E2]/
E2 :
E2.lugar=t1 /E2->num/
t1=3
Lista2.lugar=t1
Lista2.ndim=1
Lista2.array=M
E3 :
E3.lugar=t2 /E3->num/
t2=1
Lista1.lugar=t3
t1:=3
m=2
t2:=1
t3= t1*5
(*lista2*limite(M,1)*)
t3:=t1*5
t3= t3+t2 (*suma indice E3*)
Lista1.array=M
t3:=t3+ t2
Lista1.lugar=t3
t
4:=base(M)
Lista1.ndim=m
L2.lugar= t4
t5:=t3*4
L2.offset=t5
t6:=t4[t5]
t4=base(M)
x:=t6
t5=t3*ancho(M)
(*lista1*ancho*)
E1.lugar=t6
t6=t5[t5]
x=t6

19

Generacin de cdigo. Procesadores de


Lenguaje I

GCI para Expresiones Booleanas


Dos posibilidades:
Valores numricos (0,1)
Etiquetas para control de flujo
Con valores numricos: E toma un valor aritmtico,
instrucciones de salto en funcin del valor
if (a<b) x=1

t1=a<b
iff t1 L1
x:=1
L1

E, a<b, tiene un
atributo: t1

Con etiquetas: una expresin booleana tiene directamente las


etiquetas, que son posiciones destino de control de flujo:
E.true, E.false (evaluacin en cortocircuito)

Son atributos heredados


if (a<b) x=1

L1
L2

if a < b goto L1
goto L2
x:=1

E, a<b, tiene tres


atributos: L1, L2, cdigo

Generacin de cdigo. Procesadores de


Lenguaje I

GCI para Expresiones Booleanas


Ejemplos:
if E then S1 else S2

while (E) S

Codigo 3 direcciones
Cdigo de evaluaci
evaluacin de E
(hacia qu
qu etiqueta salto)
salto)
E.true:
E.true:
Cdigo para S1
goto Seguir
Seguir
E.false:
E.false:
Cdigo para S2
Seguir:
siguientes instrucciones

Codigo 3 direcciones
Comienzo:
Comienzo:
Cdigo de evaluaci
evaluacin de E
(hacia qu
qu etiqueta salto)
salto)
E.true:
E.true:
Cdigo para S
goto Comienzo
Comienzo
E.false:
E.false:
siguientes instrucciones

20

Generacin de cdigo. Procesadores de


Lenguaje I

GCI- Condiciones Booleanas


Evaluacin en cortocircuito

AND: E0 -> E1 || E2

true

E1 false

true

false
label E1.false:
true

false

E2

E0

Generacin de cdigo. Procesadores de


Lenguaje I

GCI- Condiciones Booleanas


Evaluacin en cortocircuito

AND: E0 -> E1 && E2

true

E1 false

true

false
label E1.true:
true

E2 false

E0

21

Generacin de cdigo. Procesadores de


Lenguaje I

GCI- Condiciones Booleanas


Evaluacin en cortocircuito
Produccin
E:=true
E:=false
E:=id1 relop id2
E0:=E1or E2

E0:=E1and E2

E0:=(E1)

Regla Semntica
{E.codigo = gen (goto E.true)}
{E.codigo = gen (goto E.false)}
{E.code=gen(if id1.lugar relop id2.lugar goto E.true)||
gen(goto E.false)}
{E1.false= newlabel()
E1.true= E0.true
E2.true= E0.true
E2.false= E0.false
E0.codigo= E1.codigo || gen(E1.false :) || E2.codigo}
{E1.true= newlabel()
E1.false= E0.false
E2.true= E0.true
E2.false= E0.false
E0.codigo= E1.codigo || gen(E1.true :) || E2.codigo}
{E1.false= E0.false
E1.true= E0.true
E1.code= E0.code}

Generacin de cdigo. Procesadores de


Lenguaje I

GCI- Condiciones Booleanas


Evaluacin en cortocircuito. Ejemplo:
if (B) S:
codigo de B
Lt0:
cdigo de S
Lf0:

Ejemplo:
if (a<(b+32) || (b>0 && a>0))
x=1
t1=b+32
if a < t1 goto Lt0
if b > 0 goto L1
goto Lf0
Label L1:
if a > 0 goto Lt0
goto Lf0
Label Lt0
x=1
Labl Lf0

22

Generacin de cdigo. Procesadores de


Lenguaje I

GCI- Estructuras de control


CONDICIONAL: S-> if (B) S else S

true

B false

label B.true:
S1
goto S.next:
label B.false:
S2
label S.next:

E0

Generacin de cdigo. Procesadores de


Lenguaje I

GCI- Estructuras de control


BUCLE: S-> while (B) do S

label inicio:
true

B false

label B.true:
S
goto inicio
label S.next:

E0

23

Generacin de cdigo. Procesadores de


Lenguaje I

GCI- Sentencias Condicionales


Atributo heredado S.next: instruccin continuacin

Problema: etiquetas desconocidas a priori (idem)

Produccin
S:=if E then S1

S0:=if E then S1 else S2

S0:= while E do S1

Regla Semntica
{E.true= newlabel()
E.false= S0.next
S1.next= S0.next
S0.codigo=E.codigo||gen(E.true :)||S1.codigo}
{E.true= newlabel()
E.false= newlabel()
S1.next= S0.next
S2.next= S0.next
S0.codigo=E.codigo||gen(E.true :)||S1.codigo||
gen(goto S0.next||gen(E.false :)||S2.codigo}
{begin = newlabel()
E.true= newlabel()
E.false= S0.next
S1.next= begin
S0.codigo=gen(begin :)||E.codigo|| gen(E.true :)||
S1.codigo||gen(goto begin)}

Generacin de cdigo. Procesadores de


Lenguaje I

GCI- Condicionales sin atrib cdigo


Atributo heredado S.next: instruccin continuacin
Produccin
S0:=if
E then
S1
S0:=if
E then
S1 else
S2
S0:= while
E do
S1

Regla Semntica
{E.true= newlabel(); E.false= S0.next}
{emitir(label E.true :); S1.next= S0.next;}
{E.true= newlabel(); E.false= newlabel()}
{emitir(label E.true :); S1.next= S0.next}
{emitir(label E.false :); S2.next= S0.next}
{begin = newlabel(); E.true= newlabel();
E.false= S0.next; emitir(label begin :);}
{S1.next= begin; emitir(label E.true :); }

24

Generacin de cdigo. Procesadores de


Lenguaje I

Ejemplo control de flujo


while s<K do
if a>b
s=s+a
else
s=s-a

S1
while E1

id

(s)

do

S2

> id if E2 S3 else S4

(K)

id

(a)

> id

(b)

Cdigo 3
direcciones
L1: if s<K goto L2
goto L0
L2: if a>b goto L3
goto L4
L3: t1=s+a
s=t1
goto L0
L4: t2=s-a
s=t2
goto L1
L0:

Generacin de cdigo. Procesadores de


Lenguaje I
S1.next=L0 (**)
S1: /S1->while E1 do S2/
S1.next=L0
begin=L1
E1.true=L2
E1.false=L0
E1: /E1->id op id/
E1.codigo=if s<K goto L2
goto L0
S2.next=L0
S2: /S2->if E2 then S3 else S4/
E2.true=L3
E2.false=L4
L1: if s<K goto L2
E2 :
/E2->id op id/
goto L0
E2.codigo=if a>b goto L3
L2: if a>b goto L3
goto L4
goto L4
goto L0
L3: t1=s+a
if a>b goto L3
S3.next=L1
s=t1
goto L4
S3: /S3->s=s+a/
goto L0
L3: t1=s+a
S3.codigo=t1=s+a
L4: t2=s-a
s=t1
s=t1
s=t2
goto L0
S4.next=L0
goto L1
L4: t2=s-a
S4: /S4->s=s-a/
L0:
s=t2
S4.codigo=t2=s+a
s=t2
S2.codigo=
S1.codigo=

25

Generacin de cdigo. Procesadores de


Lenguaje I

Relleno con retroceso (back-patching)


El cdigo intermedio para control de flujo usa saltos a etiquetas
futuras

No es problema en CI puesto que se tratan como nombres


En el cdigo final hay que transformarlas en direcciones

Una solucin es diferir su ajuste final a una pasada posterior

Implementacin sencilla: archivo temporal

Cdigo

target:

goto target
...
goto target
...
mov foobar,r1

Tabla

goto target
.
goto target

target: mov foobar, r1

target
backpatch list
(lista enlazada)

Generacin de cdigo. Procesadores de


Lenguaje I

Traduccin de llamadas a funciones


Es el aspecto ms dependiente del entorno de ejecucin

Difcil de generalizar a cdigo intermedio

Dos aspectos bsicos

Declaracin de funcin/procedimiento (o definicin)


Llamada de funcin/procedimiento

El cdigo intermedio define el punto de entrada y el punto de


retorno de la funcin

Definicin
Instruccin de entrada
<cdigo del cuerpo de la funcin>
Instruccin de salida
Llamada
Instruccin de comienzo de clculo de parmetros
<cdigo del clculo de parmetros>
Instruccin de llamada

26

Generacin de cdigo. Procesadores de


Lenguaje I

GCI para llamadas a funciones


Instrucciones 3 direcciones
param x
call f, n

entry f
return x

Cdigo P
mst
cup

ent f
ret

Ej.:
int f(int x, int y)
{return x+y+1;}

f(2+3,4);

entry f
t1=x+y
t2=t1+1
return t2
t1=2+3
param t1
param 4
call f 2

Cdigo 3-dir

ent
lod
lod
adi
ldc
adi
ret
mst
ldc
ldc
adi
ldc
cup

f
x
y
1

2
3
4
f

Cdigo P

Generacin de cdigo. Procesadores de


Lenguaje I

Llamadas a funciones dentro de


expresiones
Producciones Regla Semntica
S id := E
E E+E

{p=lookup(id.lex);
if (p!=null) emitir(p := E.lugar)}
{E0.lugar := tempnuevo();
emitir(E0.lugar := E1.lugar + E2.lugar)}

E id

{p=lookup(id.lex), if (p!=null) E.lugar := p;}

E id(lista)

{para cada elemento p en lista.pila


emitir(param p)
emitir(call id.lugar)}

27

Generacin de cdigo. Procesadores de


Lenguaje I

Ejemplo con funciones y expresiones


Sin atributo cdigo: escribir cdigo globalmente
a=0;c=1+f(2,4*a);
S
id

(c)

c:=t4

E
E

(1)
id

(f)

t1:=0

t4=1+t3
param t2

param 1

t2:=4*a

t3=call f 2

param t2

( lista )

param 1
t2 1

E , lista

(1)

E
E

(4)

a:=t1

t3=call f 2
t2
t2:=4*a

t4:= 1+t3
c:=t4

(a)

28

También podría gustarte