Professional Documents
Culture Documents
Tema 6
Parte II
Generacin de cdigo intermedio
Estudiar la generacin de cdigo intermedio Entender su propsito y funciones Aprender los tipos de lenguajes intermedios Aprender a generar cdigo de tres direcciones Entender las representaciones alternativas Aprender a generar cdigo para
Expresiones Asignaciones Construcciones de control de flujo Acceso a estructuras de datos complejas
ndice General
Introduccin Lenguajes intermedios
rboles sintcticos abstractos Grafos dirigidos acclicos
Introduccin
Generacin de cdigo intermedio
Transicin de un rbol de Anlisis Sintctico A un cdigo intermedio cercano a la mquina
Ventajas
Supone una frontera entre el front end y el back end Es un cdigo pretendidamente prximo a la mquina Es independiente de una arquitectura especifica
Registros Memoria Juego de instrucciones Modos de direccionamiento
Introduccin
El cdigo intermedio como frontera
Independencia fsica Anlisis Lxico Anlisis Sintctico Anlisis Semntico Tabla de smbolos Generacin de cdigo intermedio Optimizacin de cdigo intermedio Generacin de cdigo objeto Dependencia fsica Gestin de errores
Lenguajes intermedios
rboles sintcticos abstractos (ASA)
El cdigo se representa en forma de rbol donde
Cada nodo no terminal representa un operador Cada nodo terminal representa un operando
a := b * - c + b * - c a
:= + * b c b * c
Lenguajes intermedios
Gramtica
S E E E E E id := E E1 + E2 E1 * E2 - E1 ( E1 ) id S.apn := hazNodo (:=, hazHoja (id, id.lugar), E.apn) E.apn := hazNodo (+, E1.apn, E2.apn) E.apn := hazNodo (*, E1.apn, E2.apn) E.apn := hazNodo ( -, E1.apn) E.apn := E1.apn E.apn := hazHoja (id, id.lugar)
a := b * - c + b * - c a
:= + * b c b * c
Lenguajes intermedios
Representacin computacional
Estructura dinmica Tabla de nodos
0 1 2 3 4 5 6 7 8 9 ID b ID c MENOSU 1 POR 0 2 ID b ID c MENOSU 5 POR 4 MAS 3 ID a 9 8 6 7
ID MENOSU
ID
10 ASIGNA
Lenguajes intermedios
Grafos dirigidos acclicos (GDA)
El cdigo se representa en forma de grafo
Cada nodo no terminal representa un operador Cada nodo terminal representa un operando Se reutilizan los nodos
Lenguajes intermedios
Gramtica
S E E E E E id := E E1 + E2 E1 * E2 - E1 ( E1 ) id S.apn := hazNodo (:=, hazHoja (id, id.lugar), E.apn) E.apn := hazNodo (+, E1.apn, E2.apn) E.apn := hazNodo (*, E1.apn, E2.apn) E.apn := hazNodo ( -, E1.apn) E.apn := E1.apn E.apn := hazHoja (id, id.lugar)
a := b * - c + b * - c a
:= + * b c
La operacin hazNodo devuelven un nodo ya existente siempre que sea posible en lugar de construir uno nuevo
Lenguajes intermedios
Representacin computacional
Estructura dinmica Tabla de nodos
0 1 2 3 4 5 6 ID b ID c MENOSU 1 POR 0 2 MAS 3 ID a ASIGNA 5 4 3
Lenguajes intermedios
Cdigo de tres direcciones
Es una secuencia de proposiciones de la forma Donde
X := Y OP Z
No se permiten expresiones aritmticas compuestas Solo hay un operador en el lado derecho Se utilizan variables temporales para codificarlas Ms prximo a la mquina
Se traduce fcilmente a ensamblador Se optimiza fcilmente
Lenguajes intermedios
Cdigo de tres direcciones
Es una representacin linealizada de un ASA o un GDA
a := b * - c + b * - c rbol sintctico abstracto t1 := - c t2 := b * t1 t3 := - c t4 := b * t3 t5 := t2 + t4 a := t5 Grafo dirigido acclico t1 := - c t2 := b * t1 t5 := t2 + t2 a := t5
Lenguajes intermedios
Cdigo de tres direcciones
Es anlogo al ensamblador Las proposiciones pueden tener etiquetas simblicas Una etiqueta representa el ndice de una proposicin
Pueden sustituirse en una pasada independiente Mediante la tcnica de relleno en retroceso
Lenguajes intermedios
Cdigo de tres direcciones
Es necesario disear un juego de instrucciones
Operaciones de asignacin X := Y OP Z Operaciones de asignacin unaria X := OP Y Proposiciones de copia X := Y Etiquetas E: Salto incondicional a etiqueta BR E Salto condicional a etiqueta BZ E Llamadas a procedimientos
Carga de parmetros param X Llamada a procedimiento call P n
Lenguajes intermedios
Cdigo de tres direcciones
Representacin mediante tripletas
Operador Resultado / Operando 1 Operando 2
Ejemplo
cudruplas (2+3) * (2+3+5)
ADD ADD ADD MUL 2 2 t2 t1 3 3 5 t3 t1 t2 t3 t4
E ::= E1 + E2
E ::= - ( E1 )
E ::= id
d = - (a + b * c)
:=
id
(a)
id
(b)
id
(c)
S2.inicio : S2.fin :
S2.cdigo
S Then S1 id
(a)
E >
{1}
S2 id := E id
{1}
{5}
E2
{2}
:=
(b)
E + n
{4}
id {1}
(b) {4} S.cdigo = E.cdigo || MOVE id.temp E.temp
E
{3}
E.temp := id.lexema E.cdigo := E.temp := nuevoTemp(); E.codigo := E1.cdigo || E2.cdigo || GT E.temp E1.temp E2.temp E.temp := n.valor E.cdigo :=
(b)
{3}
{5} S2.inicio := nuevaEtiqueta() S2.fin := nuevaEtiqueta() S.cdigo := E.cdigo || BZ E.temp S2.inicio || S1.cdigo || BR S2.fin || INSETQ S2.inicio || S2.cdigo || INSETQ S2.fin
10
S.inicio :
S.fin :
while (a < b) do a := a + 1; S do S1 id
(a)
E >
{1}
{5}
E2
{2}
:= E id
{1}
E + n
{4}
id {1}
(b) {4} S.cdigo = E.cdigo || MOVE id.temp E.temp {5} S.inicio := nuevaEtiqueta() S.fin := nuevaEtiqueta() S.cdigo := INSETQ S.inicio || E.cdigo || BZ E.lugar S.fin || S.cdigo || BR S.inicio || INSETQ S.fin
E
{3}
E.temp := id.lexema E.cdigo := E.temp := nuevoTemp(); E.codigo := E1.cdigo || E2.cdigo || LT E.temp E1.temp E2.temp E.temp := n.valor E.cdigo :=
(a)
{3}
11
Var
th= ent tamh=2
L
th= ent tamh=2
L
th= ent tamh=2
V
th= ent tamh=2
V id
(a)
th= ent tamh=2 th= ent tamh=2
id
(b)
A A
A A A
[n]
(5)
t= ARRAY(ent, 5) tam=2X5=10
[n]
(2)
t= ent tam=2
[n]
(3)
t= ent tam=2
12
Recursivamente t1 := 0
t2 := t1 x D1 + i t3 := t2 x D2 + j t4 := t3 x D3 + k t5 := DirBase (nombre) + t4 x Tam (Tipo)
Recursivamente t1 := 0
t2 := t1 x (LS1-LI1+1) + (i-LI1) t3 := t2 x (LS2-LI2+1) + (j-LI2) t4 := t3 x (LS3-LI3+1) + (k-LI3) t5 := DirBase (nombre) + t4 x Tam (Tipo)
13
{ Ref.tipo := TipoSimbolo(id.lexema); Ref.dBase := DireccionSimbolo(id.lexema); temp := NuevoTemp(); Ref.temp := temp; Ref.cod := MOVE temp 0 } { Si !EsArray(Ref1.tipo) ErrorSemantico() } { Si !EsEntero(E.tipo) ErrorSemantico() Si no Ref.tipo := TBaseTipoArray(Ref1.tipo); Ref.dBase := Ref1.dBase temp := NuevoTemp(); Ref.temp := temp; Ref.cod := Ref1.cod || E.cod || MUL Ref.temp Ref1.temp DimTipoArray(Ref1.tipo) ADD Ref.temp Ref.temp E.temp } E]
{ Si EsArray (Ref.Tipo) ErrorSemntico () Si no Factor.tipo := Ref.Tipo; temp := NuevoTemp(); Factor.temp := temp; Factor.cod := Ref.cod || MUL temp Ref.temp TamTipo(Ref.Tipo) ADD temo temp Ref.dBase } { Si EsArray (Ref.Tipo) ErrorSemantico () } { Instr.cod := Ref.cod || E.cod || MOVE @Ref.temp, E.temp }
14
a [1][2] := b[3] E
temp = t6 cod = MOVE t6 t2 MUL t6 t6 tam (emt) ADD t6 t6 200 Tipo = ent MOVE @t6 t5 temp = t5 cod = Tipo = ent temp = t5 cod = MUL t5 t4 tam(ent) ADD t5 t5 400 Tipo = ent dbase = 400 temp = t4 cod = MUL t4 b 7 ADD t4 t4 E.temp
Ref
[E]
Factor
Ref
[E]
Ref
id
(a)
Tipo = ARRAY ( ARRAY (ent, 5), 4) dbase = 200 temp = t0 cod = MOVE t0 0
Ref
Tipo = ARRAY (ent, 7) dbase = 400 temp = t3 cod = MOVE t3 0
[E]
id
(b)
(3)
E.temp := 3 E.cdigo :=
15
Ejemplo
struct { char a; int b; } c; #(char) = 1 #(int) =2 #(struct) = 3 Dir (c) = 100 Dir (c.a) = 100 Dir (c.b) = 101
La direccin de los campos de cualquier registro no puede calcularse, en general. Se debe generar cdigo intermedio para calcule su direccin en tiempo de ejecucin La direccin de base no es constante y se necesita
CBase. Almacena el cdigo para calcular la direccin de base DBase. Almacena el temporal de la direccin de base
16
d[i].c[j]
{4}
{1}
{1} tipo = ARRAY (5, RECORD) tamao = 5x14 = 70 dbase = t1 cbase = MOV t1 1001 temp = t2 cod = MOVE t2 0
{2} tipo = RECORD () tamao = 14 dbase = t1 cbase = MOV t1 100 temp = t3 cod = MOVE t3 t2 MUL t3 t3 5 ADD t3 E.temp
tipo = ARRAY (char, 10) {3} tamao = 10x1 = 10 dbase = t4 cbase = MOVE t4 t3 MUL t4 t4 142 ADD t4 t4 t1 ADD t4 t4 43 temp = t5 cod = MOVE t5 0
{4} tipo = char tamao = 1 dbase = t4 cbase = temp = t6 cod = MUL t6 t5 104 ADD t6 t6 E.temp
Bibliografa
[AJO] AHO, SETHI, ULLMAN: Compiladores: Principios, tcnicas y herramientas,: Addison-Wesley Iberoamericana, 1990
[GARRIDO]
17