Compilador Diseo - Generacin de Cdigo



Generacin de cdigo puede ser considerado como la fase final de la compilacin. Mediante la generacin de cdigo, proceso de optimizacin se puede aplicar en el cdigo, pero que puede ser visto como parte de generacin de cdigo propia fase. El cdigo generado por el compilador es un cdigo de objeto de algunos de menor nivel lenguaje de programacin, por ejemplo, lenguaje ensamblador. Hemos visto que el cdigo fuente escrito en un lenguaje de mayor nivel se transforma en un menor nivel de idioma que resulta en un menor nivel de cdigo objeto, que debe tener las siguientes propiedades mnimas:

  • Debe llevar el significado exacto del cdigo fuente.
  • Debe ser eficiente en trminos de uso de la CPU y la administracin de la memoria.

Ahora veremos cmo el cdigo intermedio se transforma en objetivo cdigo objeto (cdigo de ensamblado, en este caso).

Grfico dirigidos acclicos

Directed Acyclic Graph (DAG) es una herramienta que representa la estructura de bloques de base, ayuda a que el flujo de valores que fluye entre los bloques bsicos, optimizacin y ofrece tambin. DAG proporciona fcil transformacin en bloques bsicos. DAG se puede entender aqu:

  • Nodos Hoja representar identificadores, nombres o constantes.

  • Los nodos interiores representan los operadores.

  • Tambin los nodos interiores representan los resultados de las expresiones o los identificadores/nombre donde los valores se va a almacenar o asignado.

Ejemplo:

t0 = a + b
t1 = t0 + c
d = t0 + t1
Dirigido Acclicos Grfico

[t0 = a + b]

Dirigido acclicos Grfico

[t1 = t0 + c]

Dirigido acclicos Grfico

[d = t0 + t1]

Optimizacin Mirilla

Esta optimizacin tcnica funciona localmente en el cdigo fuente para transformarlo en un cdigo optimizado. A nivel local, es decir una pequea porcin del bloque de cdigo a mano. Estos mtodos se pueden aplicar en los cdigos intermedios, as como de los cdigos. Una serie de declaraciones se analiza y se verifica si las siguientes posibles para la optimizacin:

Eliminacin instrucciones redundantes

A nivel de cdigo fuente, el siguiente puede ser hecho por el usuario:

int add_ten(int x)
   {
   int y, z;
   y = 10;
   z = x + y;
   return z;
   }
int add_ten(int x)
   {
   int y;
   y = 10;
   y = x + y;
   return y;
   }
int add_ten(int x)
   {
   int y = 10;
   return x + y;
   }
int add_ten(int x)
   {
   return x + 10;
   }

En la compilacin, el compilador busca instrucciones redundantes en la naturaleza. Cargar y almacenar mltiples de instrucciones puede llevar el mismo significado aun cuando algunos de ellos se quitan. Por ejemplo:

  • MOV x, R0
  • MOV R0, R1

Podemos eliminar la primera instruccin y re-escribir la frase como:

MOV x, R1

Cdigo inalcanzable

Cdigo inalcanzable es una parte del cdigo del programa que nunca se accede por construcciones de programacin. Los programadores pueden tener escrito por accidente un trozo de cdigo que nunca puede ser alcanzado.

Ejemplo:

void add_ten(int x)
{
   return x + 10;
   printf(value of x is %d, x);
}

En este segmento de cdigo, la instruccin printf nunca se ejecutar el programa de control regresa antes de que pueda ejecutar, por lo tanto, printf puede ser eliminado.

Optimizacin de control de flujo

Hay casos en un cdigo en donde el control del programa salta hacia adelante y hacia atrs sin realizar ninguna tarea importante. Estos saltos se puede quitar. Considere el siguiente fragmento de cdigo:

...		
MOV R1, R2
GOTO L1
...
L1 :   GOTO L2
L2 :   INC R1

En el presente cdigo, etiqueta L1 se puede retirar en el momento que pasa el control a L2. Por lo tanto, en lugar de saltar a L1 y, a continuacin, en L2, el control puede llegar directamente L2, como se muestra a continuacin:

...		
MOV R1, R2
GOTO L2
...
L2 :   INC R1

Expresin algebraica simplificacin

Hay ocasiones en que las expresiones algebraicas se puede hacer simple. Por ejemplo, la expresin a = a + 0 puede ser sustituido por una misma y la expresin a = a + 1 simplemente debe sustituirse por el INC.

Reduccin Fuerza

Hay operaciones que consumen ms tiempo y espacio. Su "fuerza" puede reducirse mediante su sustitucin por otras operaciones que consumen menos tiempo y espacio, pero producen el mismo resultado.

Por ejemplo, x * 2 puede ser sustituido por x ,, en el que involucra slo un desplazamiento a la izquierda. Aunque la salida de un * a y a 2 es la misma, a2 es mucho ms eficaz para su aplicacin.

Acceso a las instrucciones de mquina

El equipo de destino puede implementar las instrucciones ms sofisticados, que pueden tener la capacidad de realizar operaciones especficas mucho ms eficiente. Si el cdigo de destino puede dar cabida a esas instrucciones directamente, que no slo va a mejorar la calidad del cdigo, sino que tambin produzcan resultados ms eficientes.

Generador de cdigo

Un generador de cdigo se espera que tenga una comprensin de la mquina de destino entorno de ejecucin y su conjunto de instrucciones. El generador de cdigo debe tomar las siguientes cosas en cuenta para generar el cdigo:

  • Idioma de destino: el generador de cdigo ha de ser consciente de la naturaleza del idioma de destino para que el cdigo se ha transformado. Que el lenguaje puede facilitar algunas de las instrucciones especficas para ayudar a el compilador genera el cdigo en una forma ms cmoda. El equipo de destino puede tener procesador RISC o CISC arquitectura.

  • Tipo de infrarrojos: representacin intermedia tiene diversas formas. Puede ser en Abstract Syntax Tree (AST) estructura, Notacin Polaca Inversa, o 3-cdigo de direccin.

  • Seleccin de la instruccin: el generador de cdigo tiene representacin intermedia como entrada y convierte (mapas) en la mquina de destino. Una representacin puede tener muchas formas (instrucciones) para convertir, por lo que se convierte en la responsabilidad del generador de cdigo para elegir sabiamente las instrucciones adecuadas.

  • Asignacin de registros: un programa tiene un nmero de valores que se mantiene durante la ejecucin. La arquitectura de la mquina de destino no puede permitir que todos los valores que se guardan en la memoria de la CPU o de los registros. Generador de cdigo decide qu valores para mantener en los registros. Asimismo, se decide los registros con el fin de ser utilizado para mantener estos valores.

  • Orden de las instrucciones: Por ltimo, el generador de cdigo determina el orden en que las instrucciones se ejecutan. Crea listas de instrucciones que se van a ejecutar.

Descriptores

El generador de cdigo de seguimiento tanto de las registra (por disponibilidad) y direcciones (ubicacin de valores) al mismo tiempo que genera el cdigo. En ambos casos, los dos siguientes se utilizan descriptores:

  • Registro: registro descriptor descriptor se utiliza para informar al generador de cdigo sobre la disponibilidad de registros. Descriptor Registro realiza un seguimiento de los valores almacenados en cada registro. Cada vez que un nuevo registro es necesario durante la generacin de cdigo, este descriptor es consultado para registrar disponibilidad.

  • Descriptor de las direcciones: Los valores de los nombres (identificadores) utilizados en el programa pueden estar almacenados en distintos lugares al mismo tiempo que en su ejecucin. Descriptores Direccin se utilizan para mantener un registro de ubicaciones de memoria donde los valores de los identificadores se almacenan. Estas ubicaciones pueden incluir registros de la CPU, montones, pilas, memoria, o una combinacin de los lugares antes mencionados.

Generador de cdigo mantiene tanto el descriptor actualizado en tiempo real. Para una declaracin de carga, LD R1, x, el generador de cdigo:

  • updates the Register Descriptor R1 that has value of x and
  • updates the Address Descriptor (x) to show that one instance of x is in R1.

Generacin de cdigo

Bloques Bsicos forman parte de una secuencia de tres direcciones de instrucciones. Generador de cdigo tiene esta secuencia de instrucciones como entrada.

Nota: Si el valor de un nombre se encuentra en ms de un lugar (registro, memoria cach, o la memoria), el valor del registro ser preferible a la cach y la memoria principal. Del mismo modo la memoria cach se prefiere en lugar de la memoria principal. Memoria principal es apenas ninguna preferencia.

getreg: generador de cdigo utiliza getreg funcin para determinar el estado de registros disponibles y la ubicacin de nombre valores. getreg funciona de la siguiente manera:

  • Si la variable Y ya est en el registro R, se utiliza el registro.

  • Si algn registro R est disponible, se utiliza el registro.

  • Si tanto las opciones anteriores no son posibles, elige un registro que requiere un mnimo nmero de cargar y almacenar instrucciones.

Para una instruccin x = y OP z, el generador de cdigo puede realizar las siguientes acciones. Supongamos que L es el lugar (preferiblemente registro) donde la produccin de y OP z va a ser guardado:

  • Llamar a la funcin getreg, a decidir la ubicacin de L.

  • Determinar la ubicacin actual (registro o memoria) de y mediante la consulta de los Descriptor de Direcciones de y. SiY no est actualmente en registro L y, a continuacin, generar las siguientes instrucciones para copiar el valor de y a L:

    MOV y, L

    Donde y representa la copia valor de y.

  • Determinar la ubicacin actual de z con el mismo mtodo utilizado en el paso 2 para el ao y generar la siguiente instruccin:

    OP z, L

    Donde z' representa la copia valor de z.

  • Ahora L contiene el valor de y OP z, que se destina a ser asignado a x. Por lo tanto, si L es un registro, actualizar su descriptor para indicar que contiene el valor de x. Actualizar el descriptor de x para indicar que es almacenado en la localidad L.

  • Si y y z no tiene ms uso, que puede ser dada al sistema.

Otras construcciones de cdigo como bucles y condicionales se transforman en lenguaje ensamblador en asamblea general.

Advertisements