Tema 7 Objetivos del Tema - UNED
Tema 7 Objetivos del Tema - UNED
Tema 7 Objetivos del Tema - UNED
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
UNIVERSIDAD NACIONAL DE EDUCACIÓN A DISTANCIA<br />
Escuela Técnica Superior de Ingeniería Informática<br />
Javier Vélez Reyes jvelez@lsi.uned.es<br />
Procesadores de Lenguajes<br />
<strong>Tema</strong> 7<br />
Optimización de código<br />
Aprender qué es la optimización<br />
Aprender a diferenciar entre<br />
Optimización de código intermedio<br />
Optimización de código final<br />
Javier Vélez Reyes<br />
jvelez@lsi.uned.es<br />
<strong>Objetivos</strong> <strong>del</strong> <strong>Tema</strong><br />
Aprender a obtener un buen rendimiento<br />
Estudiar la estructura de un optimizador de CI<br />
Entender transformaciones básicas de optimización<br />
1
Javier Vélez Reyes jvelez@lsi.uned.es<br />
Introducción<br />
Optimización de código<br />
Criterios de optimización<br />
Obtención de un mayor rendimiento<br />
Índice General<br />
Estructura de un optimizador de Código intermedio<br />
Transformaciones que preservan la función<br />
Optimización de bucles<br />
Javier Vélez Reyes jvelez@lsi.uned.es<br />
Optimización de código<br />
Introducción<br />
La optimización <strong>del</strong> código es un proceso de transformación <strong>del</strong><br />
código intermedio mediante el cual se consigue mejorar la<br />
velocidad de ejecución <strong>del</strong> mismo y reducir su tamaño.<br />
Es difícil obtener un código eficiente directamente<br />
Mediante la optimización se pretende que<br />
El código final ejecutable sea más rápido<br />
El código final ocupe menos espacio en memoria (compacto)<br />
Dos tipos de transformaciones<br />
Independientes de la máquina (capítulo 7)<br />
Dependientes de la máquina (capítulo 6.III)<br />
2
Javier Vélez Reyes jvelez@lsi.uned.es<br />
Optimización de código<br />
Técnicas de transformación<br />
Reunir estadísticas sobre los programas fuente<br />
Introducción<br />
Evaluar la ventaja de un conjunto de optimizaciones<br />
Es necesaria una muestra representativa de programas <br />
Una técnica frecuente es el análisis de flujos de datos<br />
Recopilar información sobre el modo en que se usan variables<br />
Existen varios algoritmos para recopilar la información<br />
Se considera el impacto de construcciones de lenguaje<br />
Procedimientos<br />
Apuntadores<br />
Javier Vélez Reyes jvelez@lsi.uned.es<br />
Criterios de optimización<br />
Optimización de código<br />
Una transformación debe preservar el significado <strong>del</strong><br />
programa fuente. Una optimización no debe cambiar el<br />
resultado producido por un programa para una entrada<br />
dada o causar un error<br />
Una transformación debe acelerar los programas en una<br />
cantidad mensurable.<br />
A veces las transformaciones van dirigidas a optimizar el<br />
tamaño <strong>del</strong> código.<br />
A veces, una optimización podrá ralentizar ligeramente un<br />
programa, pero será válida si, en general, mejora los programas<br />
Una transformación debe ser ventajosa. No tiene<br />
sentido incluir esfuerzos y ciclos de computo a una<br />
optimización que no suponga mejora significativa<br />
3
Javier Vélez Reyes jvelez@lsi.uned.es<br />
Obtención de un mayor rendimiento<br />
Aplicar algoritmos a distintos niveles<br />
Código fuente<br />
Código intermedio<br />
Código objeto<br />
Javier Vélez Reyes jvelez@lsi.uned.es<br />
Optimización de código<br />
El usuario puede perfilar el<br />
programa, modificar<br />
algoritmos y transformar<br />
bucles<br />
El compilador puede<br />
mejorar los bucles, llamar a<br />
procedimientos, calcular<br />
direcciones<br />
El compilador puede usar<br />
registros, seleccionar<br />
instrucciones o hacer<br />
transformaciones locales<br />
Análisis Léxico<br />
Análisis Sintáctico<br />
Análisis Semántico<br />
Generación de código<br />
intermedio<br />
Optimización de código<br />
intermedio<br />
Generación de código<br />
objeto<br />
Estructura de un optimizador de Código intermedio<br />
3 etapas<br />
Análisis de flujo de<br />
control<br />
Análisis de flujo de<br />
datos<br />
Realización de<br />
transformaciones<br />
Optimización de código<br />
Optimización de código<br />
intermedio<br />
4
Javier Vélez Reyes jvelez@lsi.uned.es<br />
Optimización de código<br />
Estructura de un optimizador de Código intermedio<br />
Características<br />
Las operaciones necesarias para implantar<br />
construcciones de alto nivel se hacen explícitas en el<br />
código intermedio de modo que es posible<br />
optimizarlas<br />
El código intermedio puede ser independiente de la<br />
máquina objeto de modo que el optimizador no<br />
cambia mucho si el generador de código se sustituye<br />
Los programas se representan mediante grafos de<br />
flujo en el que los nodos indican bloques básicos y<br />
las aristas el flujo de control<br />
Javier Vélez Reyes jvelez@lsi.uned.es<br />
Principales fuentes para la optimización<br />
Ejemplo<br />
void clasificación (int m, n) {<br />
int i, j;<br />
int v;<br />
if ( n 1 );<br />
do j = j – 1; while ( a [j] > v );<br />
if ( i >= j ) break;<br />
x = a [i]; a [i] := a [j]; a [j] = x;<br />
}<br />
clasificación (m, j);<br />
clasificación (i + 1, n);<br />
}<br />
B5<br />
t6 := 4 * i<br />
x := a [t6]<br />
t7 := 4 * i<br />
t8 := 4 * j<br />
t9 := a [t8]<br />
a [t7] := t9<br />
t10 := 4 * j<br />
a [t10] := x<br />
goto B2<br />
i := m – 1<br />
j := ni<br />
t1 := 4 * n<br />
v := a [t1]<br />
i := i + 1<br />
t2 := 4 * i<br />
t3 := a [t2]<br />
if (t3 < v) goto B2<br />
j := j -1<br />
t4 := 4 * j<br />
t5 := a [t4]<br />
if (t5 > v) goto B3<br />
If (i > j) goto B6<br />
B2<br />
B3<br />
B4<br />
t11 := 4 * i<br />
x := a [t11]<br />
t12 := 4 * i<br />
t13 := 4 * n<br />
t14 := a [t13]<br />
a [t12] := t14<br />
t15 := 4 * n<br />
a [t15] := x<br />
B6<br />
5
Javier Vélez Reyes jvelez@lsi.uned.es<br />
Principales fuentes para la optimización<br />
Transformaciones que preservan la función<br />
Eliminación de subexpresiones comunes<br />
Una ocurrencia de una expresión E se denomina subexpresión<br />
común si E ha sido previamente calculada y los valores de las<br />
variables dentro de E no han cambiado desde el cálculo anterior<br />
B5 B5<br />
t6 := 4 * i<br />
x := a [t6]<br />
t7 := 4 * i<br />
t8 := 4 * j<br />
t9 := a [t8]<br />
a [t7] := t9<br />
t10 := 4 * j<br />
a [t10] := x<br />
goto B2<br />
t6 := 4 * i<br />
x := a [t6]<br />
t8 := 4 * j<br />
t9 := a [t8]<br />
a [t6] := t9<br />
a [t18] := x<br />
goto B2<br />
Javier Vélez Reyes jvelez@lsi.uned.es<br />
Principales fuentes para la optimización<br />
Transformaciones que preservan la función<br />
Propagación de copias<br />
La propagación de copias permite eliminar asignaciones<br />
redundantes almacenando el valor de una expresión en una<br />
variable de copia<br />
a := d + e b := d + e<br />
c := d + e<br />
a := d + e<br />
a := t<br />
c := t<br />
t := d + e<br />
b := t<br />
6
Javier Vélez Reyes jvelez@lsi.uned.es<br />
Principales fuentes para la optimización<br />
Transformaciones que preservan la función<br />
Eliminación de código inactivo<br />
Un código inactivo o inútil es aquél conjunto de proposiciones<br />
que calculan valores que nunca llegan a utilizarse<br />
Es poco probable que provenga <strong>del</strong> código fuente<br />
Puede aparecer como resultado de otras transformaciones<br />
depura := false; i := 0;<br />
i++;<br />
If (depura) then<br />
println (‘i = ’, i);<br />
depura := true; i := 0;<br />
i++;<br />
If (depura) then<br />
println (‘i = ’, i);<br />
i := 0;<br />
i++;<br />
i := 0;<br />
i++;<br />
println (‘i = ’, i);<br />
Javier Vélez Reyes jvelez@lsi.uned.es<br />
Principales fuentes para la optimización<br />
Optimización de bucles<br />
Traslado de código<br />
Las transformaciones de traslado de código toman una<br />
expresión que produce el mismo resultado independientemente<br />
<strong>del</strong> número de veces que ésta se ejecuta y la ubica antes <strong>del</strong><br />
bucle.<br />
Disminuye la cantidad de código en el bucle<br />
‘antes <strong>del</strong> lazo’ supone la existencia de una entrada al lazo<br />
while ( i
Javier Vélez Reyes jvelez@lsi.uned.es<br />
Principales fuentes para la optimización<br />
Optimización de bucles<br />
Reducción de intensidad<br />
Dentro de B3, j y t4 son<br />
variables de inducción<br />
puesto que ambas<br />
variables están<br />
vinculadas. Cuando j<br />
disminuye en una unidad<br />
t4 lo hace en 4<br />
B5<br />
t6 := 4 * i<br />
x := a [t6]<br />
t7 := 4 * i<br />
t8 := 4 * j<br />
t9 := a [t8]<br />
a [t7] := t9<br />
t10 := 4 * j<br />
a [t10] := x<br />
goto B2<br />
i := m – 1<br />
j := ni<br />
t1 := 4 * n<br />
v := a [t1]<br />
i := i + 1<br />
t2 := 4 * i<br />
t3 := a [t2]<br />
if (t3 < v) goto B2<br />
j := j -1<br />
t4 := 4 * j<br />
t5 := a [t4]<br />
if (t5 > v) goto B3<br />
If (i > j) goto B6<br />
B2<br />
B3<br />
B4<br />
t11 := 4 * i<br />
x := a [t11]<br />
t12 := 4 * i<br />
t13 := 4 * n<br />
t14 := a [t13]<br />
a [t12] := t14<br />
t15 := 4 * n<br />
a [t15] := x<br />
Javier Vélez Reyes jvelez@lsi.uned.es<br />
Principales fuentes para la optimización<br />
Optimización de bucles<br />
Reducción de intensidad<br />
Cuando hay 2 o más<br />
variables de inducción<br />
dentro de un bucle es<br />
posible suprimirlas todas<br />
menos una mediante un<br />
proceso de reducción de<br />
intensidad<br />
B5<br />
t6 := 4 * i<br />
x := a [t6]<br />
t7 := 4 * i<br />
t8 := 4 * j<br />
t9 := a [t8]<br />
a [t7] := t9<br />
t10 := 4 * j<br />
a [t10] := x<br />
goto B2<br />
i := m – 1<br />
j := ni<br />
t1 := 4 * n<br />
v := a [t1]<br />
t4 := 4 * j<br />
i := i + 1<br />
t2 := 4 * i<br />
t3 := a [t2]<br />
if (t3 < v) goto B2<br />
j := j – 1<br />
t4 := t4 – 4<br />
t5 := a [t4]<br />
if (t5 > v) goto B3<br />
If (i > j) goto B6<br />
B2<br />
B3<br />
B4<br />
t11 := 4 * i<br />
x := a [t11]<br />
t12 := 4 * i<br />
t13 := 4 * n<br />
t14 := a [t13]<br />
a [t12] := t14<br />
t15 := 4 * n<br />
a [t15] := x<br />
B6<br />
B6<br />
8
Javier Vélez Reyes jvelez@lsi.uned.es<br />
[AJO]<br />
[GARRIDO]<br />
AHO, SETHI, ULLMAN: Compiladores: Principios,<br />
técnicas y herramientas,: addison-Wesley<br />
Iberoamericana, 1990<br />
A. Garrido, J. Iñesta, F. Moreno y J. Pérez.<br />
2002. Diseño de compiladores. Universidad de<br />
Alicante.<br />
Bibliografía<br />
9