Sunteți pe pagina 1din 13

Generación de Código

Etapa de Síntesis-Back End

Generación de Código Intermedio

Podemos pensar en el código intermedio como un código generalizado


para una máquina abstracta. Esta representación intermedia debe tener
dos propiedades importantes: debe ser fácil de producir y fácil de
traducir al programa objeto.

Ventajas:

Se aumenta la portabilidad del compilador de una máquina a otra (en


particular si existe un ejecutor del CI)

Un optimizador de código puede ser aplicado al CI antes de generar


código de máquina
Ejemplo:
Problema: Construir compiladores para los lenguajes C, Pascal y ADA
para 4 instalaciones diferentes: Ultrasparc, PicoJava, PowerPC
y Pentium.

C Pascal ADA

Ultrasparc PicoJava PowerPC Pentium

p lenguajes y q procesadores = p x q compiladores


Si se usa generación de código intermedio se tiene la siguiente situación:

C Pascal ADA

Código
intermedio

Ultrasparc PicoJava PowerPC Pentium

p lenguajes y q procesadores = p + q compiladores


Ejemplos reales de generación y ejecución de código intermedio:

•JAVA y la Java Virtual Machine

•Tecnología .NET y el NetFramework junto con el MSIL


(Microsoft Intermediate Languaje)

•USCD-Pascal, PL0 y el Código-P (p-code)


Propuesta de lenguaje intermedio universal:

UNCOL= Universal Compiler Oriented Languaje.


Debido a la diversidad de lenguajes y máquinas el UNCOL fracasó y la
pelea se encuentra ahora entre JVM y NetFramework.

Algunos otros lenguajes intermedios

1) Notación de Cuartetos:

Formato: (<Operador>,<Operando1>,<Operando2>,<Resultado>)

Ejemplo: A/B es generado como (/,A,B,T)


T es una variable auxiliar
2) Notación de Tercetos:

Formato: (<Operador>,<Operando1>,<Operando2>)

Ejemplo 1: A+B/C es generado como:

1. (/,B,C)
2. (+,A,(1))

El resultado queda implícitamente asociado al terceto


(1) Indica el resultado obtenido al ejecutar al terceto 1

Ejemplo 2: A+1 es generado como:

1. (+,A,1)
3) Tercetos Indirectos

4) Notación Polaca Inversa (RPN=Reverse Polish Notation)

También conocida como Notación de Lukasciewicz

Ejemplo :

a+b*c se codifica como abc*+


Optimización de Código (Intermedio)

Propósito: En esta fase se trata de mejorar el código intermedio, de


modo que resulte un código de máquina más rápido de ejecutar.
El concepto de optimización se aplica también a los compiladores que
generan código objeto sin pasar por el código intermedio.

Factores a optimizar:

* velocidad de ejecución
* tamaño del programa
* necesidades de memoria

Se sigue una aproximación conservadora


No se aplican todas las posibles optimizaciones, solo las “seguras”
Ejemplo:

Programa fuente: C=A+B

Cuartetos generados:
(+,A,B,X1)
(=,-,X1,C)

Código objeto generado:

Carga ac A
Suma B
Guarda ac X1
Redundante
Carga ac X1
Guarda ac C
Clasificación de las optimizaciones

1. En función de la arquitectura de la computadora

1.1 Dependientes de la máquina:

Aprovechan características específicas de la máquina


objetivo.
• Asignación de registros, uso de modos de direccionamiento
• uso instrucciones especiales
• predicción de saltos, aprovechamiento de estrategias
de memoria y caché, etc.
Clasificación de las optimizaciones

1. En función de la arquitectura de la computadora

1.2 Independientes de la máquina:

Aplicables en cualquier tipo de máquina objetivo


• ejecución en tiempo de compilación
• eliminación de redundancias
• cambios del orden de ejecución, etc.
Clasificación de las optimizaciones

2. En función del ámbito de aplicación

2.1 Optimizaciones locales:


Aplicadas dentro de un bloque básico
• Solo se analizan las instrucciones del bloque básico actual

2.2 Optimizaciones globales:


Aplicadas a más de un bloque básico
• Consideran contenido y flujo de datos entre todos o parte de
los bloques (procedimientos, subrutinas, funciones) del
programa fuente.
Posibilidades de optimización:

- Sobre el código fuente (preprocesador)

- Sobre código intermedio

-Sobre código objeto

S-ar putea să vă placă și