Sei sulla pagina 1di 28

Generacin de cdigo.

Procesadores de Lenguaje I

Generacin de Cdigo Intermedio


Proceso de Sntesis

Lenguaje Intermedio Generacin de Cdigo 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

Ventajas del cdigo intermedio


Facilitar la divisin en fases del proyecto


Scanner Parser LI Generador de Cdigo Objeto

Fuente

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

C front-ends Pascal

back-ends

Intel X

Ada C++ Java

Generador de Cdigo Intemedio

Dec-Alpha

Optimizacin independiente de mquina

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 id3


semantic analyzer

* 60

:=
Symbol Table position .... initial . rate.

id1

+ id2l id3 * inttoreal 60

intermediate code generator

E r r o r s

Generacin de cdigo. Procesadores de Lenguaje I

Fase de Sntesis
Symbol Table position .... initial . rate. intermediate code generator temp1 := inttoreal(60) temp2 := id3 * temp1 temp3 := id2 + temp2 id1 := temp3 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
3 address code

E r r o r s

Tipos de representaciones intermedias

Generacin de cdigo. Procesadores de Lenguaje I

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

Tipos de representaciones intermedias


Propiedades:

Generacin de cdigo. Procesadores de Lenguaje I

Fcil de producir en el anlisis semntico Fcil de traducir a cdigo mquina real Instrucciones simples y concisas, de fcil optimizacin rboles de Sintaxis Abstracta Notacin Polaca Inversa (RPN) Cdigo P Cdigos de tres direcciones
Cuartetos Tercetos Tercetos Indirectos

Tipos

Representaciones intermedias: RPN


Notacin Polaca Inversa (RPN)

Generacin de cdigo. Procesadores de Lenguaje I

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 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.
1 y &x cond

Ejemplo 2: if cond then x=3 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
3 &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
rbol E E T F A + T F B A ASA + B S A B S:=A+B*C := + * C A < B X IF A<B THEN X:=B IF := B A A[I]:=B := [] I B

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 tmp1 = c+d tmp2 = b*tmp1 a = tmp2

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

Generacin de cdigo. Procesadores de Lenguaje I

Cdigos de Tres Direcciones


Ejemplos (relacionar con ASA)
Ejemplo 1: a=b*-c+4 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

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

endif_label: endif_label:

Instrucciones en Cdigo 3 direcciones

Generacin de cdigo. Procesadores de Lenguaje I

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 x:=y[i] x[i]=y

Asignaciones indexadas 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 S:=A+B*C Cuartetos * + := Otra representacin B C A T1 T2 S B T1 T2 (*, B, C, T1) (+, A, T1, T2) (:=,T2, , S ) (<, A, B, E1) (IFF, E1, , E2 ) (:=, B, , X ) (LABEL, , , E2)

IF A<B THEN X:=B

< A IFF E1 := B LABEL

E1 E2 X E2

Implementacin de cdigo 3 direcciones


Implementacin con cuartetos

Generacin de cdigo. Procesadores de Lenguaje I

4 campos: (op,y,z,x) para x=y op z Campos se anulan si no se necesitan, ej.: (rd,x,,) El cuarto elemento siempre es un temporal En lugar de nombrarlo, utilizar el propio ndice del terceto
[tercetos] 1: (mul,c,d) 2: (add,b,(1)) 3: (:=,a,(2))

Implementacin con tercetos


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

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
S:=A+B*C

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

IF A<B THEN X:=B

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

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)

WHILE X<B DO X:=X+1

Generacin de Cdigo Intermedio: Declaraciones

Generacin de cdigo. Procesadores de Lenguaje I

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

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}

TT

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)} {E0.lugar := tempnueva(); E0.cdigo := E1.cdigo || gen(E0.lugar:=menosu E1.lugar)} {E0.lugar := E1.lugar; E0.cdigo := E1.cdigo} {p=lookup(id.lex), if (p!=null) E.lugar := p;}

E -E E (E) E id

Generacin de cdigo. Procesadores de Lenguaje I

Conversiones de Tipos
Producciones Regla Semntica
S id := E E E+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
t1:=multi(i,j) t3:=inttoreal t1 t2:=addr(y, t3) x:=t2

Ej.: x:=y+i*j

Evaluacin de Declaraciones y Expresiones


Ej.: a: int; c: real; a=0;c=a*4.0+1;
P Ds Ds Ds D id : T D id : T S id = E Ss ; S Ss Ss TS
a entero 100

Generacin de cdigo. Procesadores de Lenguaje I

c real 104

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

(c) (real)

(a)

(0) (c)

id =E E + E

(a) (int)

(1)

(a)

E * E

(4)

Evaluacin de Declaraciones y Expresiones

Generacin de cdigo. Procesadores de Lenguaje I

Con atributo cdigo: concatenar atributos sintetizados a: int; c: real; t1:=0 a=0;c=a*4.0+1; a:=t1
Ss S
t1:=0 t2:=inttoreal a t3:= t2 *4 t4:= t3+1

Ss
a:=t1

c:=t4

(a)

id = E

(0) (c)
E E * E id

S = E +
t2:=inttoreal a t3:= t2 *4

Ss

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

(1)

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

(a)

(4)

Evaluacin de Declaraciones y Expresiones


Sin atributo cdigo: escribir cdigo globalmente a: int; c: real; a=0;c=a*4.0+1;
Ss S
t1:=0

Generacin de cdigo. Procesadores de Lenguaje I

t1:=0

Ss
a:=t1

a:=t1 t2:=inttoreal a t3:= t2 *4

(a)

id = E

(0) (c)
E E * E id

S =

c:=t4

Ss
t4:= t3+1

t4:= t3+1 c:=t4

E +

Salida global

t2:=inttoreal a t3:= t2 *4

(1)

(a)

(4)

Generacin de cdigo. Procesadores de Lenguaje I

CGI sin utilizar atributo cdigo


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

Regla Semntica

E E+E E E*E E -E E (E) E id

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 tmp2=tmp1+b tmp3=7 tmp4=tmp2+tmp3 tmp5=tmp4+c a=tmp5 tmp1=3+b tmp2=tmp1+7 tmp3=tmp2+c a=tmp3

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)

E0id [E1]

Tambin puede hacerse con indirecciones (punteros)


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

{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) }

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;
t5:= t1*size(a)

S id [ E E + ] E
t1:=i+1

a[t5]:=t4 t3:=t2*size(a)

(a)

= id [ E

E E +

t4:=a[t3]

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

(i)

id

(1)

num

(a)

]
t2:=j+2

(j)

id

(2)

num

Salida global

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;


Eid -> id {

cplx.real cplx.imag

base de cplx desplaz. campo imag

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

Generacin de cdigo. Procesadores de Lenguaje I

Expresiones con registros y punteros


Ejemplos cplx *c1, *c2; c1 ->real=c2->imag;
Ejemplo: num.real=num.imag; t2=&num t3=t1+offset(num,imag) t1=*t1 t4=&num t5=t4+offset(num,real) *t5=t1
cplx.real cplx.imag base de cplx desplaz. campo imag

Ejemplo: c1->real= c2-> num.imag; t2=c1+offset(c1,imag) t3=*t2 t4=c2+offset(c2,real) *t4=t3

Evaluacin de Arrays Multidimensionales


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

Generacin de cdigo. Procesadores de Lenguaje I

a[i]

base i2 A[0][0]

a[1] a[0]

posicion a[i]: base+i*w posicion: base+(i1*n2+i2)*w

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


A[0][i2]

i1

A[i1][0]

A[i1][i2]

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


n2

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


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

Evaluacin de Arrays Multidimensionales


Generacin de cdigo. Procesadores de Lenguaje I

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)

Evaluacin de Arrays Multidimensionales


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

Generacin de cdigo. Procesadores de Lenguaje I

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}

ListaLista][E

Listaid [E

Evaluacin de Arrays Multidimensionales


S1 L1 id := E1 L2 Lista1 ]

Generacin de cdigo. Procesadores de Lenguaje I

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

base limite(i) ancho celda

(x)

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

Lista2 ] [

E3 num (1)

(M)

id

E2

num (3)

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 t4:=base(M) Lista .ndim=m

L2.lugar= t4 L2.offset=t5 t4=base(M) t5=t3*ancho(M) E1.lugar=t6 t6=t5[t5] x=t6

t5:=t3*4 t6:=t4[t5] (*lista1*ancho*) x:=t6

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
if a < b goto L1 goto L2 x:=1

E, a<b, tiene tres atributos: L1, L2, cdigo

L1 L2

Generacin de cdigo. Procesadores de Lenguaje I

GCI para Expresiones Booleanas


Ejemplos:
if E then S1 else S2 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 while (E) S 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

Generacin de cdigo. Procesadores de Lenguaje I

GCI- Condiciones Booleanas


Evaluacin en cortocircuito

AND: E0 -> E1 || E2

true true

E1 false false

label E1.false: true E2

false

E0

Generacin de cdigo. Procesadores de Lenguaje I

GCI- Condiciones Booleanas


Evaluacin en cortocircuito

AND: E0 -> E1 && E2

true true

E1 false false

label E1.true: true E2 false E0

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 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}

E0:=E1and E2

E0:=(E1)

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

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

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 :); }

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 do S2
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:

(s)

id

> id if E2 S3 else S4

(K)

(a)

id

> id

(b)

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=

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 Implementacin sencilla: archivo temporal

Una solucin es diferir su ajuste final a una pasada posterior


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

Tabla
target backpatch list
(lista enlazada)

target:

goto target . goto target target: mov foobar, r1

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

Generacin de cdigo. Procesadores de Lenguaje I

GCI para llamadas a funciones


Instrucciones 3 direcciones
param x call f, n entry f return x ent f ret
entry f t1=x+y t2=t1+1 return t2 t1=2+3 param t1 param 4 call f 2 ent lod lod adi ldc adi ret mst ldc ldc adi ldc cup f x y 1

Cdigo P
mst cup

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

2 3 4 f

f(2+3,4);

Cdigo 3-dir

Cdigo P

Llamadas a funciones dentro de expresiones


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

Generacin de cdigo. Procesadores de Lenguaje I

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

E id E id(lista) {p=lookup(id.lex), if (p!=null) E.lugar := p;} {para cada elemento p en lista.pila emitir(param p) emitir(call id.lugar)}

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
c:=t4

(c)

id

= E

E + id

t4=1+t3 param t2

t1:=0 a:=t1 t2:=4*a param t2 param 1 t2 1 t2 t2:=4*a t3=call f 2 t4:= 1+t3 c:=t4 param 1 t3=call f 2

(1) (f)

( lista )

(1)

E , lista E E *

(4)

(a)

Potrebbero piacerti anche