Documentos de Académico
Documentos de Profesional
Documentos de Cultura
8.1 Introduccin o
Fich. Fuente A. LEXICO A. SINTACTICO A. SEMANTICO
repr. inter.
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
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)
(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) 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
Op. aritmticos e
Op. booleanos
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
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
E E op E
(op:+,-,*,/,mod,...)
E op E
(op: -,,...)
E(E)
E const
E id
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 = <> }
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
(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) }
(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:
c := 3 + ARRAY1[5]
d := ARRAY2[i] + c * b
E E op E
(or, and, xor)
E op E
(not, shift, ...)
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:) }
E true
E false
if - then
if - then - else E.codigo (evaluar E en temp) if temp goto S1 inicio S2.codigo goto S0 nal
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:) }
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:) }
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
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 ...
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