Codigo intermedio

download Codigo intermedio

of 27

Transcript of Codigo intermedio

Cdigo Intermedio

Compiladores II

1

Usos del Cdigo Intermedio Mltiples lenguajes y compiladores n+m mdulos -> n*m compiladores

Optimizacin Representacin de fcil modificacin

Modelos de generacin de cdigo o Mquinas abstractas FAM, G-machine, mquina de Warren

Compiladores transportables PASCAL /P-Code, JAVA

Interpretacin rpida OAKLisp, CLISP

Depuracin Intrpretes de C u otros lenguajes

Compiladores II

2

Notacin polaca Inversa (postfija) Se utiliza principalmente para la representacin de expresiones aritmticas Expresin a notacin polaca inversa Algoritmo Representar la expresin en forma de rbol sintctico Recorrer el rbol en postorden

Ejemplo: a+b*c-d+ a b

d * c

Cdigo: a b c * + d Compiladores II 3

Extensin a instrucciones de control de flujo

Ejemplo: Fuente: if then else No se puede traducir a: If ya que solo se ha de evaluar una de las instrucciones Cdigo generado etiqueta1 Salta si falso etiqueta2 Salta etiqueta1: etiqueta2:Compiladores II

Cdigo ms tpico Salta Si falso Etiqueta1 Salta Etiqueta2 Etiqueta1: Etiqueta2:

4

Pros y Contras de la Notacin Polaca Inversa Generacin de cdigo: Simple No utiliza registros

Optimizacin Es difcil de reordenar ya que hay que considerar el contenido de la pila

Interpretacin rpida Es muy fcil de interpretar ya que solo necesita una pila

Transportable: Si, ya que todos los procesadores implementan una pila.

Compiladores II

5

n-tuplas En la notacin de n-tuplas cada instruccin es una n-tupla. Tripletas , , El resultado se asocia al nmero de tripleta

Tripletas indirectas Son tripletas donde el orden de ejecucin se especifica a parte.

Cuadruplas , , ,

Compiladores II

6

Tripletas Tripleta: , , el resultado se asocia al nmero de tripleta Ejemplo: W*X+(Y+Z)1. *, W, X 2. +, Y, Z 3. +, (1), (2)

Control de flujo:IF X>Y THEN Z=X ELSE Z=Y+1 1. >, X, Y 2. Saltar si falso, (1), 5 3. =, Z, X 4. Saltar, , 7 5. +, Y, 1 6. =, Z, (5) 7. ...

Problema: La optimizacin supone mover tripletas y hay que recalcular las referenciasCompiladores II 7

Tripletas Indirectas Tripletas indirectas. Solucionan el problemas de la reordenacin mediante indireccin Ejemplo: Fuente:A=B+C*D/E F=C*D

Operaciones1. (1) 2. (2) 3. (3) 4. (4) 5. (1) 6. (5)

Tripletas(1) *, C, D (2) /, (1), E (3) +, B (2) (4) =, A, (3) (5) =, F, (1)

Compiladores II

8

Cudruplas Cudrupla:, , ,

Ejemplo:(A+B)*(C+D)-E +, A, B, T1 +, C, D, T2 *, T1, T2, T3 -, T3, E, T4

T1, T2, T3, T4 son variables temporales.

Las cudruplas facilitan la aplicacin de muchas optimizaciones, pero hay que tener un algoritmo para la reutilizacin de las variables temporales (reutilizacin de registros del procesador).Compiladores II 9

rboles sintcticos abstractos Fcil creacin: Se crea a partir del rbol sintctico. Se elimina la informacin innecesaria. Smbolo no terminales

Ejemplo: (a*b)/(c+d)

/ * a b c + d

Compiladores II

10

rboles sintcticos abstractos Fcil optimizacin: El rbol representa directamente la estructura del lenguaje fuente, y por tanto, las modificaciones que haramos en el fuente son fciles de realizar en el rbol. Como el rbol representa la estructura del lenguaje es fcil aplicarle las propiedades de este para optimizar. Propiedad conmutativa. Propiedad asociativa. etc.

Compiladores II

11

Ejemplos de rbol en CoSeL

Un rbol sintctico esta formado por las estructuras apply con el contenido: Funcin: operador raz Arg(0), Arg(1)... Argumentos del operador Ejemplo:VerArbol(`( Fun f(n)=> if (n +- f | +- n +- If_Else +- { if (TypeP(Symbol,arbol)) [arbol] else if (TypeP(Apply,arbol)) { Var lv=[]; // lista de variables for (i { if (ApplyFunP(arbol,`\=,2) && TypeP(Symbol,arbol.arg(0))) { [arbol.Arg(0)] } else if (TypeP(Apply,arbol)) { Var lv=[]; for (i { Var ExpR=[]; Fun Eliminar(a)=> { Search (r } else if (TypeP(Apply,a)) { Var na=newapply(a.function,a.nargs); for (i