Unidad 3 Lenguajes
Las optimizaciones pueden realizarse de diferentes formas. Las
optimizaciones se realizan en base al alcance ofrecido por el compilador. La
optimización va a depender del lenguaje de programación y es directamente
proporcional al tiempo de compilación; es decir, entre más optimización mayor
tiempo de compilación.
Como el tiempo de optimización es gran consumidor detiempo (dado que
tiene que recorrer todo el árbol de posibles soluciones para el proceso de
optimización) la optimización se deja hasta la fase de prueba final. Algunos
editores ofrecen una versión de depuración y otra de entrega o final.
La optimización es un proceso que tiene a minimizar o maximizar
alguna variable de rendimiento, generalmente tiempo, espacio, procesador, etc.Desafortunadamente no existen optimizadores que hagan un programa
más rápido y que ocupe menor espacio.
La optimización se realiza reestructurando el código de tal forma que el
nuevo código generado tenga mayores beneficios. La mayoría de los
compiladores tienen una optimización baja, se necesita de compiladores
especiales para realmente optimizar el código.
7.1 Tipos de optimización.
Optimización decódigo
La optimización de código puede realizarse durante la propia generación o como
paso adicional, ya sea intercalado entre el análisis semántico y la generación de
código (se optimizan las cuádruplas) o situado después de ésta (se optimiza a
posteriori el código generado).
Hay teoremas (Aho, 1970) que demuestran que la optimización perfecta es
indecidible. Por tanto, las optimizaciones decódigo en realidad proporcionan
mejoras, pero no aseguran el éxito total.
Clasificación de optimizaciones:
1. Dependientes de la máquina.
o
Asignación de registros (ver capítulo anterior).
o
Instrucciones especiales ("idioms").
o
Reordenación del código.
2. Independientes de la máquina.
o
Ejecución en tiempo de compilación.
o
Eliminación de redundancias.
o
Cambio de orden.
oReducción de frecuencia de ejecución (invariancias).
o
Reducción de fuerza.
Optimización y depuración suelen ser incompatibles. Por ejemplo, si se elimina
totalmente una instrucción, puede ser imposible poner una parada en ella para
depuración.
Ejemplo:
x = x;
Instrucciones especiales ("idiomas")
Algunas máquinas tienen instrucciones especiales que permiten acelerar
ciertos procesos.Por ejemplo:
• TRT en IBM 390 y XLAT en INTEL permiten realizar una codificación en
una sola instrucción máquina.
• MOV en IBM 370 permite copiar bloques de memoria de hasta 255
caracteres.
• REP en INTEL permite copiar, llenar o comparar bloques de memoria
utilizando como registros índice SI y DI.
• TEST en INTEL permite realizar fácilmente varias comparaciones booleanas.
Ejemplo:
if (x&4|| x&8) ... se puede representar:
TEST X,12
JZ L
...
L:
Reordenación del código
En muchas máquinas, la multiplicación en punto fijo de dos operandos
de longitud 1 da un operando de longitud 2, mientras la división necesita un
operando de longitud 2 y otro de longitud 1 para dar un cociente y un resto de
longitud 1. Reordenar las operaciones puede optimizar.
Por ejemplo: sea laexpresión a=b/c*d;
MOV AX,B
XOR DX,DX
DIV AX,C
MUL AX,D
MOV A,AX
Si la reordenamos así: a=b*d/c;, aprovechando que la multiplicación y la
división son asociativas, tenemos:
MOV AX,B
MUL AX,D
DIV AX,C
MOV A,AX
Ahorramos una instrucción. Veamos otro ejemplo:
a=b/c;
d=b%c;
Los dos códigos siguientes son equivalentes. Puede tratarse como un caso
particular del manejo de registros. Larealización de la primera división
debería guardar constancia de que DX contiene el resultado del resto.
MOV AX,B
XOR DX,DX
DIV AX,C
MOV A,AX
MOV AX,B
XOR DX,DX
DIV AX,C
MOV D,DX
MOV AX,B
XOR DX,DX
DIV AX,C
MOV A,AX
MOV D,DX
Ejecución en tiempo de compilación
Ejemplo:
int i;
float f;
i = 2+3;
i = 4;
f = i+2.5;
(+,2,3,t1)
(=,t1,,i)
(=,4,,i)
(CIF,i,,t2)
(+,t2,2.5,t3)...
Regístrate para leer el documento completo.