Está en la página 1de 25

Tema 8.

Generacin de Representaciones o Intermedias


Francisco Jos Ribadas Pena e PROCESADORES DE LENGUAJES 4o Informtica a ribadas@uvigo.es 7 de mayo de 2006

c FJRP 2005 ccia pl

8.1 Introduccin o
Fich. Fuente A. LEXICO A. SINTACTICO A. SEMANTICO

GENERACION REPRESENT. INTERMEDIA

repr. inter.

GENERACION OPTIMIZ. DE CODIGO

Fich. Objeto

Representacin Intermedia (RI): Lenguaje de una mquina abstracta o a usado como interfaz entre Anlisis y Gen. de Cdigo. a o Etapa intermedia, previa a la generacin de cdigo objeto. o o Permite especicar operaciones sobre la mquina objetivo sin entrar a en detalles de bajo nivel espec cos de la arquitectura. Aisla el anlisis (lxico, sintctico, semntico) de la generacin de a e a a o cdigo objeto. o Muy relacionado con el desarrollo de intrpretes e Ventajas: 1. Mayor modularidad. (Ofrece abstraccin para componentes de alto o nivel) Aisla elementos de ms alto nivel de los dependientes de la a mquina a 2. Facilita optimizacin y generacin de cdigo o o o Elimina/simplica caracter sticas espec cas mquina objetivo a
no limitado de registros, tipos de instrucciones alineacin de datos, modos de direccionamiento, etc,... o

Permite optimizaciones independientes de la mquina a Ofrece representacin simple y uniforme fcil geneo a rar/optimizar cdigo o 3. Mayor transportabilidad Independencia de la mquina objetivo y del lenguaje fuente a Anlisis no depende de arquitectura destino a Generacin cdigo no depende del leng. original o o Crear un compilador para otra mquina basta crear una nueva a etapa nal de generacin o Ejemplo: multicompiladores

Inconvenientes: 1. Necesidad de una fase extra para traducir a cdigo mquina o a Mayor coste computacional 2. Dicultad para denir un leng. intermedio adecuado Compromiso entre la representacin de elementos cdigo fuente o o y del cdigo mquina. o a

8.2 Tipos de Representaciones Intermedias


Caracter sticas deseables de una R.I.: Sencillo de producir durante fase de A. Semntico a Facilitar traduccin al leng. mquina nal para todas las posibles o a mquinas objetivo a Construcciones claras, sencillas y uniformes, con signicado un voco Facilita la especicacin de la traduccin a la cada mquina o o a objetivo Tipos de R.I.: Representaciones arbreas: rboles de sintaxis abstracta, GDAs o a Representaciones lineales: polaca inversa, cdigo 3 direcciones o Ejemplos de R.I: Diana: represent. arbrea usada en compiladores de ADA o RTL (register transfer language): usada en familia de compiladores GCC Cdigo-P: compiladores Pascal (tambin comn en intrpretes) o e u e WAM (Warren abstract machinne): intrpretes Prolog e Bytecodes JAVA Ejemplo GCC.

8.2.1 R.I. Arbreas o


Basadas en rboles de sintaxis abstracta, a Arboles de anlisis sintctico son info. superua a a Nodos hoja operandos Nodos internos operadores del Lenguaje Intermedio Ejemplos
s := a + b * c; IF (a <5) THEN c := b; WHILE (a >3) DO b := b + a; a := a + 1; END DO;

Pueden usarse representaciones de ms bajo nivel. a


IF (a < 5) THEN c := b + 1;

Tambin se usan GDAs (grafos dirigidos ac e clicos) Representaciones condensadas de rboles abstractos a Subestructuras idnticas representadas una unica vez e Uso de mltiples referencias a regiones comunes u Mejora de tamao y optimizacin de cdigo impl n o o cita Ejemplo: a := b * (-c) + b * (-c)

8.2.2 R.I. Lineales


(a) Notacin Polaca Inversa (RPN) o Notacin postja con los operadores situados a continuacin de los o o operandos. Ejemplo: d := (a + b) * c d a b + c * := Muy usado como cdigo intermedio en intrpretes. o e Interpretacin muy sencilla (basta una pila) o Ejemplo: Postscript Ventajas: Muy sencillo para expresiones aritmticas. e No necesita parntesis e Precedencia est impl a cita valores temporales impl citos Interpretacin/Generacin de cdigo muy simple o o o Slo necesita una pila. Algoritmo interpretacin: o o
1. Recorrer lista, apilando operandos hasta llegar a un operador 2. Tomar los operandos necesarios de la pila y aplicarles el operador 3. Apilar resultado y continuar

Muy usado en primeras calculadoras comerciales


Inconvenientes: Dif de entender (una sla l cil o nea de cdigo intermedio) o Complicado representar control ujo (saltos) No es util para optimizacin de cdigo. o o

(b) Cdigo de 3 Direcciones o Generalizacin del cdigo ensamblador de una mquina virtual de 3 o o a direcciones. Cada instruccin consiste en un operador y hasta 3 direcciones (2 o operandos, 1 resultado) FORMATO GENERAL : x := y OP z x, y, z sin direcciones. Referencias a: Nombres (dir. de variables) Constantes Variables temporales (creadas por el compilador durante la gen. de la R. I.) Etiquetas (direcciones de instrucciones) Ejemplos:
d := x + 9 * z temp1 = 9 * z temp2 = x + temp1 d = temp2 etq1: etq2: IF (a<b) THEN x:=9 temp1 = a<b if temp1=true goto etq1 goto etq2 x := 9 ...

Existe una referencia expl cita a los resultados intermedios de las operaciones mediante las vars. temporales. En RPN, referencias impl citas a resultados almacenados en pila 8 < cuartetos Posibilidades de representacin: o tercetos : tercetos indirectos

(b.1) CUARTETOS Tuplas de 4 elementos. (<operador>, <operando1>, <operando2>, <resultado>) Ejemplos:


d := x + 9 * z (*,9,z,temp1) (+,x,temp1,temp2) (:=,temp2, ,d) IF (a<b) THEN x:=9 (<,a,b,temp1) (if true,temp1, ,etq1) (goto, , ,etq2) (label, , ,etq1) (:=,9, ,x) (label, , ,etq2)

(b.1) TERCETOS Tuplas de 3 elementos. (<operador>, <operando1>, <operando2>) La dir. destino del resultado esta asociada de forma impl cita a cada terceto. Existe una var. temporal asociada a cada terceto donde se guarda su resultado Valores intermedios se referencian indicando el no del terceto que lo crea Ejemplos:
d := x + 9 * z 101:(*,9,z) 102:(+,x,[101]) 103:(:=,d,[102]) IF (a<b) THEN x:=9 111:(<,a,b) 112:(if true,[111],etq1) 113:(goto,etq2, ) 114:(label,etq1, ) 115:(:=,x,9) 116:(label,etq2, )

Caracter sticas: Ms concisos que cuartetos (menos espacio) a Evita manejo expl cito de vars. temporales Complica optimizacin: mover/copiar/borrar tercetos ms complejo o a Equivalen a arboles de sintaxis abstracta (con ramicacin limitada a 2 o
descendientes) s := a + b * c 1:(*,b,c) 2:(+,a,[1]) 3:(:=,s,[2])

(b.1) TERCETOS INDIRECTOS Orden de ejecucin de los tercetos determinada por un vector de o apuntadores a triples (VECTOR de SECUENCIA) Referencias a vars. temporales se hacen directamente al terceto, no al vector de secuencia Representacin ms compacta no repeticin de tercetos o a o Indireccin facilita mover/copiar/borrar simplica optimiz. o Ejemplo:
COD. 3 DIR. a c b m := := := := c c c a / + / d 1 d b TERCETOS 101:(/,c,d) 102:(:=,a,[101]) 103:(+,c,1) 104:(:=,c,[103]) 105:(:=,b,[101]) 106:(-,[102],[105]) 107:(:=,m,[106]) VECTOR SECUENCIA 1: 2: 3: 4: 5: 6: 7: 8: 101 102 103 104 101 (el valor de c ha cambiado) 105 106 107

8.3 Generacin de Cdigo Intermedio o o


Ejemplo de generacin de C.I. para los constructores t o picos de los lenguajes de programacin. o (1) Lenguaje Intermedio: Instruccin de asignacin: a := b ; (:=,b, ,a) o o Operadores binarios: x := a OP b ; (OP,a,b,x)
8 > > > > > <
Reales +R ADDF R SUBF R MULF /R DIVF AND OR XOR GT LT EQ Enteros +E ADDI E SUBI E MULI /E DIVI

Op. aritmticos e

Op. booleanos

Operadores unarios: x := OP a ; (OP,a, ,x) Cambio signo: MINUS

: 8 < > < Op. relacionales : =

> > > > > : 8 < &&

LE GE NE

Conversin tipos o
8 < Lgicos o :

CONVF (convierte int a oat) CONVI (convierte oat a int) NOT SHFR SHFL

Saltos Incondicional: goto etq ; (goto,etq, ) Condicional: if x goto etq ; (if,x,etq, ) Si x es true salta a etq. Adems, saltos con ops. relacionales (>, <, ==, etc..) a if x > y goto etq ; (if GT,x,y,etq) Declaracin etiquetas: etq: <...> ; (label,etq, , ) o Etiqueta etq estar asociada a la siguiente instruccin. a o

Llamadas a procedimiento Llamada al procedimiento proc(x1, x2, ..., xN, con n argumentos.
PARAM x1 PARAM x2 ... PARAM xN call proc, N

Fin llamada a procedim.: return valor ; (return, valor, , ) Acceso a memoria Acceso indirecto: x := y[i] ; (:=[],y,i,x) (acceso) x[i] := y ; ([]:=,y,i,x) (asignacin) o a[j] = posicin de memoria j unidades (bytes/palabras) o despus de la direccin de a. e o x[10] := a+b temp100 := a+b x[10] := temp100

Punteros:
x := &y (asigna a x la direccin de y ) o x := *y (asigna a x el contenido apuntado por la dir. guardada en y ) *x := y (guarda en la dir. guardada en la var. x el valor de y )

(2) Suposiciones: Mantendremos el cod. generado en un atributo asociado a los s mbolos de la gramtica a 1 TDS por bloque + 1 TDS asociada a cada tipo registro Contenido entradas TDS Informacin de direccionamiento: posicin relativa (oset) reso o pecto al inicio del rea de datos del bloque de cdigo actual a o variables locales se sitan consecutivamente segn orden de declaracin u u o Tamao de las variables: n P
char: 1 int: 4 real: 8 puntero:4

record: tamao campos n array : tamao elementos num. elementos n

Etiquetas: asociadas a una instruccin del lenguaje intermedio o se reeren a direcciones de memoria de la zona de instrucciones Temporales: dir. de memoria destinadas al almacenamiento de valores intermedios al generar cod. objeto se decidir si se reeren a registro o una pos. de a
memoria

(3) Atributos dir: referencia a la direccin en memoria/registro asociada a un o identicador(variable) o a un temporal todo no terminal de la gramtica usado en expresiones tendr asociada a a
siempre una var. temporal

cdigo: guarda el C.I.(lista de cuartetos o tercetos) generado para o una construccin del lenguaje o Funciones Se supondr que estn denidas las dos funciones siguientes a a crearTemporal(): genera una nueva variable temporal generarCI(instruccion): genera la representacin en CI de una o instruccin de 3 direcciones o nuevaEtiqueta(): genera una nueva etiqueta

8.3.1 CI para expresiones aritmticas e


S id := E
{ buscarTDS(id.texto) /* obtenemos: id.tipo, id.dir, id.tamao */ n S.codigo = E.codigo + generarCI(id.dir = E.dir) }

E E op E
(op:+,-,*,/,mod,...)

{ E0.dir = crearTemporal() E0.codigo = E1.codigo + E2.codigo + generarCI(E0.dir = E1.dir OP E2.dir) }

E op E
(op: -,,...)

{ E0.dir = crearTemporal() E0.codigo = E1.codigo + generarCI(E0.dir = OP E1.dir) }

E(E)

{ E0.dir = E1.dir E0.codigo = E1.codigo }

E const

{ E.dir = crearTemporal() E.codigo = generarCI(E.dir = const) }

E id

{ buscarTDS(id.texto) /* obtenemos: id.tipo, id.dir, id.tamao */ n E.dir = id.dir E.codigo = <> }

8.3.1 (cont.) Conversin de Tipos o


Arrastrar y consultar tipo asociado a construcciones (tema anterior) Incluir cdigo para conversin impl o o cita cuando sea necesario Aplicar la instruccin de C.I. que corresponda a cada tipo de dato o Ejemplo: Operador sobrecargado +

EE+E
{ E0.dir = crearTemporal() E0.codigo = E1.codigo + E2.codigo if (E1.tipo = REAL) and (E2.tipo = INTEGER) E0.tipo = REAL E0.codigo = E0.codigo + generarCI(E2.dir = CONV_F E2.dir)+ generarCI(E0.dir = E1.dir +R E2.dir) else if (E1.tipo = INTEGER) and (E2.tipo = REAL) E0.tipo = REAL E0.codigo = E0.codigo + generarCI(E1.dir = CONV_F E1.pos)+ generarCI(E0.dir = E1.dir +R E2.dir) else if (E1.tipo = REAL) and (E2.tipo = REAL) E0.tipo = REAL E0.codigo = E0.codigo + generarCI(E0.dir = E1.dir +R E2.dir) else if (E1.tipo = INTEGER) and (E2.tipo = INTEGER) E0.tipo = INTEGER E0.codigo = E0.codigo + generarCI(E0.dir = E1.dir +I E2.dir) else E0.tipo = ERROR E0.codigo = <> }

8.3.1 (cont.) Casos Especiales


(1) REGISTROS Suponemos campos almacenados de forma consecutiva. Acceso a campos

E id.id

{ buscarTDS(id1.texto) /* obtenemos: tipo, dir. inicio, TDS registro (R) */ R.buscarTDS(id2.texto) /* obtenemos: tipo, dir. relativa en registro */ E.dir = id1.dir + id2.dir /* no es necesario generar cdigo */ o }

Escritura de campos

S id.id := E

{ buscarTDS(id1.texto) /* obtenemos info. de registro R */ R.buscarTDS(id2.texto) S.codigo = E.codigo + generarCI(id1.dir[id2.dir] = E.dir) }

(2) ARRAYS Suponemos arrays de 1 dimensin de tipo array(I,T) o T : tipo de los elementos, guardamos su tamao en TDS n I : rango del ndice, guardamos valores limite en TDS Acceso E id [E]

{ buscarTDS(id.texto) /* obtenemos: tipo array(I,T), dir inicio, tamao tipo base T, limite inferior de I */ n E0.dir = crearTemporal() despl = crearTemporal() /* despl. en array */ indice = crearTemporal() /* despl. en memoria */ E0.codigo = E1.codigo + generarCI(despl = E1.dir - I.lim_inferior)+ generarCI(indice = despl * T.tama~o)+ n generarCI(E0.dir = id.dir[indice]) }

Escritura S id[E] := E

{ buscarTDS(id.texto) /* obtenemos info. del array */ S.dir = crearTemporal() despl = crearTemporal() /* despl. en array */ indice = crearTemporal() /* despl. en memoria */ S0.codigo = E2.codigo + E1.codigo + generarCI(indice = despl * T.tama~o)+ n generarCI(id.dir[indice] = E2.dir) }

generarCI(despl = E1.dir - I.lim_inferior)+

(4) EJEMPLOS
ARRAY1: array[0..9] of integer; ARRAY2: array[10..50] of float; b, c, i: INTEGER d: FLOAT

...
b := 10;

1001: 1002: 1003: 1004: 1005: 1006: 1007: 1008: 1009: 1010: 1011: 1012: 1013:

t0 = 10 b = t0 t1 = 5 - 0 t2 = t1 * 4 /*tama~o entero = 4*/ n t3 = ARRAY1[t2] t4 = 3 + t3 c = t4 t5 = c * b t6 = i - 10 t7 = t6 * 8 /*tama~o float = 8*/ n t8 = ARRAY2[t7] t9 = t5 + t8 d = t8

c := 3 + ARRAY1[5]

d := ARRAY2[i] + c * b

8.3.2 CI para expresiones lgicas o


Dos posibilidades 1. Codicando valores true/false numricamente e true =0, false =0 Evaluar expr. lgicas del mismo modo que las aritmticas o e 2. Mediante control de ujo (saltos) El valor de una expresin booleana se representa impl o citamente mediante una posicin alcanzada en el programa o si true salta a un punto; si false salta a otro Ventajoso para evaluar exptr. boolenas en instrucciones de control de ujo facilita evaluar expresiones lgicas en cortocircuito o (Veremos slo la primera posibilidad) o

E E op E
(or, and, xor)

{ E0.dir = crearTemporal() E0.codigo = E1.codigo + E2.codigo + generarCI(E0.dir = E1.dir OP E2.dir) }

E op E
(not, shift, ...)

{ E0.dir = crearTemporal() E0.codigo = E1.codigo + generarCI(E0.dir = OP E1.dir) }

8.3.2 (cont...)
E E op relE
(=, <, >, !=, ...) { E0.dir = crearTemporal() ETQ_TRUE = nuevaEtiqueta() ETQ_FIN = nuevaEtiqueta() E0.codigo = E1.codigo + E2.codigo + generarCI(E0.dir = 0)+ generarCI(goto ETQ_FIN)+ generarCI(ETQ_TRUE:)+ generarCI(E0.dir = 1)+ generarCI(ETQ_FIN:) }

generarCI(if (E1.dir OPREL E2.dir) goto ETQ_TRUE)

E true

{ E.dir = crearTemporal() E.codigo = generarCI(E.dir = 1) }

E false

{ E.dir = crearTemporal() E.codigo = generarCI(E.dir = 0) }

8.3.3 Instrucciones de control de ujo


Versin sencilla, considerando expr. booleanas con valores numricos o e Uso de etiquetas para dar soporte al control de ujo en el C.I. SALTOS if expresion then sentencias if expresion then sentencias1 else sentencias2 BUCLES while expresion do sentencias for identicador := expresion1 to expresion2 do sentencias EXTENSIONES switch expresion begin case valor1 : sentencias1 case valor2 : sentencias2 ... case valorN : sentenciasN default sentenciasD end

if - then

8.3.3 (cont...) SALTOS


E.codigo (evaluar E en temp) if temp goto S1 inicio goto S0 nal

if - then - else E.codigo (evaluar E en temp) if temp goto S1 inicio S2.codigo goto S0 nal

S1 inicio: S1.codigo S0 nal: ... S0 nal: S1 inicio:

S1.codigo ...

S if E then S

{ S1_inicio = nuevaEtiqueta() S0_final = nuevaEtiqueta() S0.codigo = E.codigo+ generarCI(if E.dir goto S1.inicio)+ generarCI(goto S0_final)+ generarCI(S1_inicio:)+ S1.codigo+ generarCI(S0_final:) }

S if E then S else S
{ S1_inicio = nuevaEtiqueta() S0_final = nuevaEtiqueta() S0.codigo = E.codigo + generarCI(if E.dir goto S1_inicio)+ S2.codigo+ generarCI(goto S0_final)+ generarCI(S1_inicio:)+ S1.codigo+ generarCI(S0_final:) }

8.3.3 (cont...) BUCLES


while S0 inicio: E.codigo (evaluar E en temp) if temp goto S1 inicio goto S0 nal S1 inicio: S1.codigo goto S0 inicio ... S0 nal: for ascendente (usa nueva etiqueta TEST) E1.codigo (l mite inferior) E2.codigo (l mite superior) id = E1 if (id <= E2) goto S1 inicio goto S0 nal S1.codigo id = id + 1 goto S0 test ...

S0 test: S1 inicio:

S0 nal:

S while E do S

{ S0_inicio = nuevaEtiqueta() S0_final = nuevaEtiqueta() S1_inicio = nuevaEtiqueta() S0.codigo = generarCI(S0_inicio:)+ E.codigo+ generarCI(if E.dir goto S1_inicio)+ generarCI(goto S0_final)+ generarCI(S1_inicio:)+ S1.codigo+ generarCI(goto S0_inicio)+ generarCI(S0_final:) }

S for id = E to E do S

{ S0_inicio = nuevaEtiqueta() S0_final = nuevaEtiqueta() S0_test = nuevaEtiqueta() S1_inicio = nuevaEtiqueta() S0.codigo = generarCI(S0_inicio:)+ E1.codigo + E2.codigo + generarCI(id.dir = E1.dir) generarCI(S0_test:)+ generarCI(if (id.dir <= E2.dir) goto S1_inicio)+ generarCI(goto S0_final)+ generarCI(S1_inicio:)+ S1.codigo+ generarCI(id.dir = id.dir + 1)+ generarCI(goto S0_test)+ generarCI(S0_final:) }

Alteraciones de ujo dentro de bucles.

8.3.3 (cont...) CASOS ESPECIALES

Salida: (exit, break) goto a la etiqueta S0.nal Cancelar iteracin: (continue) o en while: goto al incio de la expresin de comparacin (S0.inicio) o o en for: goto a la instruccin de incremento o Instruccin CASE o
S0.inicio: E.codigo (evaluacin o expresin) o goto S0.test S1.codigo goto S0.nal ... SN.codigo goto S0.nal SD.codigo goto S0.nal if E.dir = valor1 goto S1.inicio if E.dir = valor2 goto S2.inicio ... if E.dir = valorN goto SN.inicio goto SD.inicio ...

S1.inicio: switch expresion begin case valor1 : sentencias1 case valor2 : sentencias2 ... case valorN : sentenciasN default sentenciasD end

S2.inicio: SN.inicio:

SD.inicio:

S0.test:

S0.nal

NOTAS En C, si no se incluye break, contina la ejecucin en el siguente u o caso. se incluir el goto S0.final en los casos donde exista break a consistente con comportamiento de break en while y for indicado anteriormente

Si hubiera muchos casos, usar tabla de pares (caso, etiqueta) la seleccin de caso se har dentro de un bucle que iterar sobre esa tabla o a a

8.3.4 Procedimientos y Funciones


S0.inicio:

Esquema de llamada procedimeinto(E, E, ... , E);


...

E1.codigo (evaluacin o parametro1) E2.codigo (evaluacin o parametro2) EN.codigo (evaluacin o parametroN) param E1.dir param E2.dir ... param EN.dir call procedimiento ...

Ejemplos imprimir(nombre, DNI, edad); mostrar resultados; b := media(A[5], velocidad*15):

S0.nal

El uso de C.I. oculta las operacioens adicionales necesarias en la llamada y el retorno de procedimientos. LLAMADA Evaluar valores de los parmetros a Crear el registro de actvacin asociado al nuevo procedimiento o Paso de parmetros a Guardar estado del procedimeinto actual Guardar direccin de retorno o Salto al inicio del cdigo del procedmiento llamado o RETORNO Recuperar estado del procedimiento llamador Salto a siguiente instruccin o Recuperar valor devuelto Secuencias de llamada/retorno: alta dependencia de la mquina objetivo a convenciones de llamada + instrucciones espec cas

También podría gustarte