Sei sulla pagina 1di 8

Introduccin a la Teora de Compiladores

Lenguajes
Toda comunicacin involucra la utilizacin de un lenguaje. Las personas utilizan diferentes idiomas ( lenguajes naturales ).

Mag. Hilmar Hinojosa Lazo

Nos comunicamos con las mquinas ( lenguajes artificiales ).

Mag. Hilmar Hinojosa Lazo

Lenguajes artificiales
Uno de los principales mecanismos de comunicacin entre un ordenador y una persona viene dado por el envo y recepcin de mensajes de tipo textual. El usuario escribe una orden mediante el teclado, y el ordenador la ejecuta devolviendo como resultado un mensaje informativo sobre las acciones llevadas a cabo.

Concepto de traductor
Un traductor se define como un programa que traduce o convierte desde un texto o programa escrito en un lenguaje fuente hasta un texto o programa equivalente escrito en un lenguaje destino produciendo opcionalmente mensajes de error.

Mag. Hilmar Hinojosa Lazo

Mag. Hilmar Hinojosa Lazo

Tipos de traductores
Traductores del idioma Compiladores Intrpretes Preprocesadores Intrpretes de comandos Ensambladores Conversores fuente-fuente Compilador cruzado

Traductores del idioma


Traducen de un idioma dado a otro. Presentan algunos problemas: Necesidad de inteligencia artificial y problema de las frases hechas. Difcil formalizacin en la especificacin del significado de las palabras. Cambio del sentido de las palabras segn el contexto. Los resultados ms satisfactorios en la traduccin del lenguaje natural se han producido sobre subconjuntos restringidos del lenguaje en los que hay muy poco margen de ambigedad en la interpretacin de los textos.

Mag. Hilmar Hinojosa Lazo

Mag. Hilmar Hinojosa Lazo

Compiladores
Un compilador es un traductor que tiene como entrada un archivo en lenguaje formal y como salida tiene un archivo ejecutable. Realiza una traduccin de un cdigo de alto nivel a cdigo mquina. Tambin se entiende por compilador aquel programa que proporciona un archivo objeto en lugar del ejecutable final.
Mag. Hilmar Hinojosa Lazo

Intrpretes
El programa de entrada se reconoce y ejecuta a la vez. No se produce un resultado fsico (cdigo mquina) sino lgico (una ejecucin). Permiten una fcil depuracin. Su ejecucin es lenta. Durante la ejecucin, el intrprete debe residir en memoria, por lo que consume ms recursos.
Mag. Hilmar Hinojosa Lazo

Preprocesadores
Permiten modificar el programa fuente antes de la verdadera compilacin. Hacen uso de macroinstrucciones y directivas de compilacin. Los preprocesadores suelen actuar de manera transparente para el programador, pudiendo incluso considerarse que son una fase preliminar del compilador.
Mag. Hilmar Hinojosa Lazo

Preprocesadores

Mag. Hilmar Hinojosa Lazo

Intrpretes de comandos
Un intrprete de comandos traduce sentencias simples a invocaciones a programas de una biblioteca. Se utilizan operativos. especialmente en los sistemas

Ensambladores
Son los pioneros de los compiladores, ya que en los albores de la informtica, los programas se escriban directamente en cdigo mquina. En lenguaje ensamblador se establece una relacin biunvoca entre cada instruccin y una palabra mnemotcnica, de manera que el usuario escribe los programas haciendo uso de los mnemotcnicos, y el ensamblador se encarga de traducirlo a cdigo mquina puro. Ejemplo:

Los programas invocados pueden residir en el kernel (ncleo) del sistema o estar almacenados en algn dispositivo externo como rutinas ejecutables que se traen a memoria bajo demanda.
Mag. Hilmar Hinojosa Lazo

Instruccin ensamblador: LD HL, #0100 Cdigo mquina generado: 65h.00h.01h


Mag. Hilmar Hinojosa Lazo

Conversores fuente-fuente
Permiten traducir desde un lenguaje de alto nivel a otro lenguaje de alto nivel. El programa fuente resultado puede requerir retoques manuales debido a diversos motivos: En situaciones en que el lenguaje destino carece de importantes caractersticas que el lenguaje origen s tiene. En situaciones en que la traduccin no es inteligente y los programas destino son altamente ineficientes.

Compilador cruzado
Es un compilador que genera cdigo para ser ejecutado en otra mquina. Se utilizan en la fase de desarrollo de nuevos computadores. Ejemplo: Para construir el sistema operativo de un nuevo computador se usa un lenguaje de alto nivel, incluso antes de que dicho nuevo ordenador disponga de un compilador.
Mag. Hilmar Hinojosa Lazo

Mag. Hilmar Hinojosa Lazo

Obtencin de un programa ejecutable


Para que un programa escrito por el programador pueda ser ejecutado por el computador debe pasar por las siguientes etapas: Compilacin Enlace Carga

Proceso de compilacin
El compilador no produce directamente un archivo ejecutable, sino que el cdigo generado se estructura en mdulos que se almacenan en un archivo objeto.

Mag. Hilmar Hinojosa Lazo

Mag. Hilmar Hinojosa Lazo

Proceso de enlace
El enlazador o linker resuelve las referencias cruzadas, es decir la utilizacin de objetos externos, que pueden estar declarados en otros archivos objeto o en libreras. Engloba en un nico bloque los distintos registros que almacenan cdigo mquina y genera el ejecutable final incorporando algunas rutinas adicionales procedentes de libreras.

Proceso de enlace

Mag. Hilmar Hinojosa Lazo

Mag. Hilmar Hinojosa Lazo

Proceso de carga
El cargador instala el archivo .exe en memoria, es decir que coloca sus diferentes segmentos en memoria (donde el sistema operativo le diga que hay memoria libre para ello) y asigna los registros base a sus posiciones correctas, de manera que las direcciones relativas funcionen correctamente.

Proceso de carga

Mag. Hilmar Hinojosa Lazo

Mag. Hilmar Hinojosa Lazo

Compilacin incremental
Cuando se desarrolla un programa fuente, ste se recompila varias veces hasta obtener una versin definitiva libre de errores. En una compilacin incremental slo se recompilan las modificaciones realizadas desde la ltima compilacin. Un compilador incremental puede funcionar a varios niveles: A nivel de carcter A nivel de sentencia A nivel de bloque A nivel de archivo fuente
Mag. Hilmar Hinojosa Lazo

Autocompilador
Es un compilador escrito en el mismo lenguaje que compila (o parecido). Cuando se desea mejorar un compilador, el nuevo compilador se escribe utilizando el lenguaje del antiguo, dando como resultado un compilador ms potente de ese mismo lenguaje.

Mag. Hilmar Hinojosa Lazo

Metacompilador
Un metacompilador es un compilador de compiladores. Se trata de un programa que acepta como entrada la descripcin de un lenguaje y produce el compilador de dicho lenguaje. No existen metacompiladores completos, pero s parciales que permiten aadir cdigo para completar el resto del compilador. Ejemplos de metacompiladores son: Lex, YACC, FLex, Bison, JavaCC, JLex, Cup, etc.

Descompilador
Un descompilador realiza una labor de traduccin inversa, esto es, pasa de un cdigo mquina al equivalente escrito en el lenguaje que lo gener (programa fuente). La descompilacin es una labor casi imposible, porque al cdigo mquina generado casi siempre se le aplica una optimizacin en una fase posterior, de manera que un mismo cdigo mquina ha podido ser generado a partir de varios cdigos fuente. Slo existen descompiladores de aquellos lenguajes en los que existe una relacin biyectiva entre el cdigo destino y el cdigo fuente, como sucede con los desensambladores, en los que a cada instruccin mquina le corresponde una y slo una instruccin ensamblador.
Mag. Hilmar Hinojosa Lazo

Mag. Hilmar Hinojosa Lazo

Estructura de un traductor
Un traductor divide su labor en dos etapas: una que anlisis y otra de sntesis.

Anlisis
Anlisis lexicogrfico: Divide el programa fuente en los componentes bsicos del lenguaje a compilar. Cada componente bsico es una secuencia de caracteres del programa fuente, y pertenece a una categora gramatical: nmeros, identificadores de usuario (variables, constantes, tipos, nombres de procedimientos, ...), palabras reservadas, signos de puntuacin, etc. Anlisis sintctico: Comprueba que la estructura de los componentes bsicos sea correcta segn las reglas gramaticales del lenguaje que se compila.

Mag. Hilmar Hinojosa Lazo

Mag. Hilmar Hinojosa Lazo

Anlisis
Anlisis semntico: Comprueba que el programa fuente respete las directrices del lenguaje que se compila (todo lo relacionado con el significado): chequeo de tipos, rangos de valores, existencia de variables, etc. Cualquiera de estas tres fases puede emitir mensajes de error derivados de fallas cometidas por el programador en la redaccin de los textos fuente.
Mag. Hilmar Hinojosa Lazo

Sntesis
Generacin de cdigo intermedio: Genera un cdigo independiente de la mquina muy parecido al ensamblador. Generacin de cdigo mquina: Crea un bloque de cdigo mquina ejecutable, as como los bloques necesarios destinados a contener los datos. Fase de optimizacin. La optimizacin puede realizarse sobre el cdigo intermedio (de forma independiente de las caractersticas concretas del microprocesador), sobre el cdigo mquina, o sobre ambos.
Mag. Hilmar Hinojosa Lazo

Tabla de smbolos
Una funcin esencial de un compilador es registrar los identificadores de usuario y sus atributos. Estos atributos pueden proporcionar informacin sobre la memoria asignada a un identificador, la direccin de memoria en que se almacenar en tiempo de ejecucin, su tipo, su mbito, etc. Toda est informacin se guarda en la tabla de smbolos. Su estructura puede ser una tabla hash, un rbol binario de bsqueda, etc.
Mag. Hilmar Hinojosa Lazo

Tabla de smbolos
Tanto la etapa de anlisis como la de sntesis accede a esta estructura.

Mag. Hilmar Hinojosa Lazo

Ejemplo del proceso de compilacin


La sentencia con la que se va a ilustrar el proceso es la siguiente: #define PORCENTAJE 8 comision = fijo + valor * PORCENTAJE; Se asume que las variables referenciadas han sido previamente declaradas de tipo int, e inicializadas a los valores deseados.

Mag. Hilmar Hinojosa Lazo

Mag. Hilmar Hinojosa Lazo

Preprocesamiento
El cdigo fuente de una aplicacin se puede dividir en mdulos almacenados en archivos distintos. La tarea de reunir el programa fuente se confa a un programa distinto, llamado preprocesador. El preprocesador tambin puede expandir macros. En nuestro ejemplo, la constante PORCENTAJE se sustituye por su valor, dando lugar al texto: comision = fijo + valor * 8; Este pasa a ser la fuente que entrar al compilador.
Mag. Hilmar Hinojosa Lazo

Etapa de anlisis: Anlisis lexicogrfico


En esta fase, la cadena de caracteres que constituye el programa fuente se lee de izquierda a derecha y se agrupa en componentes lxicos, que son secuencias de caracteres que tienen un significado atmico. Adems el analizador lxico trabaja con la tabla de smbolos introduciendo en sta los nombres de las variables.

Mag. Hilmar Hinojosa Lazo

Etapa de anlisis: Anlisis lexicogrfico


Los caracteres de la proposicin de asignacin: comision= fijo + valor * 8 ; se agruparan en los componentes lxicos siguientes: El identificador comision. El smbolo de asignacin =. El identificador fijo. El signo de suma +. El identificador valor. El signo de multiplicacin *. El nmero 8. El smbolo de fin de sentencia ;.
Mag. Hilmar Hinojosa Lazo

Etapa de anlisis: Anlisis lexicogrfico


Cada componente lxico se traduce a su categora gramatical, y se le asocia alguna informacin que se guarda en la tabla de smbolos.

Mag. Hilmar Hinojosa Lazo

Etapa de anlisis: Anlisis sintctico


Trabaja con una gramtica de contexto libre y genera el rbol sintctico que reconoce su sentencia de entrada. En nuestro caso las categoras gramaticales del anlisis lxico son los terminales de la gramtica. Para el ejemplo que nos ocupa podemos partir de la gramtica: S -> <ID> <ASIG> expr <TERM> expr -> <ID> | <ID> <+> expr | <ID> <*> expr | <NUM>
Mag. Hilmar Hinojosa Lazo

Etapa de anlisis: Anlisis sintctico


El anlisis sintctico intenta generar un rbol sintctico que encaje con la sentencia de entrada.

Mag. Hilmar Hinojosa Lazo

Etapa de anlisis: Anlisis semntico


Esta fase revisa el rbol sintctico junto con los atributos y la tabla de smbolos para tratar de encontrar errores semnticos. En esta etapa lo ms importante es la verificacin de tipos. Aqu, el compilador verifica si los operandos de cada operador son compatibles segn la especificacin del lenguaje fuente. Adems se ha debido controlar que las variables implicadas en la sentencia: comision, fijo y valor son compatibles con el tipo numrico de la constante 8,0.
Mag. Hilmar Hinojosa Lazo

Etapa de sntesis
En la etapa anterior se ha controlado que el programa de entrada es correcto. Por tanto, el compilador ya se encuentra en disposicin de generar el cdigo mquina equivalente semnticamente al programa fuente. Para ello se parte de las estructuras generadas en dicha etapa anterior: rbol sintctico y tabla de smbolos.
Mag. Hilmar Hinojosa Lazo

Etapa de sntesis: Generacin de cdigo intermedio


Despus de la etapa de anlisis, se suele generar una representacin intermedia explcita del programa fuente. Dicha representacin intermedia se puede considerar como un programa para una mquina abstracta. Cualquier representacin intermedia debe tener dos propiedades importantes: debe ser fcil de generar y fcil de traducir al cdigo mquina destino.

Etapa de sntesis: Generacin de cdigo intermedio


t1 = 8.0 t2 = valor * t1 t3 = fijo + t2 comision = t3 Cada instruccin tiene a lo sumo un operador, adems de la asignacin. El compilador debe generar un nombre temporal para guardar los valores intermedios calculados por cada instruccin: t1, t2 y t3. Algunas instrucciones tienen menos de tres operandos.
Mag. Hilmar Hinojosa Lazo

Mag. Hilmar Hinojosa Lazo

Etapa de sntesis: Optimizacin de cdigo


Esta fase trata de mejorar el cdigo intermedio. En nuestro ejemplo hay una forma mejor de realizar el clculo de la comisin, y pasa por realizar sustituciones triviales en la segunda y cuarta instrucciones, obtenindose: t2 = valor * 8.0 comision= fijo + t2

Etapa de sntesis: Generacin de cdigo mquina


La fase final de un compilador es la generacin de cdigo objeto, que por lo general consiste en cdigo mquina reubicable o cdigo ensamblador. Cada una de las variables usadas por el programa se traduce a una direccin de memoria. Despus, cada una de las instrucciones intermedias se traduce a una secuencia de instrucciones de mquina que ejecuta la misma tarea.

Mag. Hilmar Hinojosa Lazo

Mag. Hilmar Hinojosa Lazo

Etapa de sntesis: Generacin de cdigo mquina


Utilizando los registros R1 y R2 de un microprocesador hipottico, la traduccin del cdigo optimizado podra ser: MOVE [1Ah], R1 MULT #8.0, R1 MOVE [15h], R2 ADD R1, R2 MOVE R2, [10h] Se asume que la variable comision se almacena en la direccin [10h], fijo en [15h] y valor en [1Ah].
Mag. Hilmar Hinojosa Lazo

Potrebbero piacerti anche