Upload
eddie1792
View
5
Download
0
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