Está en la página 1de 34

Transparencias Procesadores de Lenguaje

Elena D Fernndez az a 29 de septiembre de 2004

Tema 1 Introduccin al proceso de o traduccin o


Bibliograf a: Aho, A.V., Sethi, R., Ullman, J.D. (1990), Compiladores: principios, tcnicas y herramientas, Tema 1, pginas: 1- 25, e a 743-747. Louden, K.C. (1997), Compiler Construction: Principles and Practice, Tema 1, pginas: 1- 27. a Contenido: e 1. Qu es un traductor?. Tipos de traductores. 2. Fases del proceso de traduccin. o 3. Especicacin de los lenguajes de programacin. o o 4. Programas del sistema relacionados con los traductores. 5. Principales estructuras de datos en un traductor. 6. Mil lenguajes y mil mquinas, un milln de traductores?: a o a) Front-end y Back-end. Traduccin cruzada. o b) Bootstraping. 7. Herramientas de ayuda a la traduccin. o 8. Aplicaciones de los sistemas de traduccin. o o a 9. Relacin con otras reas.
3

TEMA 1. INTRODUCCION AL PROCESO DE TRADUCCION

1.1.

Qu es un traductor?. Tipos de traduce tores.

Traductor: programa que traduce un lenguaje (el lenguaje fuente) a otro lenguaje (el lenguaje objeto). Informa de posibles errores.
Lenguaje Fuente Traductor Lenguaje Destino

Mensajes de error

En el contexto de la compilacin de programas, el lenguaje fuente o es normalmente un lenguaje de alto nivel, y el lenguaje destino u objeto es el lenguaje mquina. a Gran diversidad de lenguajes fuentes y lenguajes objetos implica gran diversidad de traductores. Algunos ejemplos:
lenguaje fuente C C C C++ cdigo ensamblador o Latex Html Ingls e Imagen pgm lenguaje objeto cdigo mquina o a // compilador de C cdigo ensamblador o Pascal C cdigo mquina o a // ensamblador Html Xml Castellano Imagen bmp

Breve introduccin histrica: o o 1940-50: primeros ordenadores digitales: programados en lenguaje mquina (cdigos numricos que representaban las opa o e eraciones mquina). Mucho tiempo de programacin y a o tedioso. C7 06 0000 0002 (mover el nmero 2 a la direccin 0000). u o

1.1. QUE ES UN TRADUCTOR?. TIPOS DE TRADUCTORES.

cdigo ensamblador: las instrucciones y posiciones de o memoria se dan simblicamente MOV X, 2 (X tiene la o direccin 0000). Reduccin del tiempo de escritura y de o o la correccin de programas. Todav dif de leer y eso a cil cribir, dependiente de la mquina (cdigo debe ser reea o scrito si se cambia de mquina). a necesidad de lenguajes que permitan escribir los programas de forma concisa, similar a una notacin matemtica, o a y que se pudieran traducir a cdigo ejecutable para una o mquina dada. (X=2). a a cil primeras impresiones: ser extremadamente dif (casi imposible), generar cdigo muy ineciente (en aquean o lla poca escasos recursos de computacin). Existia un e o escepticismo generalizadp. 1950-60: El trmino compilador fue introducido por primera vez e en 1950 por G. M. Hooper. La traduccin de programas o era entonces vista como la reunion de una secuencia de subprogramas de una librer a. aparecen los primeros trabajos sobre compiladores relacionados con la traduccin de formulas aritmticas a o e cdigo mquina. o a John Backus lider un grupo de trabajo en IBM para la o realizacin de un traductor a cdigo mquina de frmuo o a o las matemticas. Resultado con gran xito: especicacin a e o de un lenguaje de alto nivel (FORTRAN, FORmule TRANslation) y la realizacin de un traductor para una mquina o a (IBM 704). Se tardo el trabajo de 18 personas en un ao. n Fu un compilador hecho ad-hoc, no existia una teoria e formal, sino que se iban resolviendo las construcciones una a una, para cada situacin particular. o Chomsky comienza estudios sobre la estructura del lenguaje natural. Clasicacin de los lenguajes (jerarqu de o a las gramticas) y estudios sobre los algoritmos de rea

TEMA 1. INTRODUCCION AL PROCESO DE TRADUCCION

conocimiento (susceptibles de ser automatizables y de forma eciente). en Europa surgi una corriente ms universitaria, que o a pretend que la denicin de un lenguaje fuese indepena o diente de la mquina y donde los algoritmos se pudieran a expresar de forma ms simple. Inuida por los trabaa jos de Chomsky. Surgi el grupo de Bauer en Alemao nia para denir un lenguaje de usos mltiples. Surgi el u o ALGOritmitc Language (ALGOL). La sintaxis fue completamente especicada por primera vez con la notacin o BNF (Backus-Naur-Form). ALGOL 60, primer lenguaje de propsito mltiple que o u goz de amplio uso. Se introducen las caracter o sticas de los lenguajes actuales: denicin de la sintaxis en noo tacin BNF, formato libre, declaracin expl o o cita de tipos, estructuras iterativas, recursividad, paso de parmetros a por valor y nombre y estructura de bloques, con el consiguiente mbito de las variables. a 1960-70: Diseo del lenguaje de alto nivel LISP. En un princin pio, el cdigo LISP se traduc manualmente a cdio a o go mquina (tambin para el IBM 704). Se escribi en a e o LISP un programa capaz de interpretar programas LISP, que se tradujo manualmente a cdigo de mquina, cono a struyendo de este modo un intrprete ejecutable de LISP. e Knuth deni las gramticas LR y determin cmo cono a o o struir la tabla de anlisis sintctico ascendente LR. Se a a denieron las gramticas LL para el anlisis descendente. a a primeros lenguajes, como FORTRAN y ALGOL 60, los tipos de datos eran muy sencillos y su vericacin tamo bin. Con el ALGOL 68 se empieza a aplicar la coercin e o de tipos y la equivalencia estructural y por nombre. entornos de ejecucin estticos: no recursividad y no alo a macenamiento dinmico de memoria. a

1.1. QUE ES UN TRADUCTOR?. TIPOS DE TRADUCTORES.

optimizacin: eliminacin de subexpresiones comunes, o o identicacin de cdigo muerto, sustitucin de operao o o ciones aritmticas, propagacin de constantes y clcue o a lo previo de constantes, variables de induccin, propao gacin de copias o cdigo inalcanzable, eleccin de deo o o terminadas instrucciones, registros,etc 1970-80: aparecen los generadores automticos de analizadores a lxicos o sintcticos, como Lex o Yacc (Yet another compilere a compiler). o se multiplican los lenguajes de programacin (torre de Babel) debido a los avances tericos en la formalizacin o o de los lenguajes y a la sistematizacin de las herramieno tas para la generacin de reconocedores. o PASCAL diseado por N. Wirth, del Instituto Politcnin e co Zurich. Pensado para la enseanza. Goza de ser buen n progenitor de posteriores lenguaje (Modula-2, ADA). Representacin intermedia: cdigo P. Separar el proceso de o o traduccin en dos fases: el front-end encargada de analizar o el programa fuente (operaciones dependientes slo del o lenguaje fuente) y el back-end encargada de generar el cdigo para la mquina objeto (operaciones dependio a entes slo del lenguaje fuente). Front-end codicado a o mano usando un analizador descendente predictivo recursivo. la compilacin pasa a ser una materia con un cuerpo de o conocimiento propio. Aparecen los primeros libros sobre compilacin. o entornos de ejecucin basados en pila y mont o culo: recursividad, gestin dinmica de memoria, mtodos de paso o a e de parmetros, acceso a variables no locales (mbitos de a a referencia anidados). 1980-90:

TEMA 1. INTRODUCCION AL PROCESO DE TRADUCCION

gramticas de atributos para la especicacin semntica a o a del lenguaje. No es un punto de vista tan formal como para el anlisis lxico y sintctico (excepto la semntica a e a a denotacional para lenguajes funcionales). Son comprobaciones ad-hoc implementadas a mano. o o a estudios sobre la optimizacin de cdigo basado en anlisis de ujo de control y de datos. Tarea muy compleja, investigacin hasta la fecha. Anlisis de control de ujo y o a de datos, prediccin de ramicaciones, ... Optimizaciones o dependientes de la mquina: jerarqu de memoria, ena a cauzamientos, nmero de registros, etc. u entornos completamente dinmicos de ejecucin: compia o lador gestiona la asignacin y desasignacin de memoria o o en tiempo de ejecucin, recoleccin de basura y refero o encias desactivadas (entornos de ejecucin basados en o mont culos heap). 1990-: se consolida la programacin orientada a objetos. o compiladores en un entorno de desarrollo junto con editores, enlazadores, cargadores, depuradores, gestores de proyecto, analizadores de rendimiento. herramientas para la generacin automtica de cdigo. o a o no hay cambios en el anlisis lxico y sintctico, concepa e a tos y mtodos persistentes, slidamente establecidos. e o se vuelve a poner de moda la compilacin a un cdigo ino o termedio (cdigo-byte) que pueda ejecutarse en cualquier o mquina, bien mediante un intrprete de mquina vira e a tual: Java (JVM, Java Virtual Machine), Perl, Python, bien mediante compilacin just-in-time: Java, Oberon. o El cdigo es ejecutado por un intrprete normalmente o e incluido en un navegador de Internet. los lenguajes interpretados de muy alto nivel (lenguajes de script), (re)aparecen con fuerza (Python, Perl,

1.1. QUE ES UN TRADUCTOR?. TIPOS DE TRADUCTORES.

Tcl/Tk, shells, awk), permiten construir y prototipar rpidamente programas complejos, interfaces de usuario, a implementar ltros para tratamiento de informacin texo tual, etc.

10

TEMA 1. INTRODUCCION AL PROCESO DE TRADUCCION

1.2.

Fases del proceso de traduccin. o

Conveniente desde un punto de vista conceptual ver un compilador como una serie de fases con diferentes nes (en la realidad esta separacin es menos estricta, los mdulos se solapan entre o o s ).
Cdigo Fuente Anlisis Lxico Componente Lxicos Anlisis Sintctico rbol Sintctico Tabla de smbolos Anlisis Semntico rbol anotado sintctico Generacin/Optimizacin Cdigo Intermedio Cdigo intermedio Generacin/Optimizacin Cdigo Objeto Cdigo Objeto Fase de Anlisis

Gestor de errores

Fase de Sntesis

el analizador lxico: lee la secuencia de caracteres de izquiere da a derecha del chero fuente y los agrupa en unidades con signicado propio (los componentes lxicos): palabras clave, e identicadores, operadores, constantes numricas, signos de e puntuacin como separadores de sentencias, llaves, parntesis o e , etc. Adems de eliminacin de comentarios, procesamiena o

1.2. FASES DEL PROCESO DE TRADUCCION.

11

to de macros o inclusin de cheros. La estructura lxica la o e modelizaremos mediante expresiones regulares. el anlisis sintctico: determina si la secuencia de compoa a nentes lxicos sigue la sintaxis del lenguaje y obtiene la ese tructura jerrquica del programa en forma de rbol, donde a a los nodos son las construcciones de alto nivel del lenguaje. Se determinan las relaciones estructurales entre los componentes lxicos. La estructura sintctica la deniremos medie a antes gramticas independientes del contexto (GIC). a el anlisis semntico: realiza comprobaciones necesarias soa a bre el rbol sintctico para el correcto signicado del prograa a ma: vericacin e inferencia de tipos en asignaciones y expreo siones, declaracin antes de uso (variables, funciones, tipos), o correcto uso de operadores, mbito de variables, correcta llaa mada a funciones ... Nos limitaremos al anlisis semntico a a esttico (en tiempo de compilacin). Necesidad de hacer uso a o de la Tabla de S mbolos, como estructura de datos para almacenar informacin sobre los identicadores que van surgiendo o a lo largo del programa. El anlisis semntico se suele implea a mentar a mano y se suele asociar a construcciones del lenguaje o un subrbol. Por eje: para la produccion E E + E, a deberiamos incluir cdigo para hacer la comprobacion de o tipos, validez de los operadores para esos operandos, etc. La semntica la modelizaremos mediante gramticas de atribua a tos (GIC+atributos que representan propiedades de las construccciones del lenguaje: por ejemplo: tipo, valor, etc). la fase de generacin y optimizacin de cdigo intermedio: o o o linearizacin del rbol sintctico donde ya no aparecen cono a a strucciones de alto nivel (similar a un lenguaje tipo ensamblador). Es un cdigo ya no estructurado ms fcil de trao a a ducir directamente a cdigo ensamblador o mquina: cdigo o a o de tres direcciones (cada instruccin tiene un operador, y o la direccin de dos operandos y un lugar donde guardar el o resultado). Optimizaciones que slo dependen del lenguaje o fuente (y no de la mquina): eliminacin de subexpresiones a o

12

TEMA 1. INTRODUCCION AL PROCESO DE TRADUCCION

comunes, identicacin de cdigo muerto, sustitucin de opo o o eraciones aritmticas, clculo previo de constantes, variables e a de induccin, propagacin de copias o cdigo inalcanzable. o o o Suele ser una fase lenta y compleja. Existe la optimizacion de mirilla (peephole optimization), en la que slo se cono sideran una cuantas instrucciones a cada vez, y se realizan optimizadiones sencillas como eliminar las multiplicaciones por 1, remplazar una secuencia de instrucciones por otra sla o ms eciente (incrementar el valor en una posicin de memoa o ria en 1). la generacin y optimizacin de cdigo objeto: toma como o o o entrada la representacin intermedia y genera el cdigo eno o samblador o mquina. Optimizaciones dependientes de la a mquina, es necesario conocer: conjunto de instrucciones, la a representacin de los datos (nmero de bytes), modos de dio u reccionamiento, nmero y propsito de registros, jerarqu de u o a memoria (espec. la cach), encauzamientos, etc. Suelen ime plementarse a mano, y son complejos porque la generacin de o un buen cdigo objeto (mquina) requiere la consideracin o a o de muchos casos particulares. Tambin se est investigando en la creaccin de crear genere a o adores de cdigo automticos (sorcerer). La idea es automatio a camente hacer corresponder una representacin intermedia o (IR) a plantillas de intrucciones objeto. Permite facilmente retarget el compilador a una nueva mquina objeto, se cama biar el nuevo conjunto de plantillas. Ejemplo (GCC, GNU a C compoler). Posee plantillas para mas de 10 arquitecturas ms habituales de ordenadores. a Tabla de Smbolos: estructura tipo diccionario con opera ciones de insertar, borrar y buscar que almacena informacin o sobre los s mbolos que van apareciendo a lo largo del programa: los identicadores (variables y funciones), etiquetas, tipos denidos por el usuario (arrays, records,...). Almacena el tipo de dato, la aridad, mtodo de paso de parmetros, e a tipo de retorno y de argumentos de una funcin, el mbito de o a

1.2. FASES DEL PROCESO DE TRADUCCION.

13

referencia de identicadores y la direccin de memoria. Intero acciona tanto con el analizador lxico, sintctico y semntico e a a que introducen informacin conforme se procesa la entrada. o La fase de generacin de cdigo y optimizacin tambin la o o o e usan. el gestor de errores: detecta e informa de errores de cada fase que se produzcan durante el anlisis. Debe generar mensajes a signicativos y reanudar la traduccin. Encontramos errores: o Detectables en tiempo de compilacin: errores lxicos o e (ortogrcos), sintcticos (construcciones incorrectas) y a a semnticos (p. ej. uso de variables no declaradas, errores a de tipo, etc). o Detectables en tiempo de ejecucin: direccionamiento de vectores fuera de rango, divisiones por cero, etc. De especicacin/diseo: compilan correctamente pero o n no realizan lo que el programador desea. Se trataran slo errores estticos (en tiempo de compilacin). o a o Respecto a los errores en tiempo de ejecucin, es necesario o que el traductor genere cdigo para la comprobacin de ero o rores espec cos, su adecuado tratamiento y los mecanismos de tratamiento de excepciones para que el programa se contine ejecutando. u La mayor de los compiladores son dirigidos por la sintxis, a a es decir, el proceso de traduccin es dirigido por el anlizador o a sintctico. El anlisis sintctico genera la estructura del programa a a a fuente a travs de tokens. El anlisis semntico proporcionan el e a a signicado del programa basndose de la estructura del rbol de a a anlisis sintctico a a Las fases de anlisis lxico y anlisis sintctico se pueden automa e a a atizar fcilmente, las verdaderas dicultades en la construccin a o de compiladores son el anlisis semntico, la generacin y la opa a o timizacin de cdigo. o o N mero de pasadas: nmero de veces que hay que analizar el u u cdigo fuente. Es funcin del grado de optimizacin. o o o

14

TEMA 1. INTRODUCCION AL PROCESO DE TRADUCCION

T picamente: una pasada para realizar el anlisis lxico y sintctia e a co, otra pasada para el anlisis semntico y optimizacin depena a o diente del lenguaje fuente y una tercera pasada para generacin o de cdigo y optimizaciones dependientes de la mquina. o a C, Pascal: admiten una pasada; Modula-2: dos pasadas; Compiladores optimizadores: 5 o ms pasadas. a Programas que se compilan muchas veces y ejecutan pocas veces (entornos de enseanza), poca optimizacin (una pasada). n o

1.2. FASES DEL PROCESO DE TRADUCCION.

15

Ejemplo: Componentes lxicos: e


a [ indice ] = 4 + 2 ; identicador corcherte apertura identicador corchete cierre operador asignacin o nmero u operador suma nmero u punto y coma

a[indice] = 4 + 2 ;

Expresion Asignexpresion | Expresion + Expresion | identicador | numero Asignexpresion LeftValue = Expresion ; LeftValue identicador [ Expresion ]

Arboles de anlisis sintctico y de signicado semntico: a a a


Expresion Asignexpresion LeftValue = identificador [ a Expresion identificador indice ] Expresion numero 4 Expresion + Expresion numero 2

Asignacin

Variable Smbolo: a Tipo: vector de enteros Elemento: valor de indice

Suma entera

entero valor: 4

entero valor: 2

16

TEMA 1. INTRODUCCION AL PROCESO DE TRADUCCION

Tabla de s mbolos:
... a ndice ... variable variable vector de enteros entero tamao: 10 n direcc. memoria direcc. memoria

Cdigo intermedio: o
No optimizado t=4+2 a[indice] = t Optimizado a[indice]=6

Cdigo objeto (ensamblador): o


MOV MUL MOV ADD MOV

R0, indice // valor de indice a R0 R0, 2 // multiplica por dos indice (2 bytes para en R1, &a // direccin de a a R1 o R1, R0 // aade contenido de R0 a R1 n *R1, 6 // constante 6 a la direcccin almacenada en o

Se ha supuesto que un entero ocupa dos bytes de memoria, &a es la direccin de , *R1 implica indirect register adressing. o

1.3. ESPECIFICACION DE LOS LENGUAJES DE PROGRAMACION 17

1.3.

Especicacin de los lenguajes de prograo macin o

Supn que tuvieras que describir un lenguaje de programacin. o o Una manera de hacerlo ser comenzando por describir cules a a son las unidades elementales tales como identicadores, palabras reservadas, operadores, etc. que se encuentran en la entrada. Despus podr describir, cmo se pueden combinar esas unidades e as o en estructuras mayores tales como expresiones, asignaciones, bucles y dems. Finalmente, especicar una serie de normas que a as deben cumplirse para que el programa, adems de estar bien esa crito, tenga signicado (por ejemplo, reglas de que las variables deben declararse antes de usarse, o que los tipos en asignaciones deben ser equivalentes). Podemos considerar que la denicin de un lenguaje consta de o tres partes: Descripcin lxica: Cules son las palabras del lenguao e a je?. Las palabras de un lenguaje de programacin reciben el o nombre de s mbolos o componentes lxicos (tokens). e Descripcin sintctica: Cules son las frases del lenguao a a je?. En un lenguaje de programacin, las frases son los o programas bien construidos sintcticamente. a Descripcin semntica: Qu signica cada frase del lenguao a e je?. El signicado del programa se describe en trminos de e lo que ste hace al ser ejecutado. e De qu mtodos disponemos para especicar el lenguaje? e e
Estructura Lxica e Sintctica a Semntica a Especicacin o Expres. regulares Gram. Indep. Contexto (GIC) Semntica formal, leng. natural a Reconocimiento Autmatas Finitos Determ (AFD) o Autmatas a pila o Reglas ad-hoc Coste O(|x|) O(|x|3 )

Como puedes observar existe un paralelismo entre especicar un lenguaje de programacin y disear un traductor para l. o n e

18

TEMA 1. INTRODUCCION AL PROCESO DE TRADUCCION

1.3.1.

Un ejemplo de la especicacin informal de un o lenguaje

Supondremos un lenguaje extremadamente sencillo, que llamaremos Micro, que servir para ilustrar el diseo e implementacin a n o de los diferentes modulos que forman un traductor a lo largo del curso: El unico tipo de dato que existe es entero. Los identicadores se declaran impl citamente, empiezan con una letra y estn compuestos de letras, d a gitos y subrayados. Los literales son cadenas de d gitos. Los comentarios empiezan por y terminan al nal de la l nea actual. Las sentencias son: Asignaciones: ID := Expresion, donde Expression se construye a partir de identicadores, literales y operadores de suma (+), resta (), y parntesis. e Entrada/Salida: read (Lista de Identicadores); write (Lista de Expresiones); begin, end, read, y write son palabras reservadas. Cada sentencia se termina con un punto y coma (;). El cuerpo de un programa debe estar delimitado por begin y end.

1.4. PROGRAMAS DEL SISTEMA RELACIONADOS CON LOS TRADUCTORES.19

1.4.

Programas del sistema relacionados con los traductores.

Interpretes: ejecuta las instrucciones del programa fuente inmediatamente en vez de esperar a que est traducido por e completo el cdigo fuente a cdigo mquina. Necesitan menos o o a memoria, pero ms lentos (factor de 10) que los compiladores. a LISP, BASIC. Histricamente, se pusieron de moda en los o primeros aos frente porque los recursos de memoria eran n escasos. Permiten aadir cdigo dinmicamente durante la n o a ejecucin (APL). Desventajas: menor velocidad, peor inforo macin sobre los errores al no tener una visin global del o o programa. Ensambladores: traductor de lenguaje ensamblador a lenguaje mquina. Es sencillo (correspondencia casi biun a voca de instrucciones). Enlazadores: en un unico chero une diferentes cheros ob jeto compilados separadamente e incluye las librer neceas sarias. Cargadores: normalmente el chero generado por el enlazador no est completamente preparado para ser ejecutado, las dia recciones de memoria son relativas (cdigo relocalizable). El o cargador asigna una direccin ja de comienzo y resuelve las o diferencias relativas. Preprocesadores: llamado por el compilador antes del proceso de traduccin. Elimina comentarios, incluye cheros de o cabecera, sustituye macros, funciones en l nea. Editores: editores de texto orientados al formato o estructura del lenguaje que llegan a incluir algunas de las operaciones propias del compiladores como informar de errores (Visual C++, Matlab,..) Depuradores: determina errores de ejecucin en un prograo ma compilado. Cuando se ejecuta en modo debugging se

20

TEMA 1. INTRODUCCION AL PROCESO DE TRADUCCION

mantiene informacin sobre todo el cdigo, variables en cada o o momento, procedimientos en la pila de activacin, nmero de o u l nea, ... Analizadores de rendimiento (prolers) : recoge estad sticas sobre comportamiento del programa durante la ejecucin o (nmero de veces que se llama a un procedimiento, porcentau je de tiempo en cada uno, ...). Se pueden reutilizar por el propio compilador para optimizar. Gestores de proyecto: fusin de cheros de diferentes prograo madores y versiones, histricos de cambios producidos ... o Los compiladores se pueden distinguir de acuerdo a la clase cd cdigo objeto que generan: o Pure Machine Code: se genera cdigo para un conjunto paro ticular de instrucciones, sin tener en cuenta la existencia de un S.O. o librerias. El cdigo generado se puede ejecutar dio rectamente sobre el hardware sin ninguna dependencia de software. Augmente Machine Code: se genera cdigo para una arquio tectura dada aumentada con rutinas del S.O. y rutinas de soporte al lenguaje (I/O rutinas, rutinas para la reserva de memoria, funciones matemticas,...) se tienen que cargar juna to con el programa. La combinacin del conjunto de instruco ciones del lenguaje mquina, el S.O y las rutinas del lenguaje a se pueden considerar como la denicin de una mquina viro a tual, que existe como la combinacin de hardware y software. o Virtual Machine Code: es el caso extremo de una mquina a virtual, el cdigo generado se compone enteramente de ino strucciones virtuales (aumenta transportabilidad de compiladores, slo tendriamos que reescribir de la mquina virtual o a usada por el compilador). Ejemplo sobresaliente: Pascal. El compilador generaba cdigo para una mquina virtual a pio a la, P-code. La escritura de un traductor de P-code a cdigo o mquina se puede hacer fcilmente. De ah la popularidad a a , de Pascal.

1.5. DISENO DE TRADUCTORES Y LENGUAJES DE PROGRAMACION21

1.5.

Dise o de Traductores y Lenguajes de Pron gramacin o

El diseo de compiladores y de lenguajes de programacin se n o inuencian el uno sobre el otro. El estado de las tcnicas en e el diseo de compiladores inuye en el diseo de lenguajes: un n n lenguaje que no puede ser compilado no se va a usar!. Los lenguajes que son fciles de compilar presentan muchas ventajas: a Son fciles de aprender, de leer y de entender. a Existir una variedad de compiladores sobre mquinas dadas. a a Aumenta su popularidad (p. eje. Pascal). Se generar mejor cdigo. a o El compilador ser ms pequeo, barato, rpido, ms realia a n a a able y por tanto ms usado. a Qu inuye para que un lenguaje de programacin sea come o pilable? Depende de qu es lo que se puede determinar antes de e la ejecucin (esttico) y que se puede realizar despus de la ejecuo a e cin (dinmico). Preguntas como: Se puede determinar el mbito o a a y tipo de un identifcicador antes de la ejecucin? Se puede cambiar o texto del programa o aadir durante la ejecucin? (Por ejemplo, n o LISP permite crear texto durante la ejecucin). o

1.6.

Estructuras de datos en un traductor.

Las principales estructuras de datos que se necesitan en el proceso de traduccin y que sirven para comunicarse entre las fases: o los componentes lxicos: estructura tipo registro con dos came pos: el tipo de componente lxico que se representa por un e tipo enumerado y el lexema como una cadena de caracteres. Una variable global: el s mbolo de preanlisis. a el rbol sintctico: se genera de forma dinmica como una a a a estructura estndar basada en punteros conforme se avanza a

22

TEMA 1. INTRODUCCION AL PROCESO DE TRADUCCION

en el proceso de anlisis sintctico. Cada nodo es un registro a a con informacin obtenida por el analizador lxico (lexema), o e sintctico (tipo) y semntico (por ej. valor de una expresin, a a o tipo de una expresin). Esta informacin depende del tipo o o de construccin del lenguaje que ese nodo represente. o la Tabla de Smbolos: contiene informacin sobre los identi o cadores, funciones, variables, mbito de referencia de idena ticadores, constantes numricas y literales, tipos de datos, e o incluso la direccin de memoria. Importante que las opo eraciones de insercin, bsqueda y eliminacin sean de coste o u o casi constante: tabla Hash. el cdigo intermedio: se implementa como una lista de rego istros, donde cada registro tiene cuatro campos (operador, la direccin de los operandos y del resultado). Es eciente para o mover cdigo para el proceso de optimizacin posterior. Se o o puede usar tambin un chero texto. e

1.7. MIL LENGUAJES Y MIL MAQUINAS, UN MILLON DE TRADUCTORES.23

1.7.

Mil lenguajes y mil mquinas, un milln a o de traductores.

Cmo podemos facilitar la transportabilidad de compiladores: o varios lenguajes fuente y varias mquinas objeto? Solucin: Dia o visin de las operaciones a realizar en dos tipos: o front-end o etapa inicial: operaciones que dependen slo del o lenguaje fuente. Incluye: anlisis lxico, sintctico y semntia e a a co, la creacin de la Tabla de S o mbolos, generacin de cdigo o o intermedio y algunas optimizaciones. Adems, del manejo de a errores de cada fase. back-end o etapa nal: operaciones que dependen slo de la o mquina objeto. Incluye: generacin de cdigo objeto y opa o o timizaciones dependientes de la mquina. Depende de los a modos de direccionamiento, conjunto de instrucciones de la mquina, nmero de registros, arquitectura de la mquina, a u a sistema operativo, . . . . La representacin intermedia acta como medio de comunicacin o u o entre ellas. Ejemplos de cdigo intermedio son: Cdigo de 3o o direcciones (tenemos un operando, las dos direcciones de los dos argumentos y la direccin donde se almacena el resultado) y Cdio o go a pila (para una mquina abstracta con un conjunto de ina strucciones y de registros y modos de direccionamiento, p-code.
(N. Wirth, distribuy a todas las universidades, el front-end de Pascal escrito en o p-code para una mquina virtual basada en pila, y esto fue lo que potenci su gran a o expansin inicial en entornos educacionales, ya que slo era necesario construir el o o back-end para la mquina con la que se trabajaba). a
Cdigo Fuente Cdigo Front-end Intermedio Back-end Cdigo Objeto

Si se cambia de lenguaje fuente, entonces se reescribe el front-end. Si se cambia la mquina objeto, entonces se reescribe el backa end. Si aparece una nueva arquitectura, basta con desarrollar un traductor del lenguaje intermedio a esa nueva mquina. a

24

TEMA 1. INTRODUCCION AL PROCESO DE TRADUCCION

Por ejemplo, la expresin (A+B)*(C+D): o


Cdigo de 3-direcciones o (+, A, B, t1) (+, C, D, t2) (*, t1, t2, t3) suma A y B, coloca el resultado en t1 suma C y D, coloca el resultado en t2 multiplica t1 y t2, y coloca el resultado en t3

Cdigo a pila o LOAD A ADD B STO t1 LOAD C ADD D STO t2 LOAD t1 MUL t2 STO t3 carga el contenido de A en el acumulador aade el contenido de B al del acumulador n almacena el contenido del acumulador en la var. temporal t1 carga el contenido de C en el acumulador aade el contenido de D al del acumulador n almacena el contenido del acumulador en la var. temporal t2 carga el contenido de t1 en el acumulador multiplica el contenido de t2 por el del acumulador almacena el contenido del acumulador en la var. temporal t3

Supongamos n lenguajes fuente y m mquinas objeto. a


Front -End Cdigo fuente Lenguaje 1 Cdigo fuente Lenguaje 2 Back-End Cdigo objeto Mquina 1 Cdigo objeto Mquina 2 Cdigo Intermedio

Cdigo fuente Lenguaje n

Cdigo objeto Mquina m

Necesitamos hacer n + m programas en vez de n m.

1.7. MIL LENGUAJES Y MIL MAQUINAS, UN MILLON DE TRADUCTORES.25


Java C C++ Pascal 4x2=8 programas Sparc Java C C++ Pascal 4+2=6 programas Sparc Cdigo Intermedio Pentium

Pentium

1.7.1.

Compiladores cruzados

Denimos los diagramas en T. Un compilador escrito en lenguaje H que traduce el lenguaje fuente S al lenguaje objeto T se representa:
S H T

H: lenguaje en el que est escrito el compilador (host lana guage), es el lenguaje de la mquina sobre la que se ejecuta. a S: el lenguaje fuente (source language). T: lenguaje objeto (target language). Un compilador es cruzado si H es distinto de T (genera cdigo o para una mquina diferente en la que se est ejecutando). a a Escenario 1: tenemos dos compiladores que corren sobre la misma mquina; el primero traduce el lenguaje A al a lenguaje B; el segundo traduce el lenguaje B al lenguaje C. Si los combinamos, obtenemos un compilador que traduce el lenguaje A al lenguaje C.
A H B B H C A H C

26

TEMA 1. INTRODUCCION AL PROCESO DE TRADUCCION

Escenario 2: tenemos un compilador del lenguaje B que corre sobre la mquina H (est escrito en el lenguaje a a mquina H y genera cdigo para H). Queremos un coma o pilador del lenguaje A que corra bajo H.
A B H B H H A H H

Aumentamos el nmero de lenguajes fuente para esa u mquina. a Escenario 3: tenemos un traductor del lenguaje A al lenguaje B que est escrito en H, buscamos un traductor a de A a B que est escrito en K. e
A H B H M K A K B

Aumentamos el nmero de mquinas donde se puede u a ejecutar el traductor. 1.7.2. Bootstraping

Se escribe el compilador en el mismo lenguaje fuente, lenguaje A, que se quiere compilar. Cmo? Parece un problema circular. o (Bootstraping=arranque). El proceso es como sigue: se dene un subconjunto muy reducido de A que llamaremos A(1), y para A(1) se construye un compilador a mano en el lenguaje H, que es el que soporta la mquina. a Dado el compilador de A(1) se dene una ampliacin del lenguaje o A(1), que llamaremos A(2), y se construye un compilador escrito en el lenguaje A(1). El proceso se repite n veces hasta obtener un un compilador del lenguaje A (A=A(n)) que se ha escrito en el propio lenguaje que se queria compilar, lenguaje A.

1.7. MIL LENGUAJES Y MIL MAQUINAS, UN MILLON DE TRADUCTORES.27


A(2) A(1)

H
A(1)

A(2)

H H

H H

A(3) A(2)

H
A(2)

A(3)

H H

H H

A(n)
A(n-1)

H
A(n-1)

A(n)

H H

H H

Cmo portar un compilador escrito en su propio lenguaje en o una mquina H a otra mquina K? Slo es necesario cambiar el a a o
1 paso: A A K A H 2 paso: A A K A H K A K K H A H K

back-end. Se hace en dos pasos: primero retargeting: modicar el compilador para producir cdigo objeto para la nueva mquina. o a segundo rehosting: modicar el compilador para correr en la nueva mquina. a

28

TEMA 1. INTRODUCCION AL PROCESO DE TRADUCCION

1.8.

Herramientas de ayuda a la traduccin. o

Herramientas especializadas para implantar los mdulos de un o traductor. Programas de ayuda en el proceso de escritura de compiladores: sistemas generadores de traductores. Se les llama compiler writing tools, compiler generators, compiler-compilers. Generadores de analizadores lxicos: a partir de una especie cacin basada en expresiones regulares. Generan un AFD. o Veremos: Lex/Flex. Generadores de analizadores sintcticos: a partir de una ena trada que es la gramtica independiente del contexto que a representa la estructura sintctica del lenguaje. Veremos: a Yacc/Bison. Generadores de cdigo: con rutinas para la generacin del o o rbol de anlisis sintctico y para su recorrido. En cada noa a a do se especican las acciones para su traduccin a cdigol o o correspondiente cdigo objeto. o Dispositivos para el anlisis de ujo de datos y de control: a analizan la forma en que se transmiten los valores de un bloque a otro del programa, utiles en la optimizacin, predic o cin de ramicaciones, eliminacin de cdigo muerto, elimio o o nacin de redundancias, etc. o Incluyen la generacin de la Tabla de S o mbolos e incluso paquetes para la reparacin de errores. o

1.9. APLICACIONES DE LOS SISTEMAS DE TRADUCCION.

29

1.9.

Aplicaciones de los sistemas de traduccin. o

Se basan en los mismos conceptos tericos y tcnicas que en el o e diseo de traductores: n Procesadores y formateadores de texto: entrada cadena de caracteres que incluye el texto a componer y rdenes para o indicar cap tulos, secciones, prrafos, enumeraciones, guras, a frmulas, tablas, ... (Latex, Html, ...). o Editores de texto: emacs (bsquedas y sustituciones de pau trones de texto). Intrpretes de consulta: traduce un predicado con operadores e relacionales y booleanos a rdenes para buscar en una base o de datos los registros que cumplan esos predicados. Reconocedores y conversores de formatos de cheros: por ejemplo en UNIX ntro, tro, eqn (para denir ecuaciones), pic (para dibujar) o tbl (para formatear tablas) Traduccin de programas: programas escritos en lenguajes o obsoletos a lenguajes ms modernos, o simplemente de un a lenguaje a otro (Pascal a C, PHP a ASP,...). Tratamiento de cheros con informacin estructurada: auge o de XML. Intrpretes de comandos de sistemas operativos: e Sistemas de impresin y de dibujo de guras: o Procesamiento del lenguaje natural: Reconocimiento de patrones en Visin por Computador: o Creaccin de circuitos VLSI, un silicon compiler, debe forzar o las reglas de diseo que dictan la feasibilidad de un circuito n dado.

30

TEMA 1. INTRODUCCION AL PROCESO DE TRADUCCION

1.10.

Relacin con otras reas. o a

Estructura de los Computadores I, II: la representacin de o los tipos bsicos, el lenguaje ensamblador son claves para a entender la gestin de la memoria en entornos de ejecuo cin estticos y dinmicos o la generacin y optimizacin o a a o o de cdigo, que se trata de aprovechar las caracter o sticas de la mquina: la eleccin de registros, los modos de direca o cionamiento, la memoria cach y el uso de instrucciones ese peciales. Algoritmos y Estructuras de Datos: para implementar las estructuras bsicas: la tabla de s a mbolos, el rbol de anlisis a a sintctico y la generacin de cdigo intermedio. Los conocimiena o o tos sobre la implementacin de tablas Hash, la construccin y o o mtodos de recorrido de rboles, as como las listas enlazadas e a son imprescindibles.

Fundamentos de la Programacin y Metodolog de la Programaci o a o es necesario facilidad en alguno de los lenguajes de programacin, un lenguaje imperativo u orientado a objetos (noro malmente C/C++). Los algoritmos de anlisis sintctico y a a de generacin de cdigo suponen un cierto grado de compleo o jidad debido a su naturaleza recursiva. Teor de Autmatas y Lenguajes Formales: Establece los a o fundamentos tericos en los que se basan las tcnicas de o e anlisis de lxico y sintctico: la construccin de expresiones a e a o regulares a partir de una determinada especicacin y de los o AFD para su reconocimiento, especicacin de autmatas o o mediante diagramas y tablas de estado, la conversin de o autmatas no-deterministas a deterministas, la minimizacin o o del nmero de estados, las gramticas independientes del u a contexto y los autmatas a pila para su reconocimiento, o la notacin Backus-Naur-Form y su versin extendida, los o o diagramas sintcticos para la denicin de una gramtica, a o a las gramticas limpias y bien formadas, los tipos de derivaa ciones de una sentencia, el problema de la ambigedad en las u

1.10. RELACION CON OTRAS AREAS.

31

gramticas... a Lenguajes de Programacin: La complejidad del lenguaje deo termina la complejidad del traductor y de este modo las herramientas a utilizar para su construccin. El conjunto de o palabras reservadas, su estructura sintctica, la vericacin a o de tipos, el uso de recursividad, el anidamiento en las funciones, los mtodos de paso de parmetros, los mtodos de e a e direccionamiento, las estrategias para la asignacin de memoo ria desde los entornos completamente estticos sin memoria a dinmica ni recursividad hasta los completamente dinmicos a a que requieren complejos algoritmos para gestionar la memoria y donde el compilador debe generar cdigo para ello, las o estructuras de datos permitidas, las formas de llamadas a las funciones y los valores de retorno. Por otro lado, la representacin de los tipos, la forma en que la Tabla de S o mbolos es mantenida, las reglas usadas para la vericacin e inferencia o de tipos dependen de las expresiones y constructores de tipos del lenguaje. De igual modo, las limitaciones de las tcnicas e actuales de traduccin restringe en gran medida la sintaxis o de las construcciones de los lenguajes de programacin, de o modo que esta interaccin es en doble sentido. o Inteligencia Articial e Ingenier del Conocimiento: Si bia en en el procesamiento del lenguaje natural se utilizan mtoe dos de anlisis sintctico no-deterministas, los conceptos y a a tcnicas relacionados con la especicacin y reconocimiento e o lxico de un lenguaje, de su sintaxis y el anlisis semntie a a co asociado a las construcciones del lenguaje son un comn u denominador en el procesamiento de cualquier lenguaje. Ingenier del Software I: El diseo y construccin de un traa n o ductor suele ser en general un proyecto de nivel intermedio o alto en cuanto a complejidad, por tanto un buen conocimiento sobre los aspectos relacionados con el diseo lgico y f n o sico de sistemas y su impacto en la abilidad, eciencia, utilidad y mantenimiento son importantes.

32

TEMA 1. INTRODUCCION AL PROCESO DE TRADUCCION

Visin por Computador: Por un lado, en la descripcin de los o o contornos se hace uso de cadenas que explotan las relaciones estructurales que existen entre los elementos de un contorno y por otro lado los conceptos y tcnicas de anlisis sintctico e a a se pueden aplicar en el problema del reconocimiento de patrones, incluso se utilizan reglas semnticas para especicar a las relaciones de conectividad entre primitivas. Adems, no a se puede olvidar, el enfoque estructural en la clasicacin de o texturas, basado en la analog entre las relaciones espaciales a de las primitivas de la textura y la estructura de un lenguaje formal.

1 Curso

Estructura Comput.I Estructura Comput. II


2 Curso

Fundam. Program. Alg. y Estruc. Datos Tecnolog. Program. Metodolog. Program.

Teo. Autom. Leng. Formales


3 Curso

Lenguajes de Program.

Ing. Software I
4 Curso

Procesadores Lenguaje

Inteligencia Artificial

Visin por Computador


5 Curso

Compiladores

Proyect. Sist. Inform.

Figura 1.1: Relaciones de la asignatura de Procesadores de Lenguaje

1.11. EJERCICIOS:

33

1.11.

Ejercicios:

1. (0.2 ptos) Discutir cmo el proceso de anlisis que realizan pequeos o a n sistemas se parece al proceso de traduccin. Por ejemplo: o una pequea calculadora que opera con enteros y reales. n un script que busca los cheros con una determinada extensin. o un servidor de correo electrnico que analiza los campos de la cabecera o del correo. o culo cient co: un 2. (0.2 ptos) Considerese la siguiente denicin de un art art culo se compone de una cabecera, un texto y una lista no vac de a referencias bibliogrcas. La cabecera se compone de un t a tulo, nombre de uno o ms autores y un resumen opcional. Un texto se compone de a prrafos. Usando la notacin t: t a o tulo, a: autor, r: resumen, p: prrafo, a b: referencia bibliogrca, obtener una gramtica que reconozca una a a coleccin de art o culos. 3. (0.2 ptos) Las cadenas de ADN de los cromosomas estn formadas por a cuatro tipos de bases: A adenina, C citosina, G guanina, y T tinina. En todas las especies se cumple que la cantidad de A es igual a la cantidad de T y que la cantidad de G es siempre igual a la cantidad de C. El ADN es una larga doble hilera de bases, de manera que, entre una hilera y otra las bases se aparean siempre siguiendo las reglas: A siempre con T, G siempre con C. En el caso que nos piden, adems, se debe cumplir que a las parejas de bases estn alternadas, es decir, las parejas AT y TA slo a o pueden ir entre las parejas del tipo CG y GC y viceversa. Por ejemplo: C G T A G C T A G C

4. (0.2 ptos) Suponer que se tiene un traductor de Pascal a C escrito en C y un compilador de C sobre una determinada mquina. Se pide usar a los diagramas en T para describir los pasos necesarios para crear un compilador de Pascal que funcione sobre dicha mquina. a 5. (0.2 ptos) Suponer que se tiene un compilador de C sobre una determinada mquina. Qu podr a e amos hacer para tener un compilador de C++ sobre esa mquina? a

34

TEMA 1. INTRODUCCION AL PROCESO DE TRADUCCION

6. (0.2 ptos) Supongamos que de una imagen, una vez que ha sido procesada, extraemos del contorno de cada objeto una serie de segmentos de igual longitud orientados en determinadas direcciones (las primitivas). Disear una gramtica que permita reconocer si el objeto se trata de un n a cuadrado, de un tringulo o de un rectngulo. Qu acciones semnticas a a e a se pueden aadir para obtener el per n metro del objeto?
Primitivas

Objetos

Cuadrado

Tringulo

Rectngulo

7. (0.3 ptos) Supongamos la siguiente gramtica para generar un pequeo a n programa con declaraciones e instrucciones : Programa DeclVar Tipo ListaInstr Expresion DeclVar ListaInstr var id : Tipo ; DeclVar | integer | real id = Expresion ; ListaInstr | id | num | Expresion + Expresion | Expresion * Expresion

var tiempo : integer; var desplazamiento : real; var velocidad : real; tiempo=10; desplazamiento=20*2+5.5; velocidad = tiempo * desplazamiento;

Determinar los componentes lxicos. e Obtener el rbol sintctico para ese programa. a a Comentar las acciones semnticas necesarias para vericar que el a cdigo es correcto: comprobaciones de tipos, inferencia de tipos en o expresiones, declaracin antes de uso, correcto uso de operadores,... o Indicar qu informacin se podr guardar en cada nodo del rbol. e o a a Comentar el contenido de la tabla de s mbolos: identicadores y sus atributos (nombre, tipo, mbito de referencia). a Generar el cdigo intermedio de 3-direcciones y las posibles opo timizaciones que se podr hacer: clculo previo de constantes, an a propagacin de copias,... o

También podría gustarte