Professional Documents
Culture Documents
COMPILADORES
Otoño 2009
1 de 17
INDICE
1.1 Introducción 2
1.2 Optimización de código y generación de código objeto
2 1.2.1 Optimización de código
2
1.2.1.1 Cálculo previo de constantes
3
1.2.1.2 Reducción de fuerza y frecuencia 3
1.2.1.3 Optimización de lazos
4
1.2.1.4 Eliminación de código
5
1.2.1.5 Reacomodos 5
1.2.1.6 Optimización local 5
1.2.2 Generador de código objeto 6
1.2.2.1 Diseño de un generador de código
6
Entrada al generador de código
6
Programas objeto 7
Administración de la memoria
7
Selección de instrucciones 7
Asignación de registros 8
1.2.2.2 La máquina objeto 9
Costos de las instrucciones 9
1.2.2.3 Bloques 10
Bloques básicos 10
Transformaciones en bloques básicos
11
Grafos de flujo 12
1.2.2.4 Un generador de código simple
13
Algoritmo para generación de código
13
Generación de código para otro tipo de
proposiciones14
1.3 Conclusión 15
1.4 Bibliografía 16
1.5 Referencia 16
2 de 17
1.1 INTRODUCCIÓN
A menudo se puede lograr que el código directamente producido
por los algoritmos de compilación se ejecute más rápidamente o que
ocupe menos espacio, o ambas cosas. Esta mejora se consigue
mediante transformaciones de programas que se denominan
optimizaciones.
Tabla de
símbolos
3 de 17
optimización suele subdividirse el programa en regiones de
optimización, y las técnicas empleadas pueden categorizarse como
independientes de la máquina y dependientes de la máquina. Las
técnicas de optimización independientes de la máquina no tienen
porque considerar el conocimiento de la estructura de hardware ni el
conjunto de instrucciones de la máquina destino, por lo que son de
carácter general. En cambio, las técnicas dependientes de la máquina
deben conocer el hardware y el conjunto de instrucciones, ya que
afectan cosas como la asignación de registros o a selección de
instrucciones.
Entre las técnicas de optimización están las siguientes:
Cálculo previo de constantes;
Reducción de fuerza y frecuencia;
Optimización de lazos(ciclos);
Eliminación de código;
Reacomodos;
Optimización local.
i := 14
i := 10;
k := 40;
4 de 17
1.2.1.2 REDUCCIÓN DE FUERZA Y FRECUENCIA
i := 0;
REPEAT
x := x + h[i + j – k]; i := i + 3;
UNTIL (i >max – 3)
t1 := j – k;
t2 := max – 3;
i := 0;
REPEAT
x := x + h[i + ti] ; i := i + 3 ;
UNTIL (i > t2)
5 de 17
1.2.1.3 OPTIMIZACIÓN DE LAZOS
6 de 17
donde j * k es la subexpresión común. Esta subexpresión se
puede eliminar como sigue:
t := j * k; x := a / t – b / t;
1.2.1.5 REACOMODOS
CLR R0
7 de 17
Las optimizaciones pueden dar lugar a otras optimizaciones o
mejoras del código, de manera que es necesario repetir varias veces
la optimización local para obtener la máxima mejora del código.
PROGRAMAS OBJETO
8 de 17
ADMINISTRACIÓN DE LA MEMORIA
SELECCIÓN DE INSTRUCCIONES
ASIGNACIÓN DE REGISTROS
9 de 17
Es difícil encontrar una asignación óptima de registros a
variables, incluso con valores en un solo registro. Matemáticamente,
el problema es NP completo. Este problema se complica aún más el
hardware, el sistema operativo o ambos, en la máquina objeto
pueden exigir que se cumplan ciertas convenciones del uso de
registros.
Ejemplo:
t := a + b
t := a * c
t := t / d
L R1, a (L = carga)
A R1, b (A = suma)
M R0, c (M = multiplica)
D R0, d (D = divide)
ST R1, t (ST = almacena)
10 de 17
indirecto
1. MOV b, R0
ADD c, R0 costo = 6
MOV R0, a
2. MOV b ,a
ADD c, a costo = 6
4. ADD R2, R1
MOV *R1, a costo = 3
1.2.2.3 BLOQUES
11 de 17
Una representación de grafos de proposiciones de tres
direcciones, llamado grafo de flujo, es útil para entender los
algoritmos de generación de código. Los nodos del grafo de flujo
representan cálculos y las aristas representan el flujo de control.
BLOQUES BÁSICOS
t1 := a*a
t2 := a*b
t3 := 2 * t2
t4 := t1 + t3
t5 := b*b
t6 := t4 + t5
12 de 17
TRANSFORMACIONES QUE PRESERVAN LA ESTRUCTURA
TRANSFORMACIONES ALGEBRAICAS
13 de 17
Las transformaciones útiles son las que simplifican las
expresiones o sustituyen operaciones caras por otras más baratas.
Por ejemplo, las proposiciones como
x := x + 0 ó
x := x * 1
GRAFOS DE FLUJO
Los nodos del grafo de flujo son los bloques básicos. Un nodo se
distingue como inicial; es el bloque cuyo líder es la primera
proposición. Hay una arista dirigida del bloque B1 al bloque B2 si
1. hay un salto condicional o incondicional desde la última
proposición de B1 a la primera proposición de B2, ó
2. B2 sigue inmediatamente a B1 en el orden del programa, y
B1 no termina con un salto incondicional.
prod := 0
i := 1 B1
t1 := 4 * i
t2 := a [t1]
t3 := 4 * i
t4 := b [t3] B2
t5 := t2 * t4
t6 := prod + t5
prod := t6
t7 := i + 1
i := t7
if i <= 20 goto B2
14 de 17
Para evitar un posible error, el algoritmo de generación de código
simple guarda todo en memoria cuando se traslada a través de los
límites de los bloques básicos así como cuando se hacen llamadas a
procedimientos.
Función obtenreg
15 de 17
Secuencias de código para asignaciones con apuntadores:
Proposiciones condicionales:
1.3 CONCLUSIÓN
Los objetivos principales de la optimización de código son reducir
el tamaño de un programa, aumentar la velocidad de ejecución de un
programa o ambos. Aunque en realidad no existe garantía alguna de
que después de la optimización el código que resulta de esta sea
óptimo.
16 de 17
1.4 BIBLIOGRAFÍA
1. Aho, V, Compiladores, principios, técnicas y herramientas,
editorial addison wesley iberoamerica.
1.5 REFERENCIA
El lector interesado en la investigación anterior debe consultar Waite
[1976a,b], Aho y Sethi [1977], Graham [1980 y 1984], Ganapathi,
Fischer y Hennessy [1982], Lunell [1983] y Henry [1984].
17 de 17