Sei sulla pagina 1di 7

Ramirez Ochoa Edgar Rafael Tcnicas de Optimizacin de Cdigo

Grupo: 2891

Antes de empezar deberemos de definir los procesos que realizan los lenguajes de programacin en las etapas de compilacin y/o interpretacin de manera general para poder identificar en que momento se realiza la optimizacin de cdigo. Empezaremos por definir que el compilador es aquel traductor que tiene como entrada una sentencia en un lenguaje formal y como salida tiene un fichero ejecutable, realizando una traduccin de un cdigo de alto nivel a un cdigo mquina. Mediante las siguientes etapas: Anlisis Lxico: Consiste en la agrupacin de caracteres del texto fuente en grupos con entidad propia denominados tokens o signos lingsticos (identificadores, palabras reservadas, separadores etc...). Los tokens reconocidos son la entrada de la siguiente fase. Anlisis Sintctico: Se realiza el anlisis de la sintaxis de las sentencias compuestas tokens de acuerdo a la descripcin sintctica reflejada en la gramtica del lenguaje. Anlisis Semntico: Se analiza la semntica de las sentencias, realizando consultas en tablas auxiliarles denominadas tablas de smbolos. Generacin de Cdigo: En esta fase se genera el cdigo objeto para la mquina, aqu es donde se realiza efectivamente la traduccin. Optimizacin de Cdigo: Se realiza la optimizacin de tamao y/o velocidad al cdigo generado. Adems de estos procesos descritos que son realizados por un compilador, existen otras actividades que se realizan internamente como el Control de Tablas de Smbolos: Una tabla de smbolos es un estructura de datos interna al compilador que almacena informacin sobre los objetos que se van encontrando en el lenguaje fuente como variables, etiquetas, declaraciones de tipos etc.. Por lo que al conjunto de procedimientos para el manejo de esta tabla como introducir, consultar, modificar, borrar datos se le denomina Control de tabla se smbolos

Tratamiento de Errores: Conjunto de rutinas y actividades que tratan la identificacin de un error, su posible tratamiento o recuperacin y la emisin del mensaje correspondiente.

En cuanto a los intrpretes el funcionamiento es relativamente diferente ya que este se encarga de analizar y ejecutar simultneamente un programa escrito en un lenguaje fuente. Cualquier interprete tiene dos entradas, un programa P escrito en un lenguaje fuente LF y datos de entrada, que mediante un proceso de interpretacin van produciendo resultados.

La principal ventaja de los intrpretes sobre los compiladores es que permiten una fcil depuracin. Entre los Inconvenientes podemos citar, en primer lugar, la lentitud de ejecucin, ya que al ejecutar a la vez que se traduce no puede aplicarse un alto grado de optimizacin.

Los mdulos o etapas de un intrprete son: Traductor a Representacin Interna: Toma como entrada el cdigo del programa en lenguaje fuente, lo analiza y lo transforma a la representacin interna correspondiente a dicho programa. Representacin Interna: La representacin interna debe ser consistente con el programa original. Entre los tipos de representacin interna, los rboles sintcticos son los ms utilizados y, si las caractersticas del lenguaje lo permiten, pueden utilizarse estructuras de pila para una mayor eficiencia. Tabla de smbolos: Durante el proceso de traduccin, es conveniente ir creando una tabla con informacin relativa a los smbolos que aparecen. La informacin a almacenar en dicha tabla de smbolos depende de la complejidad del lenguaje fuente. Se pueden almacenar etiquetas para instrucciones de salto, informacin sobre identificadores (nombre, tipo, lnea en la que aparecen, etc.) o cualquier otro tipo de informacin que se necesite en la etapa de evaluacin.

Evaluador de Representacin Interna: A partir de la Representacin Interna anterior y de los datos de entrada, se llevan a cabo las acciones indicadas para obtener los resultados. Durante el proceso de evaluacin es necesario contemplar la aparicin de errores. Los compiladores, a diferencia de los intrpretes, transforman el programa a un programa equivalente en un cdigo objeto (fase de compilacin), y en un segundo paso generan los resultados a partir de los datos de entrada (fase de ejecucin).

Una vez conocidas las bases de los compiladores e intrpretes utilizados para la generacin de programas funcionales podremos explicar las diferentes tcnicas que se utilizan actualmente para la optimizacin del cdigo. Como ya se vio la fase de la optimizacin se realiza despus de la generacin del cdigo de todo programa o de un elemento ejecutable del programa por lo que necesariamente depende el contexto. El objetivo de la optimizacin del cdigo es el de mejorar la eficiencia en la ejecucin del cdigo segn los criterios de Tiempo de Ejecucin (temporal), Espacio de Memoria utilizado (espacial) mediante la revisin del cdigo generado en varios nivel de abstraccin aplicando transformaciones segn este nivel. Estas representaciones de cdigo intermedio se dan de ms a menos abstractas o rbol Sintctico (optimiza subexperesiones redundantes, elimina cdigo inalcanzable) o Tuplas o Cuadruplas(optimiza el uso de registros o de las variables temporales) o Ensamblador/ cdigo maquina (convertir saltos a saltos cortos, reordenar instrucciones de cdigo mquina, utilizar instrucciones ms especficas) o Utilizacin de estructuras ad hoc (grafos de flujo de ejecucin, grafos dirigidos acclicos)

Tipos de optimizacin

Por el momento de compilacin. Independiente de maquina o Transformaciones de cdigo intermedio (el compilador puede mejorar los bucles, llamar a procedimientos, calcular direcciones) Dependiente de maquina o Asignacin de Registros o Ordenacin/Seleccin de Instrucciones

rea del programa donde se aplica Local o o o o Reduccin de potencia Folding Propagacin de Constantes Reduccin de subexperesiones comunes

Las optimizaciones locales se realizan sobre el bloque bsico, siendo este un fragmento de cdigo que tiene una nica entrada y salida y cuyas instrucciones se ejecutan secuencialmente. -Ensamblamiento (Folding) En el Ensamblamiento se remplazan las expresiones por su resultado cuando se pueden evaluar en tiempo de compilacin siendo un resultado constante. -Propagacin de Constantes La propagacin de constantes asigna a una variable el valor de una constante hasta la siguiente asignacin, se considera a la variable equivalente a la constante. -Reduccin de Potencia Se busca sustituir operaciones costosas por otras ms simples (a=2*a ser sustituira por a= a+a) -Reduccin de subexperesiones comunes Las subexperesiones que aparecen ms de una vez se calculan una sola vez y se reutiliza el resultado.

Optimizacin dentro de bucles

La optimizacin de bucles es muy importante por las mejoras de tiempo de ejecucin que se obtienen. -Expansin de bucles (loop unrolling) Solo se realiza en los bucles cuyo nmero de interacciones se conoce en tiempo de ejecucin Se puede aplicar a los bucles for i=1 to 10 do for i=a to b do La expansin de un bucle puede ser muy costosa en espacio. Hay que poner un criterio heurstico para decidir si se aplica la expansin. Se puede aplicar una expansin parcial en la que sigue existiendo el bucle, pero cada iteracin del nuevo bucle corresponde a varias iteraciones del bucle original. No se puede aplicar a los bucles

-Reduccin de frecuencia (frequency reduction) La reduccin de frecuencia detecta las operaciones invariantes de bucle y las calcula una nica vez delante del bucle. for i=1 to n do c=i*sin(a); sin(a) es una operacin invariante del bucle que puede pasar de calcularse n veces a una con la siguiente transformacin tmp=sin(a); for i=1 to n do c=i*tmp; Esta transformacin no tiene en cuenta que el bucle igual no se ejecuta ninguna vez y esto supondra perder tiempo de ejecucin calculando la invariante de bucle innecesariamente. Adems el clculo de la invariante puede producir un error de ejecucin. (la divisin por cero). Variables Inductivas

Una variable V es inductiva cuando la nica forma en que se modifica su cdigo es V=V+K , donde K es una invariante de bucle.

Se considerar la necesidad de generar una variable inductiva temporal T a partir de encontrar expresiones de la forma V*C, donde C es una invariante de bucle. Se sustituir V*C por T Se inicializa T despus de la inicializacin de V como T=V*C (solo se ejecuta al entrar en el bucle) Al final de cada iteracin se aade T=T+C*K Global Grafo del flujo de ejecucin Antes de realizar una optimizacin global es necesario crear el grafo de flujo de ejecucin este grafo de ejecucin representa todos los caminos posibles de ejecucin del programa, por lo que es til tanto para el programador como el optimizador La optimizacin global a partir del anlisis del grafo del flujo de ejecucin permite Una propagacin de constantes fuera del bloque bsico. Eliminacin del cdigo no utilizado Una mejor asignacin de los registros.

Existen diferentes tipos de grafo Orientado a procedimiento/funcin Grafo de llamadas

Los pasos a realizar por el compilador cuando se analiza mediante un grafo Dividir el programa en bloques bsicos Se representa el programa en un cdigo intermedio donde queden explcitamente representados los saltos condicionales e incondicionales. Un bloque bsico ser cualquier trozo de cdigo que no contenga saltos ni etiquetas en su interior (es posible tener etiquetas al inicio del bloque y saltos al final). En el grafo, los vrtices representan los bloques bsicos y las aristas representan los saltos de un bloque bsico a otro

Anlisis del Grafo del Flujo de Ejecucin En el anlisis del grafo hay que considerar como la informacin sobre las variables y expresiones se propaga a travs del grafo. Esta informacin la representaremos en forma de conjuntos como los siguientes: expresiones disponibles Alcance de las definiciones variables vivas expresiones muy utilizadas