codigo intermedio
TRANSCRIPT
1
Generación de código. Procesadores de Lenguaje I
Generación de Código IntermedioProceso de Síntesis
Lenguaje IntermedioGeneración de Código
Ventajas del código intermedioFacilitar la fase de optimizaciónAumentar la portabilidad del compilador de una máquina a otra
Se puede utilizar el mismo analizador para diferentes generadoresSe pueden utilizar optimizadores independientes de la máquina
Facilitar la división en fases del proyecto
Fuente Scanner ParserGenerador
deCódigo
TDS
ObjetoLI
Generación de código. Procesadores de Lenguaje I
Generación de Código IntermedioAumentar la portabilidad del compilador de una máquina a otra
Se puede utilizar el mismo analizador para diferentes generadoresSe pueden utilizar optimizadores independientes de la máquina
Generadorde
Código Intemedio
Optimización independiente
de máquina
C
Pascal
Ada
C++
Java
Intel X
Dec-Alpha
Motorola
N+M vs N*M
front-endsback-ends
2
Generación de código. Procesadores de Lenguaje I
Fase de Análisis
Errors
position := initial + rate * 60
lexical analyzer
syntax analyzer
semantic analyzer
intermediate code generator
id1 := id2 + id3 * 60
:=
id1id2l
id3
+*
60
:=
id1id2l
id3
+*
inttoreal
60
Symbol Table
position ....
initial ….
rate….
Generación de código. Procesadores de Lenguaje I
Fase de SíntesisErrorsintermediate code generator
code optimizer
final code generator
temp1 := inttoreal(60)temp2 := id3 * temp1temp3 := id2 + temp2id1 := temp3
temp1 := id3 * 60.0id1 := id2 + temp1
MOVF id3, R2MULF #60.0, R2MOVF id2, R1ADDF R1, R2MOVF R1, id1
position ....
initial ….
rate….
Symbol Table
3 address code
3
Generación de código. Procesadores de Lenguaje I
Tipos de representaciones intermedias
La representación del código intermedio dependede la máquina objeto:
0-direcciones: código para máquinas de pila (código P)
2-direcciones: códigos para máquinas con operacionessobre registros de memoria
3-direcciones: código para máquinas de arquitecturaRISC
En todo caso, añade un recorrido descendenteadicional para generar el código final
Generación de código. Procesadores de Lenguaje I
Tipos de representaciones intermedias
Propiedades:Fácil de producir en el análisis semánticoFácil de traducir a código máquina realInstrucciones simples y concisas, de fácil optimización
TiposÁrboles de Sintaxis AbstractaNotación Polaca Inversa (RPN)Código PCódigos de tres direcciones
CuartetosTercetosTercetos Indirectos
4
Generación de código. Procesadores de Lenguaje I
Representaciones intermedias: RPN
Notación Polaca Inversa (RPN)Los operadores van después de los operandos
S = A + B * C → S A B C * + =
VentajasFacilidad para generar código a partir de ellaEs la notación más sencilla para el lenguaje intermedio
InconvenientesEl código es difícil de entenderPoca flexibilidadNo es útil para optimización de código
Generación de código. Procesadores de Lenguaje I
Representaciones intermedias: PCódigo P
Extensión RPN para máquina completa (etiquetas, saltos)Razones históricas (intérpretes Pascal)Primer caso de máquina virtual
Todas las operaciones toman como argumentos la pilaCargar/almacenar: lod, lda, ldc, stoAritmética: adi, sbi, mpiSaltos: ujp, fjp, lab
Similares ventajas e inconvenientes (es un CI muy próximo a un lenguaje ensamblador)
5
Generación de código. Procesadores de Lenguaje I
Representaciones intermedias: PEjemplos Código P
Ejemplo 2:ifif condcond thenthen x=3x=3
Codigo Plodlod condcond // // cargacarga condcondfjpfjp L1 // L1 // sisi falsofalso saltasalta a L1a L1ldalda x // x // cargacarga direcciondireccion xxldcldc 3 // 3 // cargacarga constanteconstante 33stosto // // almacenaalmacena tope en tope en infinflab L1 // lab L1 // etiquetaetiqueta L1L1
…
&x
y
1
…
cond
Ejemplo 1:x:=y+1x:=y+1
Codigo Pldalda x // x // cargacarga direcciondireccion xxlodlod y // y // cargacarga valor yvalor yldcldc 1 // 1 // cargacarga constanteconstante 11adiadi // // sumasuma 2 pos 2 pos pilapilastosto // // almacenaalmacena tope en inf.tope en inf.
…
&x
3
Generación de código. Procesadores de Lenguaje I
Árboles de Sintaxis AbstractaSon árboles de derivación en los que no existe información 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
Generación de código. Procesadores de Lenguaje I
Códigos de Tres DireccionesSentencias del estilo x = y op z
Cada línea de código tiene un operador y hasta tres direccionesEs una representación lineal del ASAUso generoso de variable temporalesDirectamente relacionado con evaluación de expresiones
Ejemplo: a = b*(c+d) se traduce a:tmp1 = c+dtmp2 = b*tmp1a = tmp2
Generación de código. Procesadores de Lenguaje I
Códigos de Tres DireccionesEjemplos (relacionar con ASA)
Ejemplo 1:a=b*-c+4
Codigo 3 direccionest1=-ct2=b*t1t3=4t4=t3+t2a=t4
Ejemplo 2:ifif condcond thenthen then_statementsthen_statementselseelse
else_statementselse_statements; ; end ifend if; ; Codigo 3 direccionest1 = t1 = condcondiffiff t1 t1 else_labelelse_labelcodigocodigo parapara ““then_statementsthen_statements””gotogoto endif_labelendif_label
else_labelelse_label: : codigocodigo parapara ““else_statementselse_statements””
endif_labelendif_label: :
7
Generación de código. Procesadores de Lenguaje I
Instrucciones en Código 3 direcciones
Asignaciones: x:=y op z (op aritmético o lógico)Asignaciones 1 argumento x:= op yCopia x:=ySalto incondicional: goto L (L etiqueta)Salto condicional gotoc x L frecuente.: iff x L (if false)Salto condicional if x relop y goto LEtiquetas: label LLlamada a subrutina:param x1...param xncall p,nret
Asignaciones indexadasx:=y[i]x[i]=y
Asignaciones con punterosx:=&y, x:=*y, *x:=y
Generación de código. Procesadores de Lenguaje I
Códigos de 3 direccionesCada línea de código tiene un operador y hasta tres direccionesTipos: Cuartetos, Tercetos, Tercetos IndirectosCuartetos
Se representan por cuatro valores:(<OPERADOR>,<Operando1>,<Operando2>,<Resultado>)
EjemplosExpresión Cuartetos Otra representación
S:=A+B*C * B C T1 (*, B, C, T1)+ A T1 T2 (+, A, T1, T2):= T2 S (:=,T2, , S )
IF A<B THEN X:=B < A B E1 (<, A, B, E1)IFF E1 E2 (IFF, E1, , E2 ):= B X (:=, B, , X )LABEL E2 (LABEL, , , E2)
8
Generación de código. Procesadores de Lenguaje I
Implementación de código 3 direcciones
Implementación con cuartetos4 campos: (op,y,z,x) para x=y op zCampos se anulan si no se necesitan, ej.: (rd,x,,)
Implementación con tercetosEl cuarto elemento siempre es un temporalEn 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))
Generación de código. Procesadores de Lenguaje I
TercetosLos cuartetos son la herramienta más generalInconvenientes
Ocupan demasiado espacioRequieren muchas variables auxiliares para almacenar los resultados intermedios
Los tercetos resuelven este problema suprimiendo el operando del resultado, queda implícito y asociado a dicho terceto(<OPERADOR>, <Operando1>, <Operando2>)
Hacen referencia a otro tercetoSon equivalentes a Árboles de Sintaxis Abstracta
9
Generación de código. Procesadores de Lenguaje I
Tercetos y Tercetos IndirectosEjemplos
Expresión TercetosS:=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 análogos a los anteriores pero en lugar de ejecutarse secuencialmente se ejecutan según un vector llamado SECUENCIA
Son más fáciles de optimizarOcupan menos memoria, el mismo terceto aparece una vez
Generación de código. Procesadores de Lenguaje I
Tercetos Indirectos, EjemplosExpresión 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
Generación de código. Procesadores de Lenguaje I
Generación de Código Intermedio: Declaraciones
Definición de atributos con CI (sintetizado) + acciones semánticas
Construcción explícita de la tabla de símbolos
Se crean entradas para cada variable según su tipo
Reserva de espacio en función del tipo empleadooffset es una variable global con dirección de la tabla actualT.tipo, T.ancho: atributos que caracterizan cada entrada en la tabla
Simplificación: tabla de un solo procedimiento
Extensiones para declaraciones en procedimientos y ámbitos anidados
Generación de código. Procesadores de Lenguaje I
Declaraciones (1 procedimiento)Producciones Reglas semánticas
P→ {offset=0}D
D→D; DD→id: T {ponerTabla(id.lex, T.tipo, offset)
offset=offset+T.ancho}T→integer {T.tipo=integer
T.ancho=4}T→real {T.tipo=real
T.ancho=8}T→array[num]
of T {T0.tipo=array(num.lex, T1.tipo)T0.ancho=num.lex*T1.ancho}
T→↑T {T0.tipo=pointer(T1.tipo)T0.ancho=4}
11
Generación de código. Procesadores de Lenguaje I
Tercetos para ExpresionesSe construyen nombres temporales para los nodos interiores del árbol sintácticoSe calcula el valor del no terminal E en el lado izquierdo de E→E+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.código, es la secuencia instrucciones de tres direcciones para E
La función 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 declaración en la tabla de símbolos como lookup(id.lex) (detectar errores)
gen(.) genera código de tres direcciones
El número de temporales podría optimizarse posteriormente
Generación de código. Procesadores de Lenguaje I
Asignaciones y AritméticaProducciones Regla Semántica
S→ id := E {p=lookup(id.lex); if (p!=null) S.código := E.código || gen(p ’:=’ E.lugar)}
E→ E+E {E0.lugar := tempnueva();E0.código := E1.código || E2.código ||gen(E0.lugar ´:=´ E1.lugar ´+´ E2.lugar)}
E→ E*E {E0.lugar := tempnueva();E0.código := E1.código || E2.código ||gen(E.lugar ´:=´ E1.lugar ´*´ E2.lugar)}
E→ -E {E0.lugar := tempnueva();E0.código := E1.código || gen(E0.lugar´:=menosu´ E1.lugar)}
E→ (E) {E0.lugar := E1.lugar;E0.código := E1.código}
E→ id {p=lookup(id.lex), if (p!=null) E.lugar := p;}
12
Generación de código. Procesadores de Lenguaje I
Conversiones de TiposProducciones Regla Semántica
S→ id := E {p=lookup(id.lex); S.código := E.código || gen(p ’:=’ E.lugar)}
E→ E+E {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) thenc=gen(E0.lugar ´:=´ E1.lugar ´+´ E2.lugar)E0.tipo=real
if (E1.tipo=integerl and E2.tipo=real) thenc=gen(E0.lugar ´:=inttoreal´ E1.lugar ´+´ E2.lugar)E0.tipo=real
if (E1.tipo=real and E2.tipo=integer) thenc=gen(E0.lugar ´:=l´ E1.lugar ´+ inttoreal´ E2.lugar)E0.tipo=real}
E0.código := E1.código || E2.código ||c….
Ej.: x:=y+i*j
t1:=multi(i,j)
t3:=inttoreal t1
t2:=addr(y, t3)
x:=t2
Generación de código. Procesadores de Lenguaje I
Evaluación de Declaraciones y Expresiones
Ej.: a: int; c: real; a=0;c=a*4.0+1;
P
Código Intermedio:t1:=0
a:=t1
t2:=inttoreal a
t3:= t2 *4.0
t4:= t3+1
c:=t4
Ds
id(a)
Ds D
Ds D
T(int)
id(c)
T(real)
λ
Ss
S Ss
S Ssid(a)
E(0)
:
=
id(c)
E=
E E(1)
+
* E(4)
E(a)
λ
:
100
entero
a
104
real
cTS
;
13
Generación de código. Procesadores de Lenguaje I
Evaluación de Declaraciones y Expresiones
Con atributo código: concatenar atributos sintetizadosa: int; c: real; a=0;c=a*4.0+1;
t1:=0
a:=t1
t2:=inttoreal a
t3:= t2 *4
t4:= t3+1
c:=t4
Ss
S Ss
S Ssid(a)
E(0)
=
id(c)
E=
E E(1)
+
* E(4)
E(a)
λ
t1:=0a:=t1
t2:=inttoreal a
t3:= t2 *4
t4:= t3+1t2:=inttoreal a
t3:= t2 *4
t2:=inttoreal a
t3:= t2 *4
t4:= t3+1
c:=t4
Generación de código. Procesadores de Lenguaje I
Evaluación de Declaraciones y Expresiones
Sin atributo código: escribir código globalmentea: int; c: real; a=0;c=a*4.0+1;
t1:=0
a:=t1
t2:=inttoreal a
t3:= t2 *4
t4:= t3+1
c:=t4
Ss
S Ss
S Ssid(a)
E(0)
=
id(c)
E=
E E(1)
+
* E(4)
E(a)
λ
t1:=0a:=t1
t4:= t3+1
t2:=inttoreal a
t3:= t2 *4
c:=t4
Salida global
14
Generación de código. Procesadores de Lenguaje I
CGI sin utilizar atributo códigoProducciones Regla Semántica
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;}
Generación de código. Procesadores de Lenguaje I
Literales numéricos
Dos posibilidades: estricta (lugar es una dirección de memoria)lugar es un texto
Producciones Regla Semánticaa) 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
Generación de código. Procesadores de Lenguaje I
Expresiones con Arrays (1D)Suponiendo almacenamiento secuencial, las direcciones se calculan desde la dirección base (dirección en memoria) con desp. lineal:
a[i+1]:: dir_base(a)+(i+1)*sizeof(a)E0→id [E1] {p=lookup(id.lex)
E0.lugar=tempnuevo()t=tempnuevo()gen(t ’=’ E1.lugar ’*’ size(p))gen(E0.lugar ’=p[’ t ’]’ )}
S→id [E1]=E2 {p=lookup(id.lex)t=tempnuevo()gen(t ’=’ E1.lugar ’*’ size(p))gen(’ p[’ t ’]=’ E2.lugar)}
También 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+2t2=t1*size(a)t3=a[t2];t4=t3+3t5=i+1t6=t5*size(a)a[t6]=t4
Generación de código. Procesadores de Lenguaje I
Evaluación de Arrays (1D)Sin atributo código: escribir código globalmente
a[i+1]=a[j+2]+3;
S
E E
E E+
id(a) t1:=i+1
t2:=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;
t1:=i+1t2:=j+2
t3:=t2*size(a)
t4:=a[t3]
t5:= t1*size(a)
a[t5]:=t4
t3:=t2*size(a)
t4:=a[t3]
t5:= t1*size(a)
a[t5]:=t4
16
Generación de código. Procesadores de Lenguaje I
Expresiones con registros y punterosRegistros
Los registros tienen campos con desplazamiento fijo
typedef struct cplx{double real;double imag;
};código 3 dir independiente: función “offset (tipo,campo)” en la TS
E→id “.” 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 traducción directa
i=*x;*x=i;
…
…
cplx.imag
cplx.realbase de cplx
desplaz. campo “imag”
Generación de código. Procesadores de Lenguaje I
Expresiones con registros y punterosCombinaciones de punteros y registros
cplx *c1, *c2;…c1 ->real=c2->imag;
E→id “->” id { E.lugar=tempnuevo();t=tempnuevo();gen(t ‘=’ id1 +offset(’ id1.lex ’ ,’id2.lex ’)’);gen(E.lugar ’=*’ t);
}
…
…
cplx.imag
cplx.realbase de cplx
desplaz. campo “imag”
17
Generación de código. Procesadores de Lenguaje I
Expresiones con registros y punterosEjemplos
cplx *c1, *c2;…c1 ->real=c2->imag;
…
…
cplx.imag
cplx.realbase de cplx
desplaz. campo “imag”
Ejemplo: num.real=num.imag;
t2=&numt3=t1+offset(num,imag)t1=*t1t4=&numt5=t4+offset(num,real)*t5=t1
Ejemplo: c1->real= c2-> num.imag;
t2=c1+offset(c1,imag)t3=*t2t4=c2+offset(c2,real)*t4=t3
Generación de código. Procesadores de Lenguaje I
Generalización a k dimensiones: A[i1][i2]…[ik]
posicion: base+((…((i1*n2+i2)*n3+i3)…)*nk+ik )*w
Ecuación recurrente:e1=i1em=em-1*nm+im
Evaluación 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[i1][i2]posicion: base+(i1*n2+i2)*w
a[1]
…
a[0]
a[i]
basew
…………
…A[i1][i2]…A[i1][0]…………
…A[0][i2]…A[0][0]
n2
i2
i1
18
Generación de código. Procesadores de Lenguaje I
Evaluación de Arrays Multi-dimensionales
“E” representa la evaluación de una expresión, “L” el acceso a una variable
L.offset es distinto de null si L es un acceso con desplazamiento (arraysegún instrucción de código intermedio)
L.lugar es la posición de comienzo
El símbolo recurrente “Lista” efectúa el cálculo de posición de los índices con la ecuación recursiva:
Lista0::=Lista1 , E
Lista.lugar almacena el valor em
Lista.ndim es la dimensión (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 símbolos: id.lextiene asociada una dirección: Lista.array
Tamaño total: ancho (Lista.array)
Límite de una dimensión: limite(Lista.array, m)
Generación de código. Procesadores de Lenguaje I
Evaluación de Arrays Multi-dimensionalesProducciones Regla SemánticaS→ 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))}
Lista→Lista][E {t= tempnuevo(), m=Lista1.ndim+1gen(t ‘=‘ Lista1.lugar ‘*’ limite(Lista1.array,m))gen(t ‘=‘ t ‘+’ E.lugar)Lista0.array=Lista1.arrayLista0.lugar=t, Lista0.ndim=m}
Lista→id [E {p=lookup(id.lex), Lista.array= pLista.lugar=E.lugarLista.ndim=1}
19
Generación de código. Procesadores de Lenguaje I
Evaluación de Arrays Multi-dimensionalesEj.: x:=M[3][1] (M de tipo array{[0…4]x[0…4],int})
S1
:=L1 E1
[Lista2 E3
num (1)
Lista1
]
L2
[ E2id(M)
num (3)
id(x)
]
• base• limite(i)• ancho
celda
Código Intermedio:t1:=3
t2:=1
t3:=t1*5
t3:=t3+ t2
t4:=base(M)
t5:=t3*4
t6:=t4[t5]
x:=t6
Generación de código. Procesadores de Lenguaje I
S1: /S1->L1=E1/L1: L1.lugar=x /L1->id/
L1.offset=nullE1: /E1->L2/
L2: /L2->Lista1]/Lista1: /Lista1->Lista2][E3/
Lista2: /Lista2->E2]/E2: E2.lugar=t1 /E2->num/
t1=3Lista2.lugar=t1Lista2.ndim=1Lista2.array=M
E3: E3.lugar=t2 /E3->num/t2=1
Lista1.lugar=t3m=2t3= t1*5 (*lista2*limite(M,1)*)t3= t3+t2 (*suma indice E3*)Lista1.array=MLista1.lugar=t3Lista1.ndim=m
L2.lugar= t4L2.offset=t5t4=base(M)t5=t3*ancho(M) (*lista1*ancho*)
E1.lugar=t6t6=t5[t5]
x=t6
t1:=3
t2:=1
t3:=t1*5
t3:=t3+ t2
t4:=base(M)
t5:=t3*4
t6:=t4[t5]
x:=t6
20
Generación de código. Procesadores de Lenguaje I
GCI para Expresiones BooleanasDos posibilidades:
Valores numéricos (0,1) …Etiquetas para control de flujo
Con valores numéricos: E toma un valor aritmético, instrucciones de salto en función del valor
if (a<b) x=1
t1=a<biff t1 L1x:=1
L1 …Con etiquetas: una expresión booleana tiene directamente las etiquetas, que son posiciones destino de control de flujo: E.true, E.false (evaluación en cortocircuito)
Son atributos heredadosif (a<b) x=1
if a < b goto L1goto L2
L1 x:=1L2 …
E, a<b, tiene un atributo: t1
E, a<b, tiene tres atributos: L1, L2, código
Generación de código. Procesadores de Lenguaje I
GCI para Expresiones BooleanasEjemplos:
ifif E E thenthen S1 else S2S1 else S2
Codigo 3 direccionesCCóódigodigo de de evaluacievaluacióónn de E de E ((haciahacia ququéé etiquetaetiqueta saltosalto))
E.trueE.true::CCóódigodigo parapara S1S1gotogoto ‘‘SeguirSeguir’’
E.falseE.false::CCóódigodigo parapara S2S2
Seguir:…siguientes instrucciones
whilewhile (E) S(E) S
Codigo 3 direccionesComienzoComienzo::
CCóódigodigo de de evaluacievaluacióónn de E de E ((haciahacia ququéé etiquetaetiqueta saltosalto))
E.trueE.true::CCóódigodigo parapara SSgotogoto ‘‘ComienzoComienzo’’
E.falseE.false::…siguientes instrucciones
21
Generación de código. Procesadores de Lenguaje I
GCI- Condiciones BooleanasEvaluación “en cortocircuito”
AND: E0 -> E1 || E2
true false
E0E2
E1true
true
false
falselabel E1.false:
Generación de código. Procesadores de Lenguaje I
GCI- Condiciones BooleanasEvaluación “en cortocircuito”
AND: E0 -> E1 && E2
true false
E0E2
E1true
true
false
false
label E1.true:
22
Generación de código. Procesadores de Lenguaje I
GCI- Condiciones BooleanasEvaluación “en cortocircuito”Producción Regla SemánticaE:=‘true’ {E.codigo = gen (‘goto’ E.true)}E:=‘false’ {E.codigo = gen (‘goto’ E.false)}E:=id1 relop id2 {E.code=gen(‘if’ id1.lugar ‘relop’ id2.lugar ’goto’ E.true)||
gen(‘goto’ E.false)}E0:=E1´or´ E2 {E1.false= newlabel()
E1.true= E0.trueE2.true= E0.trueE2.false= E0.falseE0.codigo= E1.codigo || gen(E1.false ‘:’) || E2.codigo}
E0:=E1´and´ E2 {E1.true= newlabel()E1.false= E0.falseE2.true= E0.trueE2.false= E0.falseE0.codigo= E1.codigo || gen(E1.true ‘:’) || E2.codigo}
E0:=(E1) {E1.false= E0.falseE1.true= E0.trueE1.code= E0.code}
Generación de código. Procesadores de Lenguaje I
GCI- Condiciones BooleanasEvaluación “en cortocircuito”. Ejemplo:if (B) S:
codigo de BLt0:
código de SLf0:
…
Ejemplo: if (a<(b+32) || (b>0 && a>0)) x=1
t1=b+32if a < t1 goto Lt0if b > 0 goto L1goto Lf0Label L1:if a > 0 goto Lt0goto Lf0Label Lt0x=1Labl Lf0…
23
Generación de código. Procesadores de Lenguaje I
GCI- Estructuras de controlCONDICIONAL: S-> if (B) S else S
E0S2
Btrue false
S1
label S.next:
goto S.next:
label B.true:
label B.false:
Generación de código. Procesadores de Lenguaje I
GCI- Estructuras de controlBUCLE: S-> while (B) do S
E0
Btrue false
S
label S.next:
goto inicio
label B.true:
label inicio:
24
Generación de código. Procesadores de Lenguaje I
GCI- Sentencias Condicionales
Producción Regla SemánticaS:=if E then S1 {E.true= newlabel()
E.false= S0.nextS1.next= S0.nextS0.codigo=E.codigo||gen(E.true ‘:’)||S1.codigo}
S0:=if E then S1 else S2 {E.true= newlabel() E.false= newlabel()S1.next= S0.nextS2.next= S0.nextS0.codigo=E.codigo||gen(E.true ‘:’)||S1.codigo||
gen(‘goto’ S0.next||gen(E.false ‘:’)||S2.codigo} S0:= while E do S1 {begin = newlabel()
E.true= newlabel() E.false= S0.nextS1.next= beginS0.codigo=gen(begin ‘:’)||E.codigo|| gen(E.true ‘:’)||
S1.codigo||gen(‘goto’ begin)}
Atributo heredado S.next: instrucción continuaciónProblema: etiquetas desconocidas a priori (idem)
Generación de código. Procesadores de Lenguaje I
GCI- Condicionales sin atrib código
Producción Regla SemánticaS0:=if {E.true= newlabel(); E.false= S0.next}
E then {emitir(‘label ’ E.true ‘:’); S1.next= S0.next;}S1
S0:=if {E.true= newlabel(); E.false= newlabel()} E then {emitir(‘label ’ E.true ‘:’); S1.next= S0.next}S1 else {emitir(‘label ’ E.false ‘:’); S2.next= S0.next}S2
S0:= while {begin = newlabel(); E.true= newlabel(); E.false= S0.next; emitir(‘label ’ begin ‘:’);}
E do {S1.next= begin; emitir(‘label ’ E.true ‘:’); }S1
Atributo heredado S.next: instrucción continuación
25
Generación de código. Procesadores de Lenguaje I
Ejemplo control de flujowhile s<K do
if a>bs=s+a
elses=s-a
S1
while E1
E2
S2do
if else S4S3
>id(a)
id(b)
>id(s)
id(K)
Código 3 direcciones
L1: if s<K goto L2goto L0
L2: if a>b goto L3goto L4
L3: t1=s+as=t1goto L0
L4: t2=s-as=t2goto L1
L0: …
Generación de código. Procesadores de Lenguaje I
-S1.next=L0 (**)S1: /S1->while E1 do S2/
S1.next=L0begin=L1E1.true=L2E1.false=L0E1: /E1->id op id/
E1.codigo=if s<K goto L2goto L0
S2.next=L0S2: /S2->if E2 then S3 else S4/
E2.true=L3E2.false=L4E2: /E2->id op id/
E2.codigo=if a>b goto L3goto L4
goto L0S3.next=L1S3: /S3->s=s+a/
S3.codigo=t1=s+as=t1
S4.next=L0S4: /S4->s=s-a/
S4.codigo=t2=s+as=t2
S2.codigo=S1.codigo=
if a>b goto L3goto L4
L3: t1=s+as=t1goto L0
L4: t2=s-as=t2
L1: if s<K goto L2goto L0
L2: if a>b goto L3goto L4
L3: t1=s+as=t1goto L0
L4: t2=s-as=t2goto L1
L0: …
26
Generación de código. 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)
Código
El código intermedio para control de flujo usa saltos a etiquetas “futuras”
No es problema en CI puesto que se tratan como nombresEn el código final hay que transformarlas en direcciones
Una solución es diferir su ajuste final a una pasada posteriorImplementación sencilla: archivo temporal
Generación de código. Procesadores de Lenguaje I
Traducción de llamadas a funcionesEs el aspecto más dependiente del entorno de ejecución
Difícil de generalizar a código intermedio
Dos aspectos básicosDeclaración de función/procedimiento (o definición)Llamada de función/procedimiento
El código intermedio define el punto de entrada y el punto de retorno de la función
DefiniciónInstrucción de entrada<código del cuerpo de la función>Instrucción de salida
LlamadaInstrucción de comienzo de cálculo de parámetros<código del cálculo de parámetros>Instrucción de llamada
27
Generación de código. Procesadores de Lenguaje I
GCI para llamadas a funcionesInstrucciones 3 direcciones param x entry fcall f, n return x
Código Pmst ent fcup ret
Ej.:int f(int x, int y){return x+y+1;}
f(2+3,4);
entry ft1=x+yt2=t1+1return t2
t1=2+3param t1param 4call f 2
ent flod xlod yadildc 1adiret
mstldc 2ldc 3adildc 4cup f
Código 3-dir Código P
Generación de código. Procesadores de Lenguaje I
Llamadas a funciones dentro de expresionesProducciones Regla Semántica
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→ 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
Generación de código. Procesadores de Lenguaje I
Ejemplo con funciones y expresionesSin atributo código: escribir código globalmente
a=0;c=1+f(2,4*a);
t1:=0
a:=t1
t2:=4*a
param t2
param 1
t3=call f 2
t4:= 1+t3
c:=t4
S
id(c)
E=
EE(1)
+
( listaid(f)
t2:=4*a
c:=t4
)
lista,
E
E(4)
* E(a)
E(1)
t2
t2 1
param t2
param 1
t3=call f 2
t4=1+t3