Tecnicas Refindas Optimizacion Codigo1

Embed Size (px)

Citation preview

  • Ramirez Ochoa Edgar Rafael Grupo: 2891 Tcnicas de Optimizacin de Cdigo

    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 Reduccin de potencia

    o Folding

    o Propagacin de Constantes

    o 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 No se puede aplicar a los bucles

    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.

    -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