Codigo intermedio
-
Upload
pablo-ramirez -
Category
Documents
-
view
105 -
download
2
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