07.05.2013 Views

Tema 7 Objetivos del Tema - UNED

Tema 7 Objetivos del Tema - UNED

Tema 7 Objetivos del Tema - UNED

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!