Sie sind auf Seite 1von 20

Ana M Corrales Barrios Jess Prez Garca Curso: 1A I.T.I.G.

DNI: 74894886 D DNI: 74945244 C

NDICE 1. Qu es un traductor? 2. Tipos de traductores.


2.1. TRADUCTORES DEL IDIOMA 2.2. COMPILADORES 2.3. INTRPRETES 2.4. PREPROCESADORES 2.5. INTRPRETES DE COMANDOS 2.6. ENSAMBLADORES Y MACROENSAMBLADORES 2.7. CONVERSORES FUENTE - FUENTE 2.8. COMPILADOR CRUZADO

3. Conceptos bsicos relacionados con la traduccin.


3.1. COMPILAR-LINKAR-EJECUTAR 3.2. PASADAS DE COMPILACIN 3.3. COMPILACIN INCREMENTAL 3.4. AUTOCOMPILADOR 3.5. METACOMPILADOR 3.6. DESCOMPILADOR

4. Estructura de un compilador. Fases.


4.1. ANLISIS LEXICOGRFICO 4.2. ANLISIS SINTCTICO 4.3 ANLISIS SEMNTICO 4.4. GENERACIN DE CDIGO INTERMEDIO 4.5. GENERACIN DEL CDIGO MQUINA 4.6. FASE DE OPTIMIZACIN 4.7. TABLA DE SMBOLOS

5. Ejemplo de compilacin.

INTRODUCCIN

Desde el punto de vista de un informtico, prcticamente todas las acciones que se va a ver obligado a desarrollar en el transcurso de su carrera profesional, tendr que ver con traductores: la programacin, la creacin de ficheros batch, la utilizacin de un intrprete de comando, etc. Qu ocurre si nos dan un documento de Word que procede de una fusin Por ejemplo con una base de datos y se quiere, a partir de l, obtener la B.D. original? Podramos procesarla con un traductor para quitar el texto superfluo y dar como resultado un texto en el que cada campo est entre comillas. Otros ejemplos para los que necesitaremos utilizar traductores son: * Conversin del carcter 10 ASCII (LF) en <br> de HTML para pasar texto a la web. * Creacin de preprocesadores para lenguajes que no lo tienen . Por ejemplo para trabajar fcilmente con SQL en C, se puede hacer un preprocesador para meter SQL inmerso. En este trabajo, se introduce el tema de la compilacin escribiendo los componentes de un compilador, el entorno en el que trabajan los compiladores y algunas herramientas de software que facilitan la construccin de compiladores.

1. QU ES UN TRADUCTOR?
Un traductor es un programa que traduce o convierte desde un texto o programa escrito en un lenguaje fuente hasta un texto o programa escrito en un lenguaje destino produciendo, si cabe, mensajes de error. Los traductores engloban tanto al compilador como al intrprete. Esquema inicial para un traductor:

Es importante destacar la velocidad en la que hoy en da se hacen. En la dcada de 1950, se consider a los traductores como programas notablemente difciles de escribir. El primer compilador de FORTRAN, por ejemplo, necesit para su implementacin 18 aos de trabajo en grupo. Hasta que apareci la teora de autmatas no se pudo acelerar ni formalizar la creacin de traductores.

2. TIPOS DE TRADUCTORES
Desde sus orgenes, ha existido un hueco entre la forma de expresarse de las personas y la de las mquinas. Los traductores han intentado acortar este hueco para facilitar las cosas a las personas, lo que ha llevado a aplicar la teora de autmatas a diferentes campos y reas concretas de la informtica:

2.1. TRADUCTORES DEL IDIOMA

Traducen de un idioma dado a otro, por ejemplo, un traductor de Ingls a Espaol. Este tipo de traductores producen una serie de problemas: Inteligencia Artificial y problemas de las frases hechas: El problema de la inteligencia artificial es que tiene mucho de artificial y poco de inteligencia. Por ejemplo una vez se tradujo del Ingles al Ruso (por lo de la guerra fra El espritu es fuerte pero la carne es dbil que, de nuevo, se pas al Ingls, y dio: El vino est bueno pero la carne est podrida (En ingls spirit significa tanto espritu como alcohol). Otros ejemplos de frases hechas son Piel de pollo, Piel de gallina. Falta de formalizacin en la especificacin del significado de las palabras. Cambio del sentido de las palabras segn el contexto. Ejemplo: Por decir aquello, se llev una galleta.

2.2. COMPILADORES

Es aquel traductor que tiene como entrada una sentencia en lenguaje formal y como salida tiene un fichero ejecutable, es decir, hace una traduccin de alto nivel a cdigo mquina. Para cada lenguaje de programacin se requiere un compilador separado. El compilador traduce todo el programa antes de ejecutarlo. Los compiladores son, pues, programas de traduccin insertados en la memoria por el sistema operativo para convertir programas de cmputo en pulsaciones electrnicas ejecutables (lenguaje de mquina).

Es como un compilador, solo que la salida es una ejecucin. El programa entrada se interpreta y ejecuta a la vez. Hay lenguajes que solo pueden ser interpretados, como por ejemplo: SNOBOL (StriNg Oriented SimBOlyc Language), LISP (LISt Processing), BASIC, etc. La principal ventaja es que permiten una fcil depuracin. Los inconvenientes son, en primer lugar la lentitud de ejecucin, ya que si uno ejecuta a la vez que traduce no puede aplicarse mucha optimizacin, adems si el programa entra en un bucle

2.3. INTRPRETES

tiene que interpretar y ejecutar todas las veces que se realice el bucle. Otro inconveniente es que durante la ejecucin, es necesario el intrprete en memoria por lo que consumen ms recursos. Hay lenguajes que son pseudointerpretados, es decir, aquellos lenguajes en los que el programa fuente pasa por un pseudocompilador que genera un pseudoejecutable. Este pseudoejecutable lo sometemos a un motor de ejecucin. Esto tiene la ventaja de la portabilidad, ya que basta con tener el motor de ejecucin en cualquier mquina para poder ejecutar cualquier pseudoejecutable.

Por ejemplo: Java, Cobol. Algunas ventajas es que permite trabajar con lenguajes que se pueden modificar a s mismo. En la etapa de traduccin optimiza el programa acercndolo a la mquina.

2.4. PREPROCESADORES

Permite modificar el programa fuente antes de la verdadera compilacin. Hacen uso de macroinstrucciones y directivas. Por ejemplo:

El preprocesador sustituye la instruccin #include Uno.c por el cdigo que tiene Uno.c, as cuando el compilador empieza se encuentra con el cdigo ya incluido en el programa fuente. Lo que hace es traducir sentencias simples a llamadas a programas de una biblioteca. Son especialmente utilizados por Sistemas Operativos. Por ejemplo : El shell del DOS o del UNIX. Desencadenan la ejecucin de programas que pueden estar residentes en memoria o encontrarse en disco. Por ejemplo, si ponemos en MS-DOS el comando copy se ejecuta la funcin copy del sistema operativo.

2.5. INTRPRETES DE COMANDOS

2.6. ENSAMBLADORES Y MACROENSAMBLADORES

Son los pioneros de los compiladores, ya que en los albores de la informtica, los programas se escriban directamente en cdigo mquina, y los ensambladores establecen una relacin biunvoca entre cada instruccin y una palabra mnemotcnica, de manera que el usuario escribe los programas haciendo uso los mnemotcnicos, y el ensamblador se encarga de traducirlo al cdigo mquina puro. De manera que, o btener un cdigo ejecutable es obtener un cdigo mquina. Ensamblador : Es un compilador sencillo, en el que el lenguaje fuente tiene una estructura simple que permite una traduccin de una sentencia fuente a una instruccin en cdigo mquina. El lenguaje que utiliza se llama lenguaje ensamblador y tiene una correspondencia uno a uno entre sus instrucciones y el cdigo mquina. Por ejemplo: Cdigo mquina Ensamblador 65h.00h.01h LD HL, #0100

Macroensamblador: Hay ensambladores que tienen macroinstrucciones que se suelen traducir a varias instrucciones mquinas, pues bien, un macroensamblador es un ensamblador con un preprocesador delante.

2.7. CONVERSORES FUENTE - FUENTE

Pasan un lenguaje de alto nivel a otro lenguaje de alto nivel, para conseguir mayor portabilidad. Por ejemplo en un ordenador slo hay un compilador de PASCAL, y queremos ejecutar un programa escrito en COBOL; un conversor de COBOL a PASCAL nos solucionara el problema. Sin embargo, los resultados pueden requerir retoques por dos motivos:

1. Si el lenguaje destino no tiene las mismas caractersticas que el origen. Por ejemplo un conversor de JAVA a C, necesitara retoques ya que C no tiene recolector de basura. 2. Si la traduccin no ha sido inteligente y el programa destino no es eficiente.

Es un compilador que obtiene cdigo para ejecutar en otra mquina. Se utilizan en la fase de desarrollo de nuevos ordenadores.

2.8. COMPILADOR CRUZADO

3. CONCEPTOS BSICOS RELACIONADOS CON LA TRADUCCIN


Estas son las tres fases bsicas de un computador, sin embargo nos vamos a centrar en la primera. El compilador obtiene un cdigo objeto, junto con una tabla de smbolos, de manera que permite la compilacin separada, para que puedan fusionarse diversos ficheros OBJ en un solo ejecutable.

3.1. COMPILAR-LINKAR-EJECUTAR

Un fichero OBJ es un fichero que posee una estructura de registros, los cuales tienen l ongitudes diferentes. Unos de estos registros tienen cdigo mquina, otros van a tener informacin. Tambin incluye informacin sobre los objetos externos. Por ejemplo : Variables que estn en otros ficheros declaradas (EXTERN).

El enlazador resuelve las referencias cruzadas, o externas, que pueden estar o en otros OBJ, o en libreras LIB, y se encarga de generar el ejecutable final. Se obtiene un cdigo reubicable, es decir, un cdigo que en su momento se podr ejecutar en diferentes posiciones de memoria, segn la situacin de la misma en el momento de la ejecucin. El fichero ejecutable es un cdigo dividido en segmentos.

Cmo se hace un programa reubicable? Cuando se crea el .EXE suponemos que va a empezar desde la direccin 0. Como el programa va a estar dividido en segmentos, las direcciones dentro de cada segmento, no se tratan como absolutas, sino que son direcciones relativas a partir del correspondiente segmento. Por tanto, conociendo la direccin absoluta del inicio de cada segmento es suficiente para poder acceder a su direccin. Por ejemplo para acceder a la variable x, se har: dir absoluta segmento + dir relativa variable = dir absoluta de x El cargador, pone el cdigo ejecutable en la memoria disponible, y asigna los registros bases a sus posiciones correctas, de manera que las direcciones relativas funcionen correctamente.

3.2. PASADAS DE COMPILACIN

Es el nmero de veces que se lee el programa fuente. Hay algunas situaciones en las que, para realizar la compilacin, no es suficiente con leer el fichero fuente una sola vez. Por ejemplo: Qu ocurre si tenemos una recursin indirecta? A llama a B B llama a A Cuando se lee el cuerpo de A, no se sabe si B va a existir o no, y no se sabe su direccin de comienzo, luego en una pasada posterior hay que rellenar estos datos. Para solucionar el problema: 1.- Hacer dos pasadas de compilacin. 2.- Hacer una sola pasada de compilacin utilizando la palabra reservada FORWARD. FORWARD B ( ) A() Algunos compiladores dan por implcito el FORWARD. Si no encuentra aquello a que se hace referencia, continan, esperando que el linkador resuelva el problema, o emita el mensaje de error. En C se puede hacer una nica pasada de compilacin, no se pone FORWARD B ( ) y C asume una funcin sin parmetros que devuelve un entero.

Es aquella que compila un programa en el que si despus se descubren errores, en vez de corregir el programa fuente y compilarlo por completo, se compilan solo las modificaciones. Lo ideal es que solo se recompilen aquellas partes que contenan los errores, y que el cdigo generado se reinserte con cuidado en el OBJ generado cuando se encontraron los errores. Sin embargo esto es muy difcil. En general puede hacer a muchos niveles, por ejemplo, si se nos olvida un ; se genera un OBJ transitorio. Si se pone el ; que falta y se recompila, un compilador incremental puede funcionar a varios niveles: A nivel de carcter : Se recompila el ; A nivel de sentencia: Si el ; faltaba en la lnea 100 slo se compila la lnea 100. A nivel de bloque: Si el ; faltaba en un procedimiento o bloque solo se compila ese bloque. A nivel de Fichero: Si tenemos 15 ficheros y solo se modifica 1(al que le faltaba el ;), compilo ese fichero y luego se enlazan todos juntos.

3.3. COMPILACIN INCREMENTAL

Lo ideal es que se hiciese a nivel de instruccin, pero lo normal es encontrarlo a nivel de fichero.

3.4. AUTOCOMPILADOR

Es un compilador escrito en el mismo lenguaje que compila. Cuando se extiende entre muchas mquinas diferentes el uso de un compilador, y ste se desea mejorar, el nuevo compilador se escribe con el antiguo, de manera que pueda ser compilado por todas esas mquinas diferentes, y d como resultado un compilador ms potente de ese mismo lenguaje.

3.5. METACOMPILADOR

Es un programa que acepta la descripcin de un lenguaje y obtiene el compilador de dicho lenguaje, es decir, acepta como entrada una gramtica de un lenguaje genera un autmata que reconoce cualquier sentencia del lenguaje. A este autmata podemos aadirle cdigo para realizar el compilador. Por ejemplo LEX y YACC, FLEX, PCCTS, MEDISE, etc. Unos metacompiladores pueden trabajar con gramticas de contexto libre y otros trabajan con gramtica regular. Los primeros se dedican a reconocer la sintaxis del lenguaje y los segundos trocean la entrada y la dividen en palabras. El PCLEX es un metacompilador cuya funcin es generar un programa que es la parte del compilador que reconoce las palabras reservadas. El PCYACC es un

metacompilador cuya funcin es generar un programa que es la parte compilador que indica si una sentencia del lenguaje es vlida o no.

3.6. DESCOMPILADOR

Pasa de un cdigo mquina (o programa de salida) al lenguaje que lo gener ( programa fuente). Cada descompilador trabaja con un lenguaje de alto nivel concreto. Es una operacin casi imposible, porque al cdigo mquina casi siempre se le aplica una optimizacin. Por eso lo que hay suelen ser desensambladores, ya que existe una biseccin entre cada instruccin mquina y cada instruccin ensamblador. Se utilizan especialmente cuando el cdigo mquina ha sido generado con opciones de depuracin, y contiene informacin adicional de ayuda a la depuracin de errores (puntos de ruptura, opciones de visualizacin de variables, etc). Tambin se emplea cuando el compilador original no gener cdigo mquina puro, sino pseudocdigo (para ejecutarlo a travs de un pseudointrprete).

4. ESTRUCTURA DE UN COMPILADOR. FASES


Normalmente los compiladores estn divididos en dos partes:

Front End (etapa inicial): es la parte que analiza el cdigo fuente, comprueba su validez, genera el rbol de derivacin y rellena los valores de la tabla de smbolos. Esta parte suele ser independiente de la plataforma o sistema para el cual se vaya a compilar. Back End (etapa final): es la parte que genera el cdigo mquina, especfico de una plataforma, a partir de los resultados de la fase de anlisis, realizada por el Front End.

Esta divisin permite que el mismo Back End se utilice para generar el cdigo mquina de varios lenguajes de programacin distintos y que el mismo Front End que sirve para analizar el cdigo fuente de un lenguaje de programacin concret sirva para la generacin de cdigo mquina en varias plataformas distintas. El cdigo que genera el Back End normalmente no se puede ejecutar directamente, sino que necesita ser enlazado por un programa enlazador ( linker). En resumen, una parte analiza la entrada y genera estructuras intermedias y la otra sintetiza la salida. En base a tales estructuras intermedias:

Hasta ahora el esquema de un traductor era:

Depuramos este esquema:

Bsicamente los objetivos de la fase de Anlisis son los enunciados: controlar la correccin del programa fuente y generar estructuras necesarias para comenzar la sntesis. Para llevar esto a cabo, el Anlisis consta de las siguientes tareas:

En la fase de anlisis lxico se leen los caracteres del programa fuente y se agrupan en cadenas que representan los componentes lxicos. Cada componente lxico es una secuencia lgicamente coherente de caracteres relativa a un identificador, una palabra reservada, un operador o un carcter de puntuacin. A la secuencia de caracteres que representa un componente lxico se le llama lexema (o con su nombre en ingls token). En el caso de los identificadores creados por el programador no solo se genera un componente lxico, sino que se genera otro lexema en la tabla de smbolos.

4.1. ANLISIS LEXICOGRFICO

Comprueba que la estructura de los componentes bsicos sea correcta segn ciertas reglas gramaticales.

4.2. ANLISIS SINTCTICO

4.3 ANLISIS SEMNTICO

Comprueba todo lo relacionado con el significado, chequeo de tipos, rangos de valores, existencia de variables, etc. En cualquiera de los tres anlisis puede haber errores. El objetivo de la fase de sntesis consiste en: construir el programa objeto deseado a partir de las estructuras generadas por la fase de anlisis. Para ello realiza tres tareas fundamentales:

4.4. GENERACIN DE CDIGO INTERMEDIO

Genera un cdigo independiente de la mquina. Las ventajas, es que es fcil hacer pseudocompiladores y adems facilita la optimizacin de cdigo.

4.5. GENERACIN DEL CDIGO MQUINA

Crea un fichero .exe directamente o un fichero .obj. Aqu tambin se puede hacer optimizacin propia del microprocesador.

La optimizacin puede realizarse durante las fases de generacin de cdigo intermedio y/o generacin de cdigo mquina y puede ser una fase aislada de stas, o estar integrada con ellas. La optimizacin del cdigo intermedio debe ser independiente de la mquina. Se ha convertido en rutina el tomar la etapa inicial de un compilador y rehacer su etapa final asociada para producir un compilador para el mismo lenguaje fuente en una mquina distinta. Tambin resulta tentador compilar varios lenguajes distintos en el mismo lenguaje intermedio y usar una etapa final comn para las distintas etapas iniciales, obtenindose as varios compiladores para una mquina. Veamos ejemplos: 1. Suponemos que queremos crear un compilador del lenguaje C para tres mquinas diferentes.

4.6. FASE DE OPTIMIZACIN

2. Tambin podemos crear tres compiladores para la misma mquina.

3. Si queremos tres compiladores para tres mquinas. (9 compiladores en total)

Una funcin esencial de un compilador es registrar los identificadores utilizados en el programa fuente y reunir informacin sobre los distintos atributos de cada identificador. Estos atributos pueden proporcionar informacin sobre la memoria asignada a un identificador, su tipo, su mbito (la parte del programa donde tien validez),...

4.7. TABLA DE SMBOLOS

Posee informacin sobre los identificadores definidos por el usuario, ya sean constantes, variables o tipos. Dado que puede contener informacin de diversa ndole, debe hacerse de forma que no sea uniforme. Hace funciones de diccionario de datos y su estructura puede ser una tabla hash, un rbol binario de bsqueda, etc. Esquema definitivo de un traductor:

Esta tabla debida a su complejidad es tratada como un objeto:

5. EJEMPLO DE COMPILACIN
Como ya hemos dicho un compilador se divide en dos fases, y cada una de estas fases tiene una serie de tareas fundamentales, las cuales transforma al programa fuente de una representacin en otra. Suponemos que queremos compilar el siguiente programa: #define TASA 8 descuento = fijo + valor * TASA;

Preprocesado: Un programa fuente se puede dividir en mdulos almacenados en archivos distintos. La tarea de reunir el programa fuente a menudo se confa a un programa distinto, llamado preprocesador. El cual tambin puede expandir abreviaturas, llamadas macros, a proposiciones del lenguaje fuente. En nuestro ejemplo sustituye la constante TASA por su valor: descuento = fijo + valor * 8 ; FASE DE ANLISIS Lexicogrfico : Anlisis en el que 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 colectivo, adems trabaja con la tabla de smbolos. En nuestro ejemplo los caracteres de la proposicin de asignacin: Descuento = fijo + valor * 8 ; se agruparan en los componentes lxicos siguientes: 1.- El identificador Descuento. 2.- El smbolo de asignacin. 3.- El identificador fijo . 4.- El signo de suma. 5.- El identificador valor . 6.- El signo de multiplicacin. 7.- El nmero 8. 8.- El smbolo terminal ;.

Los espacios en blanco que separan los caracteres de estos componentes lxicos normalmente se eliminan durante el anlisis lxico.

Sintctico: Trabaja con una gramtica de contexto libre y genera el rbol sintctico que reconoce esa sentencia:

Las fases se van haciendo segn la demanda, es decir no se espera a que acabe una fase para empezar la otra, sino que el sintctico va generando el rbol conforme el lexicogrfico le va proporcionando sentencias.

Compilacin dirigida por sintaxis: El control lo lleva el sintctico, y todas las dems fases estn sometidas a l. El rbol sintctico es la entrada para el anlisis semntico. Semntico: Esta fase revisa el programa fuente para tratar de encontrar errores semnticos y rene la informacin sobre los tipos para la fase posterior de generacin de cdigo. En ella se utiliza el rbol sintctico del anlisis anterior para

identificar los operadores y operandos de expresiones y proposiciones. componente importante del anlisis semntico es la verificacin de tipos. Aqu, el compilador verifica si cada operador tiene operandos permitidos por la especificacin del leguaje fuente. Supongamos que nuestro lenguaje solo trabaja con nmeros reales, la salida sera el mismo rbol pero donde tenamos <NUM>.8 pondramos <NUM>. 8.0 FASE DE SNTESIS. Generacin de cdigo intermedio : Despus de los anlisis sintctico y semntico, algunos compiladores generan una representacin intermedia explcita del programa fuente. Se puede considerar esta representacin intermedia como un programa para una mquina abstracta. Esta representacin intermedia debe tener dos propiedades importantes; debe ser fcil de producir y fcil de traducir al programa objeto. Optimizacin : La fase de optimizacin de cdigo, trata de mejorar el cdigo intermedio, de modo que resulte un cdigo de mquina ms rpido de ejecutar. Algunas optimizaciones son triviales. Por ejemplo hay una forma mejor de realizar los mismos clculos que hemos realizado en el cdigo anterior: t2 = valor * 8.0 descuento = fijo + t2 El compilador puede deducir que la conversin de 8 de entero a real se puede hacer de una vez por todas en el momento de la compilacin, de modo que la operacin int-to-real se puede eliminar. Adems t2' se utiliza slo una vez, para transmitir su valor a descuento. Entonces resulta seguro sustituir descuento por t3', a partir de lo cual se elimina otra de las lneas de cdigo. Generacin de cdigo mquina : La fase final de un compilador es la generacin de cdigo objeto, que por lo general consiste en cdigo mquina relocalizable o cdigo ensamblador. Las posiciones de memoria se seleccionan para cada una de las variables usadas por el programa. Despus, cada una de las instrucciones intermedias se traduce a una secuencia de instrucciones de mquina que ejecuta la misma tarea. Un aspecto decisivo es la asignacin de variables a registros. Por ejemplo, utilizando los registros R1 y R2, la traduccin del cdigo optimizado podra ser:

El primero y segundo operandos de cada instruccin especifican una fuente y u destino, respectivamente. Este cdigo traslada el contendido de la direccin [1Ah] al registro R1, despus lo multiplica por la constante real 8.0. La tercera instruccin pasa el contenido de la direccin [15h] al registro R2. La cuarta instruccin le su el valor previamente calculado en el registro R1. Por ltimo el valor del registro R2 se pasa a la direccin [10h].

BIBLIOGRAFA
LIBROS: JAVA A TOPE: TRADUCTORES Y COMPILADORES CON LEX/YACC, JFLEX/CUP Y JAV ACC. Edicin electrnica. Autores: Sergio Glvez Rojas y Miguel ngel Mora Mata. COMPILADORES. PRINCIPIOS, TCNICAS Y HERRAMIENTAS. Autores: Alfred V. Aho, Ravi Sethi y Jeffrey D. Ullman.

WEBS: www.lcc.uma.es/~galvez/tci.html es.wikipedia.org/wiki/Compilador

Das könnte Ihnen auch gefallen