You are on page 1of 11

FACULTAD DE LAS CIENCIAS DE LA COMPUTACIN Y ELECTRNICA

INTRPRETES Y COMPILADORES GENERACIN DE CDIGO


INTEGRANTES
CHRISTIAN CSPEDES DCIMO INFORMTICA SECCIN DIURNA 23 DE AGOSTO DEL 2007

TEMA: GENERACIN Y OPTIMIZACIN DE CDIGOS OBJETIVO GENERAL: FUNDAMENTACIN TERICA

ESTRUCTURA DE UN COMPILADOR

PROCESO DE COMPILACIN

GENERACIN DE CDIGO
Es la parte del traductor que genera el programa objeto equivalente al fuente. Puede acceder a la tabla de smbolos si es necesario

Esta constituye la fase final de un compilador. En ella se genera el cdigo objeto que por lo general consiste en cdigo en lenguaje mquina (cdigo relocalizable) o cdigo en lenguaje ensamblador. Una vez que se ha obtenido el cdigo intermedio se pasar a ensamblador o a cdigo mquina de una mquina real en el caso de un compilador o a otro lenguaje en el caso de un traductor.

El cdigo generado por un compilador puede ser de uno de los tipos siguientes: Compilador fuente a fuente (source to source) Traduce de un lenguaje de alto nivel a otro lenguaje de alto nivel. Compilador que genera cdigo simblico Genera un cdigo intermedio que despus deber ser procesado por un ensamblador. Compilador que genera lenguaje mquina genera directamente programas ejecutables (*.EXE) o en un formato especial de cdigo mquina (*.OBJ) que contiene informacin adicional los *.OBJ son procesados por un programa enlazador (linker), que generar el programa ejecutable pueden enlazarse tambin bibliotecas que contienen funciones y subrutinas prefabricadas de uso general. Existen dos formas de realizar la generacin de cdigo: En un solo paso: integrada con el anlisis semntico. En dos o ms pasos: el analizador semntico genera un cdigo intermedio (cudruplas, notacin sufija), a partir del cul se realiza la generacin del cdigo definitivo como un paso independiente. A.Semntico G.Cdigo Fuente -----------> Cudruplas --------> Objeto |----------------------------------------| A. Semntico La primera posibilidad es ms rpida, pero ms compleja Sintaxis de una instruccin del ensamblador genrico para 80x86 Etiqueta: cdigo_instruccin operandos Los operandos de las instrucciones pueden ser registros, direcciones, constantes o expresiones. REGISTROS

32 bits EAX (acumulador), EBX, ECX, EDX, ESP (puntero a la pila), EBP, ESI y EDI. 16 bits AX (acumulador), BX, CX, DX, SP (puntero a la pila), BP, SI y DI. Pila de registros de punto flotante ST0, ST1, ...., ST7 Nombres adicionales AH y AL (bytes superior e inferior de AX), BH y BL, CH y CL, DH y DL La direccin donde se almacena el valor de una variable se representar anteponiendo el smbolo de subrayado (_) al nombre de la variable. Para referirse al contenido de una posicin de memoria, es necesario encerrar su direccin entre corchetes. Ejemplo: la instruccin mov eax, [_x] carga el contenido de la variable x (de direccin _x) en el registro EAX. Cuando una instruccin, por ejemplo mov , hace referencia a una posicin de memoria y a un registro, el tamao de la posicin de memoria se adapta por omisin al tamao del registro. En cambio, si hace referencia a dos posiciones de memoria, es preciso especificar el tamao de la zona de memoria afectada por la instruccin. Por ejemplo: si se trata de una doble palabra, se usar el indicador dword.

mov dword [_num], [_x]


MOVIMIENTOS La instruccin mov op1, op2 copia el contenido del segundo operando en el primero. Ejemplo: la instruccin mov eax, ebx copia el contenido del registro EBX en el registro EAX. La instruccin fld operando , donde el operando es una variable en punto flotante

Introduce el contenido del operando en la primera posicin de la pila de registros en punto flotante y empuja hacia abajo los contenidos anteriores de dicha pila. La instruccin fstp operando, donde el operando es una variable en punto flotante Extrae de la pila de registros en punto flotante el contenido de la primera posicin de la pila (y lo elimina de ella) y Lo almacena en el operando. La instruccin fild operando, donde el operando es una variable entera, Convierte el valor del operando a punto flotante, Introduce el resultado en la primera posicin de la pila de registros en punto flotante y Empuja hacia abajo los contenidos anteriores de dicha pila.

La instruccin fistp operando , donde el operando es una variable entera, Extrae de la pila de registros en punto flotante el contenido de la primera Posicin de la pila (y lo elimina de ella), Convierte dicho valor al tipo entero y Lo almacena en el operando. INSTRUCCIONES DE MOVIMIENTO DE PILA La pila de una aplicacin de 32 bits gestiona datos con tamao de dobles palabras. Al introducir datos nuevos, la pila se extiende hacia posiciones de memoria con direcciones ms pequeas, por lo que El valor del puntero a la pila (el registro ESP) disminuye en cuatro unidades cuando se introduce un dato en la pila y Aumenta en cuatro unidades cuando se extrae un dato de la pila.

La instruccin push operando Resta 4 al contenido del registro ESP (puntero de la pila) y Inserta el operando en la pila.

La instruccin pop operando Copia el contenido que est situado en la cima de la pila (es decir, en la direccin ms baja) sobre el operando, y Suma 4 al contenido del registro ESP .

Ejemplo: la instruccin pop eax almacena el contenido de la cima de la pila en el registro EAX .

INSTRUCCIONES ARITMTICAS La instruccin add op1, op2 Suma los dos operandos enteros y Almacena el resultado en el primero. La instruccin sub op1, op2 Resta el segundo operando entero del primero y Almacena en el resultado en el primero. La instruccin mul operando , donde el operando es un entero con un tamao de 32 bits, Lo multiplica por el contenido de EAX . El resultado se almacena en la concatenacin de los registros EDX y EAX .

INSTRUCCIONES LGICAS La instruccin and op1, op2 Lleva a cabo la operacin lgica AND, bit a bit, entre los dos operandos, y Almacena el resultado en el primero.

La instruccin or op1, op2 Lleva a cabo la operacin lgica OR ,bit a bit, entre los dos operandos, y Almacena el resultado en el primero.

La instruccin xor op1, op2 Lleva a cabo la operacin lgica XOR, bit a bit, entre los dos operandos, y Almacena el resultado en el primero.

INSTRUCCIONES DE SALTO La instruccin jmp etiqueta (salto incondicional) salta a la direccin especificada por la etiqueta. La instruccin jz etiqueta salta a la direccin especificada por la et iquetasi el indicador de resultado cero est encendido, es decir, si el resultado de la ltima operacin realizada fue cero. La instruccin jnz etiquetasalta a la direccin especificada por la et iqueta si el indicador de resultado cero est apagado, es decir, si el resultado de la ltima operacin realizada fue distinto de cero.

Despus de una instruccin de comparacin cmp op1, aparecer las siguientes instrucciones de salto condicional:

op2 pueden

je etiqueta salta a etiqueta si op1 es igual a op2. jne etiqueta salta a etiqueta si op1 es distinto de op2. jl etiqueta salta a etiqueta si op1 es menor que op2. jle etiqueta salta a etiqueta si op1 es menor o igual que op2. jg etiqueta salta a etiqueta si op1 es mayor que op2. jge etiqueta salta a etiqueta si op1 es mayor o igual que op2.

INSTRUCCIONES DE LLAMADA Y RETORNO DE UNA SUBRUTINA La instruccin call et iqueta invoca a la subrutina de nombre et iqueta Almacena en la pila la direccin de la siguiente instruccin a ejecutar (la direccin de retorno) y Salta a la direccin de memoria correspondiente a et iqueta .

La instruccin inversa a la anterior (ret) Extrae de la pila el valor de la siguiente instruccin que se va a ejecutar y Transfiere el control a dicha instruccin.

GENERACIN DE CDIGO INTERMEDIO La tarea de sntesis suele comenzar generando un cdigo intermedio. El cdigo intermedio no es el lenguaje de programacin de ninguna mquina real, sino que corresponde a una mquina abstracta, que se debe de definir lo ms general posible, de forma que sea posible traducir este cdigo intermedio a cualquier mquina real. El objetivo del cdigo intermedio es reducir el nmero de programas necesarios para construir traductores, y permitir ms fcilmente la transportabilidad de unas mquinas a otras. Las mquinas abstractas deben definirse completamente: por una parte se definir su arquitectura y por otra su repertorio de instrucciones. La arquitectura de la mquina abstracta se elegir de forma que contribuya a facilitar la portabilidad dentro del grupo de arquitecturas hacia las que previsiblemente se dirigir el cdigo objeto. Habitualmente las arquitecturas tpicas de mquinas abstractas son: mquinas basadas en pila, basadas en registros, combinacin de pilas y registros, orientadas a objetos. Tambin se pueden clasificar desde el punto de vista de la cantidad y complejidad de sus instrucciones en mquinas CISC (Complex Instruction Set Computer) y RISC (Reduced Instruction Set Computer).

COMPILADORES DE DISTINTOS LENGUAJES PARA DISTINTAS MQUINAS

El cdigo intermedio no es un lenguaje de programacin de ninguna mquina real, sino que corresponde a una mquina abstracta, que se debe definir lo ms general posible, de manera que sea posible traducir este cdigo intermedio a cualquier mquina real. El objetivo del cdigo intermedio es reducir el nmero de programas necesarios para construir traductores y permitir ms fcilmente la transportabilidad de los traductores desde unas mquinas a otras. Optimizacin de cdigo intermedio: Es independiente de la mquina. Algunas optimizaciones pueden consistir en evaluacin de expresiones constantes, el uso de las propiedades asociativa, conmutativa de algunos operadores, reduccin de expresiones comunes, etc.

OPTIMIZACIN DE CDIGO Se trata en esta fase de mejorar el cdigo, en el sentido de reducir la cantidad de recursos (tiempo y memoria) necesarios. Algunas optimaciones son triviales, como por ejemplo hacer algunas transformaciones directamente en la compilacin, en lugar de dejarlo para la ejecucin Otras pueden requerir un trabajo mucho mayor, pero mejorar significativamente la eficiencia, normalmente a costa de alejarse bastante del cdigo original, como eliminar cdigo inactivo (inaccesible), eliminar variables intermedias o redituar sentencias independientes de un bucle fuera de ste. Muchos compiladores permiten elegir la cantidad de optimacin a realizar o no hacerla. Para el ejemplo, una mejora sencilla lo convertira en: temp1:= id26 * 60.0 id25:= id24 + temp2

You might also like