Anda di halaman 1dari 20

Ana M Corrales Barrios 74894886 D Jess Prez DNI: 74945244 C Curso: 1A I.T.I.G.

DNI: Garca

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

NDICE

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 C DIGO 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 v 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 intrp de comando, etc. Por ejemplo Qu ocurre si nos dan un documento de Word que procede de una fusin con una base de datos y se quiere, a partir de l, obtener la B.D. original? Podra 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 trab 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 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 progra escrito en un lenguaje fuente hasta un texto o programa escrito en un lengu destino produciendo, si cabe, mensajes de error. Los traductores engloban tanto 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 escribir. El primer compilador de FORTRAN, por ejemplo, necesit para su implementacin 18 aos de trabajo en grupo. Hasta que apareci la teora 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 hu 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 Espa 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 inteligen 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 Ing y dio: El vino est bueno pero la carne est podrida (En ingls spirit significa tanto espritu como alcohol). Otros ejemplos de frases hechas 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. Ej emplo: Por de aquello, se llev una galleta.

2.2. COMPILADORES

Es aquel traductor que tiene como entrada una sentencia en lenguaje forma 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. compilador traduce todo el programa antes de ejecutarlo. Los compiladores son, pues, programas de traduccin insertados en la memoria por el sistema operat para convertir programas de cmputo en pulsaciones electrnicas ejecutables (lenguaje de mquina).

2.3. INTRPRETES

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 Languag 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 trad no puede aplicarse mucha optimizacin, adems si el programa entra en un bucle

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 memo por lo que consumen ms recursos. Hay lengua jes que son pseudointerpretados, es decir, aquellos lenguajes en los que el programa fuente pasa por un pseudocompilador que genera pseudoejecutable. Este pseudoejecutable lo sometemos a un motor de ejecucin. Esto tiene la ventaja de la portabilidad, ya que basta con tener el motor ejecucin en cualquier mquina para poder ejecutar cualquier pseudoejecutable.

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

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

2.4. PREPROCESADORES

El preprocesador sustituye la instruccin #include Uno.c por el cdigo que tie Uno.c, as cuando el compilador empieza se encuentra con el cdigo ya incluido en el programa fuente.

2.5. INTRPRETES DE COMANDOS

Lo que hace es traducir sentencias simples a llamadas a programas de 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 memo o encontrarse en disco. Por ejemplo, si ponemos en MS-DOS el comando copy se ejecuta la funcin copy del sistema operativo.

2.6. ENSAMBLADORES Y MACROENSAMBLADORES

Son los pioneros de los compiladores, ya que en los albores de la informtica, programas se escriban directamente en cdigo mquina, y lo s ensambladores establecen una relacin biunvoca entre cada instruccin y una pala mnemotcnica, de manera que el usuario escribe los programas haciendo uso los mnemotcnicos, y el ensamblador se encarga de traducirlo al cdigo mqu 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 estructura simple que permite una traduccin de una sentencia fuente a una instruccin en cdigo mquina. El lenguaje que utiliza se llama lengu 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 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 ma portabilidad. Por ejemplo en un ordenador slo hay un compilador de PASCAL, y queremos ejecutar un programa escrito en COBOL; un conversor de COBO 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 tie recolector de basura. 2. Si la traduccin no ha sido inteligente y el programa destino no es eficiente.

2.8. COMPILADOR CRUZADO

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

3. CONCEPTOS BSICOS RELACIONADOS CO LA TRADUCCIN


3.1. COMPILAR- LINKAR- EJECUTAR
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, manera que permite la compilacin separada, para que puedan fusionarse diversos ficheros OBJ en un solo ejecutable.

Un fichero OBJ es un fichero que po see una estructura de registros, los cua tienen longitudes diferentes. Unos de estos regist ros tienen cdigo mquina, otros van a tener informacin. Tambin incluye informacin sobre los objetos extern 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 po 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 segment

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 ca segmento, no se tratan como absolutas, sino que son direcciones relativas a partir del correspondiente segmento. Por tanto, conociendo la direccin absoluta 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 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 aA Cuando se lee el cuerpo de A, no se sabe si B va a existir o no, y no se sabe direccin de comienzo, luego en una p asada 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 reserva 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 proble 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 pa rmetros que devue un entero.

3.3. COMPILACIN INCREMENTAL

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 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 genera 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 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 l 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 faltaba el ;), compilo ese fichero y luego se enlaza n todos juntos. 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 extien 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 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 compila de dicho lenguaje, es decir, acepta como entrada una gramtica de un lenguaje genera un autmata que reconoce cualquier sentencia del lenguaje. A e 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 ot 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 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 aplica una optimizacin. Por eso lo que hay suelen ser desensambladores, ya que existe una biseccin entre cada instruccin mquina y cada instrucc ensamblador. Se utilizan especialmente cuando el cdigo mquina ha sido generado con opciones de depuracin, y contiene informacin adicional de ayuda a depuracin de errores (puntos de ruptura, opciones de visualizacin de variables, etc). Tambin se emplea cuando el compilador original no gener cdigo mqu 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 smbolos. Esta parte suele ser independiente de la p lataforma o sistema para el cual se vaya a compilar. Back End (etapa final): es la parte que genera el cdigo mquina, especfico 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 cd 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 concr 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 o 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 comenza sntesis. Para llevar esto a cabo, el Anlisis consta de las siguientes tareas:

4.1. ANLISIS LEXICOGRFICO

En la fase de anlisis lxico se leen los caracteres del programa fuente y se agrup en cadenas que representan los componentes lxicos. Cada componente lxico es una secuencia lgicamente coherente de caracteres relativa a un identificador, u 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 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 o lexema en la tabla de smbolos.

4.2. ANLISIS SINTCTICO

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

4.3 ANLISIS SEMNTICO


Comprueba todo lo relacionado con el significado, chequeo de tipos, rangos 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 t 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 ha optimizacin propia del microprocesador.

4.6. FASE DE OPTIMIZACIN

La optimizacin puede realizarse durante las fases de generacin de cdigo intermedio y/o generacin de cdigo mquina y puede ser una fase aislada 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 etapa final asociada para producir un compilador para el mismo lenguaje fuente en una mquina distinta. Tambin resulta tentador compilar varios lenguajes distin en el mismo lenguaje intermedio y usar una etapa final comn para las distintas etapas iniciales, obtenindose as varios compiladores para una mquina. Veam ejemplos: 1. Suponemos que queremos crear un compilador del lenguaje C para tres mquinas diferentes.

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 utilizad en el programa fuente y reunir informacin sobre los distintos atributos de cada identificador. Estos atributos pueden proporcionar informacin sobre la memo asignada a un identificador, su tipo, su mbito (la parte del programa donde tien validez),...

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

4.7. TABLA DE SMBOLOS

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 es 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 programa distinto, llamado preprocesador. El cual tambin puede expandir abreviaturas, llamadas macros, a proposiciones del lenguaje fuente. En nues 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 lxi que son secuencias de caracteres que tienen un significado colectivo, adems trabaja con la tabla de smbolos. En nuestro ejemplo los caracteres de 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 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 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 erro 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 p

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 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 semnt algunos compiladores generan una representacin intermedia explcita del programa fuente. Se puede considerar esta representacin intermedia como programa para una mquina abstracta. Esta representacin intermedia debe tener dos propiedades importantes; debe ser fcil de producir y fcil de traducir 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 ejecu 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 pu 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, p 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 cdigo objeto, que por lo general consiste en cdigo mquina relocalizable o cdigo ensamblador. Las posiciones de memoria se seleccionan para cada una de variables usadas por el programa. Despus, cada una de las instrucciones intermedias se traduce a una secuencia de instrucciones de mquina que ejecuta misma tarea. Un aspecto decisivo es la asignacin de variables a registros. Por ejemplo, utilizando los registros R1 y R2, la traduccin del cdigo optimiz podra ser:

El primero y segundo operandos de cada instruccin especifican una fuente y 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 instrucc 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].

BIBLIOGRAF A
LIBROS: JAVA A TOPE: TRADUCTORES Y COMPILADORES CON LEX/YACC, JFLEX/CUP Y JAV ACC. Edicin electrnica. Autores: Sergio Glvez Roja 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.ht ml es.wikipedia.org/wiki/Compilado r