You are on page 1of 9

UNIVERSIDAD NACIONAL DE EDUCACIÓN A DISTANCIA

Escuela Técnica Superior de Ingeniería Informática


Procesadores de Lenguajes

Tema 7

Optimización de código

Javier Vélez Reyes


jvelez@lsi.uned.es

Javier Vélez Reyes jvelez@lsi.uned.es

Objetivos del Tema


„ Aprender qué es la optimización
„ Aprender a diferenciar entre
„ Optimización de código intermedio
„ Optimización de código final
„ Aprender a obtener un buen rendimiento
„ Estudiar la estructura de un optimizador de CI
„ Entender transformaciones básicas de optimización

1
Javier Vélez Reyes jvelez@lsi.uned.es

Índice General
„ Introducción
„ Optimización de código
„ Criterios de optimización
„ Obtención de un mayor rendimiento
„ Estructura de un optimizador de Código intermedio
„ Transformaciones que preservan la función
„ Optimización de bucles

Javier Vélez Reyes jvelez@lsi.uned.es

Introducción
„ Optimización de código
La optimización del código es un proceso de transformación del
código intermedio mediante el cual se consigue mejorar la
velocidad de ejecución del mismo y reducir su tamaño.

„ Es difícil obtener un código eficiente directamente


„ Mediante la optimización se pretende que
„ El código final ejecutable sea más rápido
„ El código final ocupe menos espacio en memoria (compacto)
„ Dos tipos de transformaciones
„ Independientes de la máquina (capítulo 7)
„ Dependientes de la máquina (capítulo 6.III)

2
Javier Vélez Reyes jvelez@lsi.uned.es

Introducción
„ Optimización de código
„ Técnicas de transformación
„ Reunir estadísticas sobre los programas fuente
„ Evaluar la ventaja de un conjunto de optimizaciones
„ Es necesaria una muestra representativa de programas /
„ Una técnica frecuente es el análisis de flujos de datos
„ Recopilar información sobre el modo en que se usan variables
„ Existen varios algoritmos para recopilar la información
„ Se considera el impacto de construcciones de lenguaje
„ Procedimientos

„ Apuntadores

Javier Vélez Reyes jvelez@lsi.uned.es

Optimización de código
„ Criterios de optimización
„ Una transformación debe preservar el significado del
programa fuente. Una optimización no debe cambiar el
resultado producido por un programa para una entrada
dada o causar un error
„ Una transformación debe acelerar los programas en una
cantidad mensurable.
„ A veces las transformaciones van dirigidas a optimizar el
tamaño del código.
„ A veces, una optimización podrá ralentizar ligeramente un
programa, pero será válida si, en general, mejora los programas
„ Una transformación debe ser ventajosa. No tiene
sentido incluir esfuerzos y ciclos de computo a una
optimización que no suponga mejora significativa

3
Javier Vélez Reyes jvelez@lsi.uned.es

Optimización de código
„ Obtención de un mayor rendimiento
„ Aplicar algoritmos a distintos niveles
„ Código fuente Análisis Léxico
El usuario puede perfilar el
programa, modificar
algoritmos y transformar Análisis Sintáctico
bucles

„ Código intermedio Análisis Semántico


El compilador puede
mejorar los bucles, llamar a
procedimientos, calcular Generación de código
direcciones intermedio

„ Código objeto
Optimización de código
El compilador puede usar intermedio
registros, seleccionar
instrucciones o hacer
transformaciones locales
Generación de código
objeto

Javier Vélez Reyes jvelez@lsi.uned.es

Optimización de código
„ Estructura de un optimizador de Código intermedio
„ 3 etapas
Análisis de flujo de
control

Análisis de flujo de Optimización de código


datos intermedio

Realización de
transformaciones

4
Javier Vélez Reyes jvelez@lsi.uned.es

Optimización de código
„ Estructura de un optimizador de Código intermedio
„ Características
„ Las operaciones necesarias para implantar
construcciones de alto nivel se hacen explícitas en el
código intermedio de modo que es posible
optimizarlas

„ El código intermedio puede ser independiente de la


máquina objeto de modo que el optimizador no
cambia mucho si el generador de código se sustituye

„ Los programas se representan mediante grafos de


flujo en el que los nodos indican bloques básicos y
las aristas el flujo de control

Javier Vélez Reyes jvelez@lsi.uned.es

Principales fuentes para la optimización


i := m – 1
„ Ejemplo j := ni
t1 := 4 * n
v := a [t1]

void clasificación (int m, n) {


i := i + 1 B2
int i, j; t2 := 4 * i
t3 := a [t2]
int v;
if (t3 < v) goto B2
if ( n <= m) return;
i = m – 1; j = n; v = a [n];
j := j -1 B3
while (1) { t4 := 4 * j
do i = i + 1; while ( a [i] > 1 ); t5 := a [t4]
if (t5 > v) goto B3
do j = j – 1; while ( a [j] > v );
if ( i >= j ) break;
If (i > j) goto B6 B4
x = a [i]; a [i] := a [j]; a [j] = x; B5 B6
}
t6 := 4 * i t11 := 4 * i
clasificación (m, j); x := a [t6] x := a [t11]
clasificación (i + 1, n); t7 := 4 * i t12 := 4 * i
t8 := 4 * j t13 := 4 * n
} t9 := a [t8] t14 := a [t13]
a [t7] := t9 a [t12] := t14
t10 := 4 * j t15 := 4 * n
a [t10] := x a [t15] := x
goto B2

5
Javier Vélez Reyes jvelez@lsi.uned.es

Principales fuentes para la optimización


„ Transformaciones que preservan la función
„ Eliminación de subexpresiones comunes
Una ocurrencia de una expresión E se denomina subexpresión
común si E ha sido previamente calculada y los valores de las
variables dentro de E no han cambiado desde el cálculo anterior

B5 B5
t6 := 4 * i t6 := 4 * i
x := a [t6] x := a [t6]
t7 := 4 * i t8 := 4 * j
t8 := 4 * j t9 := a [t8]
t9 := a [t8] a [t6] := t9
a [t7] := t9 a [t18] := x
t10 := 4 * j goto B2
a [t10] := x
goto B2

Javier Vélez Reyes jvelez@lsi.uned.es

Principales fuentes para la optimización


„ Transformaciones que preservan la función
„ Propagación de copias

La propagación de copias permite eliminar asignaciones


redundantes almacenando el valor de una expresión en una
variable de copia

a := d + e t := d + e
a := d + e b := d + e a := t b := t

c := d + e c := t

6
Javier Vélez Reyes jvelez@lsi.uned.es

Principales fuentes para la optimización


„ Transformaciones que preservan la función
„ Eliminación de código inactivo
Un código inactivo o inútil es aquél conjunto de proposiciones
que calculan valores que nunca llegan a utilizarse

„ Es poco probable que provenga del código fuente


„ Puede aparecer como resultado de otras transformaciones

depura := false; i := 0; i := 0;
i++; i++;
If (depura) then
println (‘i = ’, i);

depura := true; i := 0; i := 0;
i++; i++;
If (depura) then println (‘i = ’, i);
println (‘i = ’, i);

Javier Vélez Reyes jvelez@lsi.uned.es

Principales fuentes para la optimización


„ Optimización de bucles
„ Traslado de código
Las transformaciones de traslado de código toman una
expresión que produce el mismo resultado independientemente
del número de veces que ésta se ejecuta y la ubica antes del
bucle.

„ Disminuye la cantidad de código en el bucle


„ ‘antes del lazo’ supone la existencia de una entrada al lazo

t := límite – 2
while ( i <= límite – 2 )
while ( i <= t )

7
Javier Vélez Reyes jvelez@lsi.uned.es

Principales fuentes para la optimización


i := m – 1
„ Optimización de bucles j := ni
t1 := 4 * n
v := a [t1]
„ Reducción de intensidad
i := i + 1 B2
Dentro de B3, j y t4 son t2 := 4 * i
t3 := a [t2]
variables de inducción if (t3 < v) goto B2
puesto que ambas
variables están j := j -1 B3
t4 := 4 * j
vinculadas. Cuando j t5 := a [t4]
disminuye en una unidad if (t5 > v) goto B3

t4 lo hace en 4
If (i > j) goto B6 B4
B5 B6

t6 := 4 * i t11 := 4 * i
x := a [t6] x := a [t11]
t7 := 4 * i t12 := 4 * i
t8 := 4 * j t13 := 4 * n
t9 := a [t8] t14 := a [t13]
a [t7] := t9 a [t12] := t14
t10 := 4 * j t15 := 4 * n
a [t10] := x a [t15] := x
goto B2

Javier Vélez Reyes jvelez@lsi.uned.es

Principales fuentes para la optimización


i := m – 1
„ Optimización de bucles j := ni
t1 := 4 * n
v := a [t1]
„ Reducción de intensidad t4 := 4 * j

i := i + 1 B2
Cuando hay 2 o más t2 := 4 * i
t3 := a [t2]
variables de inducción if (t3 < v) goto B2
dentro de un bucle es
posible suprimirlas todas j := j – 1 B3
t4 := t4 – 4
menos una mediante un t5 := a [t4]
proceso de reducción de if (t5 > v) goto B3

intensidad
If (i > j) goto B6 B4
B5 B6

t6 := 4 * i t11 := 4 * i
x := a [t6] x := a [t11]
t7 := 4 * i t12 := 4 * i
t8 := 4 * j t13 := 4 * n
t9 := a [t8] t14 := a [t13]
a [t7] := t9 a [t12] := t14
t10 := 4 * j t15 := 4 * n
a [t10] := x a [t15] := x
goto B2

8
Javier Vélez Reyes jvelez@lsi.uned.es

Bibliografía

[AJO] AHO, SETHI, ULLMAN: Compiladores: Principios,


técnicas y herramientas,: addison-Wesley
Iberoamericana, 1990

[GARRIDO] A. Garrido, J. Iñesta, F. Moreno y J. Pérez.


2002. Diseño de compiladores. Universidad de
Alicante.

You might also like