Вы находитесь на странице: 1из 28

1

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
TDS
Objeto
LI
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
Generador
de
Cdigo Intemedio
Optimizacin
independiente
de mquina
C
Pascal
Ada
C++
Java
Intel X
Dec-Alpha
Motorola
N+M vs N*M
front-ends
back-ends
2
Generacin de cdigo. Procesadores de
Lenguaje I
Fase de Anlisis
E
r
r
o
r
s
position := initial + rate * 60
lexical analyzer
syntax analyzer
semantic analyzer
intermediate code generator
id1 := id2 + id3 * 60
:=
id1
id2l
id3
+
*
60
:=
id1
id2l
id3
+
*
inttoreal
60
Symbol
Table
position ....
initial .
rate.
Generacin de cdigo. Procesadores de
Lenguaje I
Fase de Sntesis
E
r
r
o
r
s
intermediate code generator
code optimizer
final code generator
temp1 := inttoreal(60)
temp2 := id3 * temp1
temp3 := id2 + temp2
id1 := temp3
temp1 := id3 * 60.0
id1 := id2 + temp1
MOVF id3, R2
MULF #60.0, R2
MOVF id2, R1
ADDF R1, R2
MOVF R1, id1
position ....
initial .
rate.
Symbol Table
3 address code
3
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
4
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 S A B C * + =
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)
5
Generacin de cdigo. Procesadores de
Lenguaje I
Representaciones intermedias: P
Ejemplos Cdigo P
Ejemplo 2:
if if cond cond then then x=3 x=3
Codigo P
lod lod cond cond // // carga carga cond cond
fjp fjp L1 // L1 // si si falso falso salta salta a L1 a L1
lda lda x // x // carga carga direccion direccion x x
ldc ldc 3 // 3 // carga carga constante constante 3 3
sto sto // // almacena almacena tope en tope en inf inf
lab L1 // lab L1 // etiqueta etiqueta L1 L1

&x
y
1

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

&x
3
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 no-
hoja un operador
Ejemplos
rbol ASA S:=A+B*C IF A<B THEN X:=B A[I]:=B
E
E
T
F
A
T
F
B
+
+
A B
:=
S +
A *
B C
IF
< :=
A B X B
:=
[ ] B
A I
6
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 if cond cond then then then_statements then_statements
else else
else_statements else_statements; ;
end if end if; ;
Codigo 3 direcciones
t1 = t1 = cond cond
iff iff t1 t1 else_label else_label
codigo codigo para para then_statements then_statements
goto goto endif_label endif_label
else_label else_label: :
codigo codigo para para else_statements else_statements
endif_label endif_label: :
7
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>,<Operando
1
>,<Operando
2
>,<Resultado>)
Ejemplos
Expresin Cuartetos Otra representacin
S:=A+B*C * B C T
1
(*, B, C, T
1
)
+ A T
1
T
2
(+, A, T
1
, T
2
)
:= T
2
S (:=,T
2
, , S )
IF A<B THEN X:=B < A B E
1
(<, A, B, E
1
)
IFF E
1
E
2
(IFF, E
1
, , E
2
)
:= B X (:=, B, , X )
LABEL E
2
(LABEL, , , E
2
)
8
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] [tercetos]
1. (mul,c,d,t1) 1: (mul,c,d)
2. (add,b,t1,t2) 2: (add,b,(1))
3. (:=,a,t2,_) 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>, <Operando
1
>, <Operando
2
>)
Hacen referencia a otro terceto
Son equivalentes a rboles de Sintaxis Abstracta
9
Generacin de cdigo. Procesadores de
Lenguaje I
Tercetos y Tercetos Indirectos
Ejemplos
Expresin Tercetos
S:=A+B*C 1 (*, B, C)
2 (+, A, (1))
3 (:=, 2, S)
IF A<B THEN X:=B 1 (<, A, B)
2 (IFF,(1),(4))
3 (:=, B, X)
4 (,,)
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 Tercetos Ind.
S:=A+B*C 1 (*, B, C)
X:=A+B*C 2 (+, A, (1))
3 (:=, (2), S)
4 (:=, (2), X)
VE=(1, 2, 3, 1, 2, 4)
WHILE X<B DO X:=X+1 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)
10
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 Reglas semnticas
P {offset=0}
D
DD; D
Did: T {ponerTabla(id.lex, T.tipo, offset)
offset=offset+T.ancho}
Tinteger {T.tipo=integer
T.ancho=4}
Treal {T.tipo=real
T.ancho=8}
Tarray[num]
of T {T
0
.tipo=array(num.lex, T
1
.tipo)
T
0
.ancho=num.lex*T
1
.ancho}
TT {T
0
.tipo=pointer(T
1
.tipo)
T
0
.ancho=4}
11
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: E
1
a t
1
; E
2
a t
2
; t= t
1
+t
2
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
t
1
, t
2
, , t
3
,... 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 {p=lookup(id.lex);
if (p!=null) S.cdigo := E.cdigo || gen(p := E.lugar)}
E E+E {E
0
.lugar := tempnueva();
E
0
.cdigo := E
1
.cdigo || E
2
.cdigo ||
gen(E
0
.lugar := E
1
.lugar + E
2
.lugar)}
E E*E {E
0
.lugar := tempnueva();
E
0
.cdigo := E
1
.cdigo || E
2
.cdigo ||
gen(E.lugar := E
1
.lugar * E
2
.lugar)}
E -E {E
0
.lugar := tempnueva();
E
0
.cdigo := E
1
.cdigo || gen(E
0
.lugar:=menosu E
1
.lugar)}
E (E) {E
0
.lugar := E
1
.lugar;
E
0
.cdigo := E
1
.cdigo}
E id {p=lookup(id.lex), if (p!=null) E.lugar := p;}
12
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)}
E E+E {E
0
.lugar := tempnuevo();
if (E
1
.tipo=integer and E
2
.tipo=integer) then
c=gen(E
0
.lugar := E
1
.lugar + E
2
.lugar)
E
0
.tipo=int
if (E
1
.tipo=real and E
2
.tipo=real) then
c=gen(E
0
.lugar := E
1
.lugar + E
2
.lugar)
E
0
.tipo=real
if (E
1
.tipo=integerl and E
2
.tipo=real) then
c=gen(E
0
.lugar :=inttoreal E
1
.lugar + E
2
.lugar)
E
0
.tipo=real
if (E
1
.tipo=real and E
2
.tipo=integer) then
c=gen(E
0
.lugar :=l E
1
.lugar + inttoreal E
2
.lugar)
E
0
.tipo=real}
E
0
.cdigo := E
1
.cdigo || E
2
.cdigo ||c
.
Ej.: x:=y+i*j
t
1
:=multi(i,j)
t
3
:=inttoreal t
1
t
2
:=addr(y, t
3
)
x:=t
2
Generacin de cdigo. Procesadores de
Lenguaje I
Evaluacin de Declaraciones y
Expresiones
Ej.: a: int; c: real;
a=0;c=a*4.0+1;
P
Cdigo
Intermedio:
t
1
:=0
a:=t
1
t
2
:=inttoreal a
t
3
:= t
2
*4.0
t
4
:= t
3
+1
c:=t
4
Ds
id
(a)
Ds D
Ds D
T
(int)
id
(c)
T
(real)

Ss
S Ss
S Ss
id
(a)
E
(0)
:
=
id
(c)
E =
E E
(1)
+
*
E
(4)
E
(a)

:
100
entero
a
104
real
c
TS
;
13
Generacin de cdigo. Procesadores de
Lenguaje I
Evaluacin de Declaraciones y
Expresiones
Con atributo cdigo: concatenar atributos sintetizados
a: int; c: real;
a=0;c=a*4.0+1;
t
1
:=0
a:=t
1
t
2
:=inttoreal a
t
3
:= t
2
*4
t
4
:= t
3
+1
c:=t
4
Ss
S Ss
S Ss
id
(a)
E
(0)
=
id
(c)
E =
E E
(1)
+
*
E
(4)
E
(a)

t
1
:=0
a:=t
1
t
2
:=inttoreal a
t
3
:= t
2
*4
t
4
:= t
3
+1
t
2
:=inttoreal a
t
3
:= t
2
*4
t
2
:=inttoreal a
t
3
:= t
2
*4
t
4
:= t
3
+1
c:=t
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;
t
1
:=0
a:=t
1
t
2
:=inttoreal a
t
3
:= t
2
*4
t
4
:= t
3
+1
c:=t
4
Ss
S Ss
S Ss
id
(a)
E
(0)
=
id
(c)
E =
E E
(1)
+
*
E
(4)
E
(a)

t
1
:=0
a:=t
1
t
4
:= t
3
+1
t
2
:=inttoreal a
t
3
:= t
2
*4
c:=t
4
Salida global
14
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 {E
0
.lugar := tempnuevo();
emitir(E
0
.lugar := E
1
.lugar + E
2
.lugar)}
E E*E {E
0
.lugar := tempnuevo;
emitir(E
0
.lugar := E
1
.lugar * E
2
.lugar)}
E -E {E
0
.lugar := tempnuevo();
emitir(E
0
.lugar:=menosu E
1
.lugar)}
E (E) {E
0
.lugar := E
1
.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 {E.lugar := nuevatemp(); emitir(E.lugar := num.lex)}
b) E num {E.lugar := num.lex)}
a=3+b+7+c
tmp1=3
tmp2=tmp1+b
tmp3=7
tmp4=tmp2+tmp3
tmp5=tmp4+c
a=tmp5
tmp1=3+b
tmp2=tmp1+7
tmp3=tmp2+c
a=tmp3
15
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)
E
0
id [E
1
] {p=lookup(id.lex)
E
0
.lugar=tempnuevo()
t=tempnuevo()
gen(t = E
1
.lugar * size(p))
gen(E
0
.lugar =p[ t ] )
}
Sid [E
1
]=E
2
{p=lookup(id.lex)
t=tempnuevo()
gen(t = E
1
.lugar * size(p))
gen( p[ t ]= E
2
.lugar)
}
Tambin puede hacerse con indirecciones (punteros)
a=p[i] t1=&p;
t2=t1+i;
a=*t2
Ejemplo:
a[i+1]=a[j+2]+3;
t1=j+2
t2=t1*size(a)
t3=a[t2];
t4=t3+3
t5=i+1
t6=t5*size(a)
a[t6]=t4
Generacin de cdigo. Procesadores de
Lenguaje I
Evaluacin de Arrays (1D)
Sin atributo cdigo: escribir cdigo globalmente
a[i+1]=a[j+2]+3;
S
E E
E E
+
id
(a)
t
1
:=i+1
t
2
:=j+2
Salida global
[ ]
id
(i)
num
(1)
=
E
E E
+
id
(a)
[ ]
id
(j)
num
(2)
Ejemplo:
a[i+1]=a[j+2]+3;
t
1
:=i+1
t
2
:=j+2
t
3
:=t
2
*size(a)
t
4
:=a[t
3
]
t
5
:= t
1
*size(a)
a[t
5
]:=t
4
t
3
:=t
2
*size(a)
t
4
:=a[t
3
]
t
5
:= t
1
*size(a)
a[t
5
]:=t
4
16
Generacin de cdigo. Procesadores de
Lenguaje I
Expresiones con registros y punteros
Registros
Los registros tienen campos con desplazamiento fijo
typedef struct cplx{
double real;
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;

cplx.imag
cplx.real
base de cplx
desplaz. campo imag
Generacin de cdigo. Procesadores de
Lenguaje I
Expresiones con registros y punteros
Combinaciones de punteros y registros
cplx *c1, *c2;

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

cplx.imag
cplx.real
base de cplx
desplaz. campo imag
17
Generacin de cdigo. Procesadores de
Lenguaje I
Expresiones con registros y punteros
Ejemplos
cplx *c1, *c2;

c1 ->real=c2->imag;

cplx.imag
cplx.real
base de cplx
desplaz. campo imag
Ejemplo:
num.real=num.imag;
t2=&num
t3=t1+offset(num,imag)
t1=*t1
t4=&num
t5=t4+offset(num,real)
*t5=t1
Ejemplo:
c1->real= c2-> num.imag;
t2=c1+offset(c1,imag)
t3=*t2
t4=c2+offset(c2,real)
*t4=t3
Generacin de cdigo. Procesadores de
Lenguaje I
Generalizacin a k dimensiones: A[i
1
][i
2
][i
k
]
posicion: base+((((i
1
*n
2
+i
2
)*n
3
+i
3
))*n
k
+i
k
)*w
Ecuacin recurrente:
e
1
=i
1
e
m
=e
m-1
*n
m
+i
m
Evaluacin de Arrays Multi-
dimensionales
Un array se accede como un bloque
de posiciones consecutivas. Si empieza
en 0:
posicion a[i]: base+i*w
Matriz 2 dimensiones (por filas): A[i
1
][i
2
]
posicion: base+(i
1
*n
2
+i
2
)*w
a[1]

a[0]
a[i]
base w

A[i
1
][i
2
] A[i
1
][0]

A[0][i
2
] A[0][0]
n
2
i
2
i
1
18
Generacin de cdigo. Procesadores de
Lenguaje I
Evaluacin de Arrays Multi-
dimensionales
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:
Lista
0
::=Lista
1
, E
Lista.lugar almacena el valor e
m
Lista.ndim es la dimensin (Lista
0
.ndim= Lista
1
.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 Multi-
dimensionales
Producciones Regla Semntica
S L := E {if (L.offset == null) gen(L.lugar= E.lugar
else gen(L.lugar [ L.offset ]=E.lugar}
E L {if (L.offset == null) gen(E.lugar= L.lugar
else E.lugar=tempnuevo(); gen(E.lugar =L.lugar [ L.offset ])}
E num {E.lugar=tempnuevo(); gen(E.lugar = num.val)}
L id {p=lookup(id.lex), L.lugar := p, L.offset=null}
L Lista] {L.lugar= tempnuevo();
L.offset= tempnuevo();
gen(L.lugar := base(Lista.array) )
gen(L.offset = Lista.lugar * ancho (Lista.array))}
ListaLista][E {t= tempnuevo(), m=Lista
1
.ndim+1
gen(t = Lista
1
.lugar * limite(Lista
1
.array,m))
gen(t = t + E.lugar)
Lista
0
.array=Lista
1
.array
Lista
0
.lugar=t, Lista
0
.ndim=m}
Listaid [E {p=lookup(id.lex), Lista.array= p
Lista.lugar=E.lugar
Lista.ndim=1}
19
Generacin de cdigo. Procesadores de
Lenguaje I
Evaluacin de Arrays Multi-
dimensionales
Ej.: x:=M[3][1] (M de tipo array{[04]x[04],int})
S
1
:= L
1
E
1
[ Lista
2
E
3
num (1)
Lista
1
]
L
2
[ E
2
id
(M)
num (3)
id
(x)
]
base
limite(i)
ancho
celda
Cdigo
Intermedio:
t
1
:=3
t
2
:=1
t
3
:=t
1
*5
t
3
:=t
3
+ t
2
t
4
:=base(M)
t
5
:=t
3
*4
t
6
:=t
4
[t
5
]
x:=t
6
Generacin de cdigo. Procesadores de
Lenguaje I
S
1
: /S
1
->L
1
=E
1
/
L
1
: L
1
.lugar=x /L
1
->id/
L
1
.offset=null
E
1
: /E
1
->L
2
/
L
2
: /L
2
->Lista
1
]/
Lista
1
: /Lista
1
->Lista
2
][E
3
/
Lista
2
: /Lista
2
->E
2
]/
E
2
: E
2
.lugar=t
1
/E
2
->num/
t
1
=3
Lista
2
.lugar=t
1
Lista
2
.ndim=1
Lista
2
.array=M
E
3
: E
3
.lugar=t
2
/E
3
->num/
t
2
=1
Lista
1
.lugar=t
3
m=2
t
3
= t
1
*5 (*lista
2
*limite(M,1)*)
t
3
= t
3
+t
2
(*suma indice E
3
*)
Lista
1
.array=M
Lista
1
.lugar=t
3
Lista
1
.ndim=m
L
2
.lugar= t
4
L
2
.offset=t
5
t
4
=base(M)
t
5
=t
3
*ancho(M) (*lista1*ancho*)
E
1
.lugar=t
6
t
6
=t
5
[t
5
]
x=t
6
t
1
:=3
t
2
:=1
t
3
:=t
1
*5
t
3
:=t
3
+ t
2
t
4
:=base(M)
t
5
:=t
3
*4
t
6
:=t
4
[t
5
]
x:=t
6
20
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
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
if a < b goto L1
goto L2
L1 x:=1
L2
E, a<b, tiene un
atributo: t1
E, a<b, tiene tres
atributos: L1, L2, cdigo
Generacin de cdigo. Procesadores de
Lenguaje I
GCI para Expresiones Booleanas
Ejemplos:
if if E E then then S1 else S2 S1 else S2
Codigo 3 direcciones
C C digo digo de de evaluaci evaluaci n n de E de E
( (hacia hacia qu qu etiqueta etiqueta salto salto) )
E.true E.true: :
C C digo digo para para S1 S1
goto goto Seguir Seguir
E.false E.false: :
C C digo digo para para S2 S2
Seguir:
siguientes instrucciones
while while (E) S (E) S
Codigo 3 direcciones
Comienzo Comienzo: :
C C digo digo de de evaluaci evaluaci n n de E de E
( (hacia hacia qu qu etiqueta etiqueta salto salto) )
E.true E.true: :
C C digo digo para para S S
goto goto Comienzo Comienzo
E.false E.false: :
siguientes instrucciones
21
Generacin de cdigo. Procesadores de
Lenguaje I
GCI- Condiciones Booleanas
Evaluacin en cortocircuito
AND: E0 -> E1 || E2
true
false
E0
E2
E1
true
true
false
false
label E1.false:
Generacin de cdigo. Procesadores de
Lenguaje I
GCI- Condiciones Booleanas
Evaluacin en cortocircuito
AND: E0 -> E1 && E2
true
false
E0
E2
E1
true
true
false
false
label E1.true:
22
Generacin de cdigo. Procesadores de
Lenguaje I
GCI- Condiciones Booleanas
Evaluacin en cortocircuito
Produccin Regla Semntica
E:=true {E.codigo = gen (goto E.true)}
E:=false {E.codigo = gen (goto E.false)}
E:=id
1
relop id
2
{E.code=gen(if id
1
.lugar relop id
2
.lugar goto E.true)||
gen(goto E.false)}
E
0
:=E
1
or E
2
{E
1
.false= newlabel()
E
1
.true= E
0
.true
E
2
.true= E
0
.true
E
2
.false= E
0
.false
E
0
.codigo= E
1
.codigo || gen(E
1
.false :) || E
2
.codigo}
E
0
:=E
1
and E
2
{E
1
.true= newlabel()
E
1
.false= E
0
.false
E
2
.true= E
0
.true
E
2
.false= E
0
.false
E
0
.codigo= E
1
.codigo || gen(E
1
.true :) || E
2
.codigo}
E
0
:=(E
1
) {E
1
.false= E
0
.false
E
1
.true= E
0
.true
E
1
.code= E
0
.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

23
Generacin de cdigo. Procesadores de
Lenguaje I
GCI- Estructuras de control
CONDICIONAL: S-> if (B) S else S
E0
S2
B
true
false
S1
label S.next:
goto S.next:
label B.true:
label B.false:
Generacin de cdigo. Procesadores de
Lenguaje I
GCI- Estructuras de control
BUCLE: S-> while (B) do S
E0
B
true
false
S
label S.next:
goto inicio
label B.true:
label inicio:
24
Generacin de cdigo. Procesadores de
Lenguaje I
GCI- Sentencias Condicionales
Produccin Regla Semntica
S:=if E then S
1
{E.true= newlabel()
E.false= S
0
.next
S
1
.next= S
0
.next
S
0
.codigo=E.codigo||gen(E.true :)||S
1
.codigo}
S
0
:=if E then S
1
else S
2
{E.true= newlabel()
E.false= newlabel()
S
1
.next= S
0
.next
S
2
.next= S
0
.next
S
0
.codigo=E.codigo||gen(E.true :)||S
1
.codigo||
gen(goto S
0
.next||gen(E.false :)||S
2
.codigo}
S
0
:= while E do S
1
{begin = newlabel()
E.true= newlabel()
E.false= S
0
.next
S
1
.next= begin
S
0
.codigo=gen(begin :)||E.codigo|| gen(E.true :)||
S
1
.codigo||gen(goto begin)}
Atributo heredado S.next: instruccin continuacin
Problema: etiquetas desconocidas a priori (idem)
Generacin de cdigo. Procesadores de
Lenguaje I
GCI- Condicionales sin atrib cdigo
Produccin Regla Semntica
S
0
:=if {E.true= newlabel(); E.false= S
0
.next}
E then {emitir(label E.true :); S
1
.next= S
0
.next;}
S
1
S
0
:=if {E.true= newlabel(); E.false= newlabel()}
E then {emitir(label E.true :); S
1
.next= S
0
.next}
S
1
else {emitir(label E.false :); S
2
.next= S
0
.next}
S
2
S
0
:= while {begin = newlabel(); E.true= newlabel();
E.false= S
0
.next; emitir(label begin :);}
E do {S
1
.next= begin; emitir(label E.true :); }
S
1
Atributo heredado S.next: instruccin continuacin
25
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
S
1
while E
1
E
2
S
2
do
if else S
4
S
3
> id
(a)
id
(b)
> id
(s)
id
(K)
Cdigo 3
direcciones
L
1
: if s<K goto L
2
goto L
0
L
2
: if a>b goto L
3
goto L
4
L
3
: t
1
=s+a
s=t
1
goto L
0
L
4
: t
2
=s-a
s=t
2
goto L
1
L
0
:
Generacin de cdigo. Procesadores de
Lenguaje I
-
S
1
.next=L
0
(**)
S
1
: /S
1
->while E
1
do S
2
/
S
1
.next=L
0
begin=L
1
E
1
.true=L
2
E
1
.false=L
0
E
1
: /E
1
->id op id/
E
1
.codigo=if s<K goto L
2
goto L
0
S
2
.next=L
0
S
2
: /S
2
->if E
2
then S
3
else S
4
/
E
2
.true=L
3
E
2
.false=L
4
E
2
: /E
2
->id op id/
E
2
.codigo=if a>b goto L
3
goto L
4
goto L
0
S
3
.next=L
1
S
3
: /S
3
->s=s+a/
S
3
.codigo=t
1
=s+a
s=t
1
S
4
.next=L
0
S
4
: /S
4
->s=s-a/
S
4
.codigo=t
2
=s+a
s=t
2
S
2
.codigo=
S
1
.codigo=
if a>b goto L
3
goto L
4
L
3
: t
1
=s+a
s=t
1
goto L
0
L
4
: t
2
=s-a
s=t
2
L
1
: if s<K goto L
2
goto L
0
L
2
: if a>b goto L
3
goto L
4
L
3
: t
1
=s+a
s=t
1
goto L
0
L
4
: t
2
=s-a
s=t
2
goto L
1
L
0
:
26
Generacin de cdigo. Procesadores de
Lenguaje I
Relleno con retroceso (back-patching)
goto target
...
goto target
...
target: mov foobar,r1
Tabla
target

goto target
.
goto target

target: mov foobar, r1


backpatch list
(lista enlazada)
Cdigo
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
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
27
Generacin de cdigo. Procesadores de
Lenguaje I
GCI para llamadas a funciones
Instrucciones 3 direcciones
param x entry f
call f, n return x
Cdigo P
mst ent f
cup 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
ent f
lod x
lod y
adi
ldc 1
adi
ret
mst
ldc 2
ldc 3
adi
ldc 4
cup f
Cdigo 3-dir Cdigo P
Generacin de cdigo. Procesadores de
Lenguaje I
Llamadas a funciones dentro de
expresiones
Producciones Regla Semntica
S id := E {p=lookup(id.lex);
if (p!=null) emitir(p := E.lugar)}
E E+E {E
0
.lugar := tempnuevo();
emitir(E
0
.lugar := E
1
.lugar + E
2
.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)}

28
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);
t
1
:=0
a:=t
1
t
2
:=4*a
param t
2
param 1
t
3
=call f 2
t
4
:= 1+t
3
c:=t
4
S
id
(c)
E =
E
E
(1)
+
( lista id
(f)
t
2
:=4*a
c:=t
4
)
lista ,
E
E
(4)
* E
(a)
E
(1)
t
2
t
2
1
param t
2
param 1
t
3
=call f 2
t
4
=1+t
3

Вам также может понравиться