Codigo intermedio
1. 2. 3. 4. 5. 6. Introducción Tipos de Código Intermedio Declaraciones Expresiones y Asignación Estructuras de Control Procedimientos y Funciones
Lecturas: Scott, capítulo 9 Muchnick, capítulos 4, 6 Aho, capítulo 8 Fischer, capítulos 10, 11 , 12 , 13, 14 Holub, capítulo 6 Bennett, capítulo 4, 10
12048 - J. Neira 1
1/6. Introducción
• Código intermedio:interfaz entre ‘front-ends’ y ‘back-ends’ • Se busca:
– transportabilidad – posibilidades de optimización
• Debe ser:
– abstracto – sencillo
• No se tiene en cuenta:
– – – – modos de direccionamiento tamaños de datos existencia de registros eficiencia de cada operación
¿por qué no generar el código final directamente?
12048 - J. Neira 2
Código Intermedio
• Ventajas:
– Permiteabstraer la máquina, separar operaciones de alto nivel de su implementación a bajo nivel. – Permite la reutilización de los front-ends y backends. – Permite optimizaciones generales.
• Desventajas:
– Implica una pasada más para el compilador (no se puede utilizar el modelo de una pasada, conceptualmente simple). – Dificulta llevar a cabo optimizaciones específicas de la arquitectura destino. –Suele ser ortogonal a la máquina destino, la traducción a una arquitectura específica será más larga e ineficiente.
3
12048 - J. Neira -
2/6. Tipos de Código Intermedio
• AST (Abstract Syntax Trees): forma condensada de árboles de análisis, con sólo nodos semánticos y sin nodos para símbolos terminales (se supone que el programa es sintácticamente correcto). Arbol de análisis:
E T P opad‘+’ P opmul P ‘*’ id(C) id(A) ‘+’ id(B) T ‘*’ id(C)
4
• Ventajas: unificación de pasos de compilación
– Creación del árbol y la tabla de símbolos – Análisis semántico – Optimización – Generación de código objeto
• Desventaja:
– espacio para almacenamiento
AST:
T E
id(A) id(B)
12048 - J. Neira -
ASTs
program gcd(input, output); var i,j : integer; begin read(i,j); while i j do ifi > j then i := i – j else j := j – i; writeln(i); end.
12048 - J. Neira -
5
Tipos de Código Intermedio
• DAG (Directed Acyclic Graphs): árboles sintácticos concisos
árbol sintáctico:
E
DAG:
E ‘+’
T id(B) ‘*’ id(C)
‘+’
T
T id(B) ‘*’ id(C)
id(B) ‘*’ id(C)
– Ahorran algo de espacio – Resaltan operaciones duplicadas en el código – Difíciles de construir
12048 -J. Neira 6
Tipos de Código Intermedio
• TAC (Three-Address Code): secuencia de instrucciones de la forma:
dir 1 dir 2 dir 3
resultado := operando1 op operando2
• Las operaciones más complejas requieren varias instrucciones: • Este ‘desenrollado’ facilita la optimización y generación de código final.
(a + b) x (c – (d / e))
– operador: aritmético / lógico – operandos/resultado:constantes, nombres, temporales.
• Se corresponde con instrucciones del tipo: a := b + c
12048 - J. Neira 7
TAC
• Ensamblador general y simplificado para una máquina virtual: incluye etiquetas, instrucciones de flujo de control… • Incluye referencias explícitas a las direcciones de los resultados intermedios (se les da nombre). • La utilización de nombres permite la reorganización (hastacierto punto). • Algunos compiladores generan este código como código final; se puede interpretar fácilmente (UCSD PCODE, Java). • Operadores:
CI muchos pocos corto largo generación optimización compleja sencilla compleja sencilla
12048 - J. Neira -
8
TAC • Variaciones sintácticas: (Aho) (Fischer)
(READI, A) (READI, B) (GT, A, B, t1) (JUMP0, t1, L1) (ADDI, A, 5, C) (JUMP, L2) (LABEL, L1)(ADDI, B, 5, C) (LABEL, L2) (SUBI,C, 1, t2) (MULTI, 2, t2, t3) (WRITEI, t3)
12048 - J. Neira -
1. Asignación: x := y op z x := op y x := y x[i] := y x := y[i] x := &y x := *y *x := y 2. Saltos: goto L if x oprel y goto L 3. Procedimientos: param x1 ... param xn call p, n
9
Representaciones de TAC
Fuente: a := b * c + b * d; • Cuádruplas: el destino suele ser una temporal. (*, b, c,...
Regístrate para leer el documento completo.