You are on page 1of 13

CAPTULO I: INTRODUCCIN A LOS COMPILADORES 1.1.

INTRODUCCIN En un mundo informatizado como en el que vivimos, en el que cada da que pasa dependemos ms y ms de un sistema informtico eficiente, el cual debe estar preparado para brindarnos la ms alta calidad de servicios y prestaciones. Adems de ser sencillo en su manejo y sobre todo confiable, siendo estas caractersticas indispensables para el usuario final. Quien no se fija, ni pregunta cmo se realiza determinada tarea, pero si es buen critico a la hora de ver resultados, pero hay otros que contrarios a estos, se hace la pregunta del milln, "Cmo se logra hacer tal y tal cosa? ,"Cmo es posible que un graficado trabaje tan rpido?, Cmo es posible que un procesador de palabra a la hora de usar un diccionario sea tan eficiente?, Cmo es posible llevar los resultados de una aplicacin a otra?, o Cmo es posible que un programa que fue creado por una empresa puede trabajar con los datos de obtenidos de otro programa, hecho por otra empresa?.M u c h a s p u e d e n s e r l a s respuestas, algunos argumentaran que es el sistema operativo, otros dirn que son las normas y estndares establecidos, otros dirn irnicamente que es ms sencillo de lo que se piensa, dirn que se hace clac con la rata aqu, se arrastra y se lleva a donde se quiere. Todos ellos tienen razn, sin embargo si indagamos ms a fondo. Surgirn preguntas ms directas como por ejemplo "Cmo se logra tal velocidad, con tan buen manejo de grfico?", claro q u e a t o d a s e l l a s s e p u e d e responder diciendo, que todo se logra gracias al Hardware, y no estaramos totalmente errados, porque un buen Hardware con lleva un buen resultado, a una buena calidad de impresin en caso de volcado al papel, una buena imagen si hablamos de grficos, o un buen tiempo de respuesta a la hora de realizar algn clculo matemtico, pero siempre el Hardware ser una parte, solo una parte. Es en este punto donde surge el Software, los programas, o como el modismo denota hoy en da, las aplicaciones. Es decir que para obtener un buen resultado no solo hace falta un buen Hardware acorde a los requerimientos de la tarea que se quiere realizar, sino que calidad, eficiencia, velocidad, y confiabilidad hoy en da son sinnimos de un buen trabajo en conjunto de la dupla Hardware y Software. Dejando de lado lo que es el Hardware, y profundizando lo que representa su par, Palabra ya adoptada en nuestro idioma, y muy u s a d a e n e l m u n d o d e l a informtica, deducimos que

para obtener un buen software, ante todo esta el aspecto creador de quien lo realiza, luego hay que ver cul ser el entorno de trabajo en que actuara, cules sern los requerimientos del mismo, hay que saber elegir que paradigma de programacin se usar. Despus de formuladas estas preguntas y de haber respondido a las mismas de m a n e r a a p r o p i a d a . Hay que elegir cul es el lenguaje de programacin ms conveniente para realizar dicha tarea. Un lenguaje de programacin o ms genricamente de computacin, es el medio p o r e l c u a l e l hombre interacta con un ordenador. Pero el l e n g u a j e d e computacin no es lo nico que se necesita para que se produzca la comunicacin, hace falta otro componente importante para completar el medio de comunicacin, y e s e n este punto donde surge la palabra "interprete", cuya d e f i n i c i n d i c e persona que explica a otra en lengua que entienda" en el mbito informtico, o l v i d m o n o s p o r u n instante de la palabra persona, e "interpretemos" s u significado. Se puede decir entonces que a travs de un intrprete podramos pedir a un ordenador que realice una tarea determinada sin preocuparnos de los detalles. Claro que este interprete no es ms que una aplicacin (programa), que realiza la traduccin de lo que pedimos que comunique a un ordenador, por lo tanto un i n t r p r e t e e s c a p a z d e c o n o c e r d o s l e n g u a j e s e l d e l e m i s o r y e l d e l r e c e p t o r . En el mundo de la informtica existen muchos lenguajes de programacin, que trabajan con uno o varios paradigmas de programacin (estilos, formas, mtodos d e p r o g r a m a c i n ) , p o r l o t a n t o e s d e s u p o n er q u e e x i s t e n d i s t i n t a s r eg l a s d e s i n t a x i s y s e m n t i c a p a r a c a d a l en g u a j e d e p r o g r a m a c i n c o m o l o e x i s t e e n cualquier otro lenguaje, sea cualquiera el tipo y contexto al que pertenezca. En tiempos ya muy remotos segn cuentan los que saben proliferaban los intrpretes, quienes tomaban la peticin del usuario (hombre) e "interpretaban" la misma y sela comunicaban al ordenador quien la ejecutaba, y esperaba una nueva peticin. La peticin era declarada dentro los parmetros de definicin del lenguaje usado. Con el tiempo se vio que el estar realizando una interpretacin y traduccin cada vez que se necesita realizar algo era poco efectivo, en cuanto a tiempo de trabajo del Hardware se refiere, y ms aun si se trataba de u n c o n j u n t o g r a n d e d e instrucciones (peticiones), es aqu donde entraron en juego los compiladores, q u i e n a l igual que sus antecesores realizan una traduccin de los programas

(Conjunto de intrusiones de un lenguaje) revisando que este dentro del marco de definicin del lenguaje de programacin utilizado. Con la diferencia que la traduccin se realiza una sola vez y de todo el programa. Despus de todos estos tpicos previos, podemos decir que la calidad de un buen software es producto de un lenguaje de computacin verstil, flexible y veloz, todo sinnimo de buen compilador, claro sin dejar de lado la capacidad creadora del programador (usuario, nosotros)."Cmo funciona un compilador? ", es la pregunta de todo aquel que se hace llamar programador, a grandes rasgos un compilador toma un programa escrito en un lenguaje de programacin con una gramtica, sintaxis y semntica definida, revisa que este dentro de las pautas de definicin del lenguaje, y lo traduce en p r o g r a m a d e s a l i d a escrito en lenguaje binario, el cual es entendido por el o r d e n a d o r y p o r l o t a n t o p u e d e s er e j e c u t a d o p o r e l m i s m o ( r e c o r d a r q u e u n intrprete a diferencia de un compilador no traduce todo el programa sino que va realizando la traduccin e interpretacin de la misma paso a paso, sin crear ningn programa de salida ejecutable). Las partes del proceso de compilacin se dividen en dos: una llamada fase de Anlisis y otra llamada fase de Sintaxis, las cuales i n t e r a c t a n e n t r e s para la creacin de la tabla de smbolos y el control d e l m a n e j a d o r d e er r o r e s , d e n t r o d e l a n l i s i s h a y t r e s e t a p a s l l a m a d a s a n l i s i s lexicogrfico, anlisis sintctico, anlisis semntico. Dentro de la fase de Sntesis existen las etapas de generacin de cdigo intermedio, optimizacin de cdigo intermedio, y generacin de cdigo. Al tener que describir cmo funciona un compilador tenemos que tener en claro en no confundir los trminos compilador y compilacin, se debe entender que al decir compilador nos referimos al programa, y al decir compilacin al proceso en s. En esencia ambos trminos cumplen con la definicin ms simple de un compiladores decir, sea el programa compilador o el proceso de compilacin, ambos reciben como entrada un cdigo escrito en algn lenguaje y producen como salida otro cdigo escrito en otro lenguaje. 1.2. HISTORIA En 1946 se desarroll el primer ordenador digital. En un principio, estas mquinas ejecutaban instrucciones que consistan en cdigos numricos que sealan a los circuitos de la mquina los estados correspondientes a cada operacin. Pronto los primeros usuarios de estos ordenadores descubrieron la ventaja de escribir sus programas mediante claves ms fciles de recordar que esos

cdigos numricos; al final, todas esas claves juntas se traducan manualmente a Lenguaje Mquina. E s t a s c l a v e s constituyen los llamados lenguajes ensambladores, q u e s e generalizaron en cuanto se dio el paso decisivo de hacer que las propias mquinas r e a l i z a r a n e l p r o c e s o m e c n i c o d e l a t r a d u c c i n . A e s t e t r a b a j o s e l e l l a m a ensamblar el programa. Las instrucciones de los lenguajes ensambladores obligan a programar cualquier f u n c i n d e u n a m a n e r a minuciosa e iterativa. A pesar de ello, el lenguaje ensamblador segua siendo el de una mquina, pero ms fcil de manejar. Los trabajos de investigacin se orientaron entonces hacia la creacin de un lenguaje que expresara las distintas acciones a realizar de una manera lo ms sencilla posible para el hombre. As, en 1950, desarrollaron el FORTRAN con el cual surgi as por primera vez el concepto de un traductor (como un programa que traduca un lenguaje a otro lenguaje). En el caso particular de que el lenguaje a traducir es un lenguaje de alto nivel y el lenguaje traducido de bajo nivel, se emplea el trmino compilador. Inicio del Compilador La tarea de realizar un compilador no fue fcil. El p r i m e r c o m p i l a d o r d e FORTRAN tard 18 aos en realizarse y era muy sencillo. El FORTRAN estaba muy influenciado por la mquina objeto en la que iba a ser implementado. Como u n e j e m p l o d e e l l o t en e m o s e l h e c h o d e q u e l o s e s p a c i o s e n b l a n c o f u e s e n ignorados, debido a que el perifrico que se utilizaba como entrada de programas (una lectora de ttarjetas perforadas) no contaba correctamente los espacios en blanco. Paralelamente al desarrollo de FORTRAN en Amrica, en Europasurgi una corriente ms universitaria, que pretenda que la definicin de un lenguaje fuese Independiente de la mquina y en donde los algoritmos se pudieran expresar de forma ms simple. Esta corriente estuvo muy influida por los trabajos sobre gramticas de contexto libre publicados por Chomsky. Con estas ideas surgi un grupo europeo los cuales pidieron colaboracin a la asociacin americana y se form un comit el cualde sarroll el lenguaje llamado ALGOL 58. En 1969, el lenguaje fue revisado y llev a una nueva versin que se llam ALGOL 60 y posteriormente ALGOL 68. Avances en Compilacin Junto a este desarrollo en los lenguajes (ALGOL), tambin se iba avanzando en la tcnica de compilacin. En 1958 proponan una solucin al problema de que un compilador fuera utilizable por

varias mquinas objeto. Para ello, se divida por primera vez el compilador en dos fases, designadas como el "frente end" y el "back end". La primera fase (front end) es la encargada de analizar el programa fuente y la segunda fase (back end) es la encargada de generar cdigo para la mquina objeto. El puente de unin entre las dos fases era un lenguaje intermedio que se design con el nombre de UNCOL (Universal Computer Oriented Language).Para que un compilador fuera utilizable por varias mquinas bastaba nicamente modificar su back end. Aunque se hicieron varios intentos para definir el UNCOL, el pproyectos ha quedado simplemente en un ejercicio terico. De todas formas, la divisin de un compilador en front end y back end fue un adelanto importante. Bases de las Tareas en un Compilador En los aos 1958 y 1959 se van poniendo las bases para la divisin de tareas en un compilador. As, en 1959 se propone el empleo de autmatas deterministas y no deterministas para el reconocimiento lexicogrfico de los lenguajes. Rpidamente se aprecia que la construccin de analizadores lxicos a partir de expresiones regulares es muy til en la implementacin de los compiladores. En 1975 surge el c o n c e p t o d e u n g e n e r a d o r a u t o m t i c o d e a n a l i z a d o r e s l x i c o s a p a r t i r d e expresiones regulares, basado en el sistema operativo UNIX.A partir de los trabajos de Chomsky ya citados, se produce una sistematizacin de la sintaxis de los lenguajes de programacin, y con ello un desarrollo de diversos mtodos de anlisis sintctico. Con la aparicin de la notacin BNF, se tiene una gua para el desarrollo del anlisis sintctico. 1959: Se describe un mtodo de parsing de F O R T R A N q u e i n t r o d u c a parntesis adicionales alrededor de los operadnos para ser capaz de analizar las expresiones. 1960: Se desarrollan los diversos mtodos de p a r s e r s a s c e n d e n t e s y descendentes 1961: Se realiza el uso por primera vez de un parsing descendente recursivo. 1965: Se define las gramticas LR y describe la construccin de una tabla cannica de parser LR.

1968: Se estudian y definen las gramticas LL a s c o m o l o s p a r s e r s predictivos. 1 9 7 0 : S e d e s c r i b e n l o s m t o d o s S L R y L A L R d e p a r s er L R . D eb i d o a s u sencillez y a su capacidad de anlisis para una gran variedad de lenguajes, la tcnica de parsing LR va a ser la elegida para los generadores automticos de parsers. 1975: Se crea el generador de analizadores sintcticos YACC para funcionar b a j o u n e n t o r n o U N I X . J u n t o a l a n l i s i s s i n t c t i c o , t a m b i n s e f u e desarrollando el anlisis semntico. En los primeros lenguajes (FORTRAN y ALGOL 60) los tipos posibles de los datose r a n m u y s i m p l e s , y l a c o m p r o b a c i n d e t i p o s e r a m u y s e n c i l l a . N o s e permita la correccin de tipos, pues sta era una cuestin difcil. Con la aparicin del ALGOL 68 se permita que las expresiones de tipo fueran construidas sistemticamente. Ms tarde, de ah surgi la equivalencia de tipos por nombre y estructural. Tambin se desarrollaron estrategias para mejorar las rutinas de entrada y de salida de un procedimiento . As mismo, y ya desde los aos 60, se estudi el paso de parmetros a un procedimiento por nombre, valor variable. Optimizacin en la Compilacin La tcnica de la optimizacin apareci desde el desarrollo del primer compilador de FORTRAN. Backus comenta cmo durante el desarrollo del FORTRAN setena el miedo de que el programa resultante de la compilacin fuera ms lento Que si se hubiera escrito a mano. Para evitar esto, se i n t r o d u j er o n a l g u n a s o p t i m i z a c i o n e s e n e l c l c u l o d e los ndices dentro de un bucle. Pronto se sistematizan y se recoge la divisin de optimizaciones i n d e p e n d i e n t e s d e l a mquina y dependientes de la mquina. Entre las primeras estn la propagacin de valores, el arreglo de expresiones, la eliminacin de redundancias, etc. Entre las segundas se podra encontrar la localizacin de registros, el uso de instrucciones propias de la mquina y el reordenamiento de cdigo. A partir de 1970 comienza el estudio sistemtico de las tcnicas del anlisis reflujo de datos. Su repercusin ha sido enorme en las tcnicas de optimizacin global de un programa. Compilacin en la Actualidad

En la actualidad, el proceso de la compilacin ya e s t m u y a s e n t a d o . U n compilador es una herramienta bien conocida, dividida en diversas fases. Algunas de estas fases se pueden generar automticamente (analizador lxico y sintctico) y otras requieren una mayor atencin por parte del escritor de compiladores (las partes de traduccin y generacin de cdigo).De todas formas, y en contra de lo que quiz pueda pensarse, todava se estn l l e v a n d o a c a b o v a r i a s v a s d e i n v e s t i g a c i n e n e s t e f a s c i n a n t e c a m p o d e l a compilacin: Por una parte, se estn mejorando las diversas herramientas disponibles (por e j e m p l o , e l g e n e r a d o r d e a n a l i z a d o r e s l x i c o s A a r d v a r k p a r a e l l e n g u a j e PASCAL). Tambin la aparicin de nuevas generaciones de lenguajes -ya se habla de la q u i n t a g e n e r a c i n , c o m o d e u n l e n g u a j e c e r c a n o a l d e l o s h u m a n o s - h a provocado la revisin y optimizacin de cada una de las fases del compilador. El ltimo lenguaje de programacin de amplia aceptacin que se ha diseado, el lenguaje Java, establece que el compilador no genera cdigo para una mquina d e t e r m i n a d a s i n o p a r a u n a v i r t u a l , l a J a v a V i r t u a l M a c h i n e ( J V M ) , q u e posteriormente ser ejecutado por un intrprete, normalmente incluido en un navegador de Internet. El gran objetivo de esta exigencia es conseguir la mxima portabilidad de los programas escritos y compilados en Java, pues es nicamente La segunda fase del proceso la que depende de la mquina concreta en la que se ejecuta el intrprete.

Grfico N 1: Historia de la compilacin1.3.

CONCEPTOS BSICOS Traductor .Cualquier programa que toma como entrada un texto escrito en un lenguaje llamado fuente y da como salida un programa equivalente en otro lenguaje, el lenguaje objeto. Si el lenguaje fuente de un lenguaje de programacin de alto nivel y el objeto un lenguaje de bajo nivel (ensamblador o cdigo de mquina), al traductor se le denomina Compilador Ensamblador. Es un programa traductor cuyo lenguaje fuente es el lenguaje ensamblador.

Intrprete.

Es un programa que no genera un programa equivalente, sino que toma una sentencia del programa fuente en un lenguaje de alto nivel y la traduce al cdigo equivalente y al mismo tiempo lo ejecuta. E n u n p r i n c i p i o d e b i d o a l a e s c a s e z d e m e m o r i a s e u t i l i z a b a n m s l o s intrpretes, ahora se usan ms los compiladores (a excepcin de JAVA) 1.4. CONCEPTO DE COMPILADOR En el caso de que el lenguaje fuente sea un lenguaje de programacin de alto nivel y el objeto sea un lenguaje de bajo nivel (ensamblador o cdigo de mquina), a dicho traductor se le denomina compilador. Un ensamblador es un compilador cuyo lenguaje fuente es el lenguaje ensamblador. Histricamente, con la escasez de memoria de los primeros ordenadores, se puso de moda el uso de intrpretes frente a los compiladores, pues el programa fuente sin traducir y el intrprete juntos daban una ocupacin de memoria menor que la resultante de los compiladores. Por ello los primeros ordenadores personales iban siempre acompaados de un intrprete de BASIC (Spectrum, Commodore VIC-20, PC XT de IBM, etc.).La mejor informacin sobre los errores por parte del compilador as como una mayor velocidad de ejecucin del cdigo resultante hizo que poco a poco se i m p u s i er a n l o s c o m p i l a d o r e s . H o y e n d a , y con el problema de la memoria p r c t i c a m e n t e resuelto, se puede hablar de un gran p r e d o m i n i o d e l o s compiladores frente a los intrpretes, aunque intrpretes como los incluidos en los n a v e g a d o r e s d e Internet para interpretar el cdigo JVM de Java son la g r a n excepcin. La razn principal para querer usar un compilador es querer traducir un p r o g r a m a d e u n l e n g u a j e d e a l t o n i v e l , a o t r o l e n g u a j e d e n i v e l i n f e r i o r (tpicamente lenguaje mquina). De esta manera un programador puede disear un programa en un lenguaje mucho ms cercano a cmo piensa un ser humano, para luego compilarlo a un programa ms manejable por una computadora.

INTERPRETAR VS COMPILAR Hay dos maneras de ejecutar un programa escrito en un lenguaje de alto nivel

Compilacin: Traducir todo el programa a otro programa equivalente e n cdigo mquina. Entonces se ejecuta el programa obtenido Interpretacin: Interpretar las instrucciones del programa escrito en lenguaje de alto nivel y ejecutarla una por una. Ventajas de compilar frente a interpretar: Se compila una vez, se ejecuta n veces. En bucles, la compilacin genera cdigo equivalente a l b u c l e , p e r o interpretndolo se traduce tantas veces una lnea como veces se repite el bucle. El compilador tiene una visin global del programa, por lo que la informacin de mensajes de error es ms detallada. Ventajas del intrprete frente al compilador: Un intrprete necesita menos memoria que un compilador. En principio eran ms abundantes dado que los ordenadores tenan poca memoria. Permiten una mayor interactividad con el cdigo en tiempo de desarrollo. Un compilador no es un programa que funciona de m a n e r a a i s l a d a , s i n o q u e necesita de otros programas para conseguir su objetivo: obtener un programa ejecutable a partir de un programa fuente en un lenguaje de alto nivel. Algunos deseos programas son el preprocesador, el linker, el depurador y el ensamblador. Programa fuente Compilador Programa objeto Mensaje de error El preprocesador Se ocupa (dependiendo del lenguaje) de incluir ficheros, expandir macros, eliminar comentarios, y otras tareas similares. El linker (Enlazador) Se encarga de construir el fichero ejecutable aadiendo al fichero objeto generado por el compilador las cabeceras necesarias y las funciones de librera utilizadas por el programa fuente. El depurador

P e r m i t e , s i e l c o m p i l a d o r h a g e n er a d o a d e c u a d a m e n t e e l programa objeto, seguir paso a paso la ejecucin de un programa. Finalmente, Muchos compiladores, en vez de generar cdigo objeto, generan un programa e n l e n g u a j e en s a m b l a d o r q u e d e b e d es p u s c o n v er t i r s e e n u n e j e c u t a b l e mediante un programa Ensamblador

. Grfico N 4: Diagrama a bloques de la operacin de un buen compilador.


1. Intrpretes

1.1. Definicin

Un intrprete es un programa que analiza y ejecuta simultneamente un programa escrito en un Lenguaje fuente. En la Figura 1 se presenta el esquema general de un intrprete visto como una caja negra. Cualquier intrprete tiene dos entradas: un programa P escrito en un lenguaje fuente LF (en lo sucesivo, Se denotar P/LF) junto con los datos de entrada; a partir de dichas entradas, mediante un proceso de Interpretacin va produciendo unos resultados. Intrprete de LF P/LF Datos Resultados Los compiladores, a diferencia de los intrpretes, transforman el programa a un programa Equivalente en un cdigo objeto (fase de compilacin), y en un segundo paso generan los resultados a Partir de los datos de entrada (fase de ejecucin). Compilador De LF P/LF Datos Resultados P/OBJ Compilacin Ejecucin Figura 2: Esquema general de un compilador 1.2. Estructura de un intrprete A la hora de construir un intrprete es conveniente utilizar una Representacin Interna (RI) del Lenguaje fuente a analizar. De esta forma, la organizacin interna de la mayora de los intrpretes se descompone en los mdulos: Traductor a Representacin Interna: Toma como entrada el cdigo del programa P en Lenguaje Fuente, lo analiza y lo transforma a la representacin interna correspondiente a dicho programa P. Representacin Interna (P/RI): La representacin interna debe ser consistente con el programa original. Entre los tipos de representacin interna, los rboles sintcticos son los ms utilizados y, si las

Caractersticas del lenguaje lo permiten, pueden utilizarse estructuras de pila para una mayor eficiencia. Tabla de smbolos: Durante el proceso de traduccin, es conveniente ir creando una tabla con informacin relativa a los smbolos que aparecen. La informacin a almacenar en dicha tabla de smbolos depende de la complejidad del lenguaje fuente. Se pueden almacenar etiquetas para instrucciones de salto, informacin sobre identificadores (nombre, tipo, lnea en la que aparecen, etc.) o cualquier otro tipo de informacin que se necesite en la etapa de evaluacin. Evaluador de Representacin Interna: A partir de la Representacin Interna anterior y de los datos de entrada, se llevan a cabo las acciones indicadas para obtener los resultados. Durante el proceso de evaluacin es necesario contemplar la aparicin de errores. Estructura de un intrprete Tratamiento de errores: Durante el proceso de evaluacin pueden aparecer diversos errores como desbordamiento de la pila, divisiones por cero, etc. que el intrprete debe contemplar. Intrprete de LF P/LF Datos Resultados Traductor LF a RI Evaluador RI P/RI Tabla Smbolos Tratamiento de Errores Figura 3: Organizacin interna de un intrprete Dependiendo de la complejidad del cdigo a analizar, el intrprete puede contener mdulos similares a los de un compilador tradicional: Anlisis lxico, Sintctico y Semntico. Durante la evaluacin, el intrprete interacta con los recursos del sistema como la memoria, discos, etc. Muchos sistemas Interpretados liberan al programador del manejo explcito de memoria mediante tcnicas de recoleccin de basura. A la hora de evaluar la representacin interna, existen dos mtodos fundamentales: la interpretacin iterativa y la interpretacin recursiva.

You might also like