Optimizacion de codigo gy noraymaarisbcth I ACk’a6pR 02, 2010 S pagos 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 dificil 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 Optimización de códi Técnicas de transfor Reunir estadísticas s ors to View nut*ge te 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 Criterios de optimización Una transformación debe preservar el significado del programa fuente.
Una optimizacion no debe cambiar el resultado producido por un programa para una entrada dada o causar un error una ensurable. 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 Obtención de un mayor rendimiento Aplicar algoritmos a distintos niveles Código fuente El usuario puede perfilar el programa, modificar algoritmos y transformar bucles Análisis Léxico Análisis Sintáctico Análisis Semántico Generación e código intermedio Optimización de código intermedio Generación de código objeto Código intermed10 El compilador puede mejorar los bucles, llamar a procedimientos, calcular direcciones Código objeto El compilador puede usar registros, seleccionar instrucciones o hacer transformaciones locales Estructura de un optimizador de Código intermedio 3 etapas Análisis de flujo de control Análisis de flujo de datos RI_IFS 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 o cambia mucho si el generador de códgo 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 Principales fuentes para la optimización Ejemplo void clasificación (int m, n) { int i, j; int v; if(n 1 ); do j j – while (a [j] > v i ) break; x- a [i]; a [i] a a [j] = x;} clasificación (m, j); clasificación (i + 1, n); } 85 t6 4 * x a [t6] t7 4″ it8 j t9 a [t8] a [t7] t9 t10 F 4 a [tlO] goto 32 i 82 83 B4B6 tll. m niti = it3 a [t2] if goto 32 = a [t4] if (t5 > v) goto 33 If (i > j) goto 36 = 4*jt5: [t12] t14 t15 F 4 a x Transformaciones que preservan la función Eliminación de subexpresiones comunes •-4*nt14. a [t13] a 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 31_1fS han cambiado desde el cálculo anterior 85 ix a [t6] ti t8 a [t8] a tlO 4 [t10] x goto 82 as t6 F 4 x a [t6] t8 4 t9 a [t8] a [t6] t9 a [t18] x goto 32 Javier Vélez Reyes jvelez@lsi. uned. s Propagación de copias La propagación de copias permite eliminar asignaciones redundantes almacenando el valor de una expresión en una anable de copia 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++; If (depura) then println (‘i = ‘, i); i 0; i+ depura true; i O; i++; If (depura) then println (‘i = i); 1++; println (‘i ‘, i), 406 S 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 ntrada al lazo t límite – 2 while (i j) goto 36 B4B6t11 [t12] t14 t15 F 4 x Optimización de bucles Reducción de intensidad -a [t13]a Cuando hay 2 0 más variables de inducción dentro de un bucle es posible suprimirlas todas menos una mediante un proceso de reducción de intensidad 85 t6 i x a [t6] ti a [t8] a t 10 4* ja [t 10] x goto ni tl a [t 1] – •=i+l t2 a [t2] if(t3 < v) goto 32 32 -1 t4 t4 - 4 t5 a [t41 if (t5 > v) goto B? If (i > j) goto 36 B3 [t12] t14 t15 x Blbliografía [AJO] AHO, SETHI, ULLMAN: Compiladores: Principios, técnicas y herramientas,: addison-Wesley Iberoamericana, 1990 [GARRIDO] SÜFS