Está en la página 1de 5

ESTRUCTURA DE UN COMPILADOR FUNCIONES DE CADA UNA DE SUS PARTES

Un compilador acepta programas escritos en un lenguaje de alto nivel y los traduce a otro lenguaje, generando un programa equivalente independiente, que puede ejecutarse tantas veces como se quiera. Este proceso de traduccin se conoce como compilacin. En un compilador hay que distinguir tres lenguajes diferentes: el de los programas de partida (LA) el de los programas equivalentes traducidos (LB), normalmente el lenguaje de mquina el lenguaje en que est escrito el propio compilador (LC), que puede ser igual o diferente a uno de los otros dos. Los programas interpretados suelen ser ms lentos que los compilados, pero los intrpretes son ms flexibles como entornos de programacin y depuracin. Comparando su actuacin con la de un ser humano, un compilador equivale a un traductor profesional que, a partir de un texto, prepara otro independiente traducido a otra lengua, mientras que un intrprete corresponde al intrprete humano, que traduce de viva voz las palabras que oye, sin dejar constancia por escrito. Funciones de un compilador A grandes rasgos un compilador es un programa que lee un programa escrito es un lenguaje, el lenguaje fuente, y lo traduce a un programa equivalente en otro lenguaje, el lenguaje objeto. Como parte importante de este proceso de traduccin, el compilador informa a su usuario de la presencia de errores en el programa fuente. A primera vista, la diversidad de compiladores puede parecer abrumadora. Hay miles de lenguajes fuente, desde los lenguajes de programacin tradicionales, como FORTRAN o Pascal, hasta los lenguajes especializados que han surgido virtualmente en todas las reas de aplicacin de la informtica. Los lenguajes objeto son igualmente variados; un lenguaje objeto puede ser otro lenguaje de programacin o el lenguaje de mquina de cualquier computador entre un microprocesador y un supercomputador. A pesar de existir una aparente complejidad por la clasificacin de los compiladores, como se vio en el tema anterior, las tareas bsicas que debe realizar cualquier compilador son esencialmente las mismas. Al comprender tales tareas, se pueden construir compiladores para una gran diversidad de lenguajes fuente y mquinas objeto utilizando las mismas tcnicas bsicas. Nuestro conocimiento sobre cmo organizar y escribir compiladores ha aumentado mucho desde que comenzaron a aparecer los primeros compiladores a principios de los aos cincuenta. Es difcil dar una fecha exacta de la aparicin del primer compilador, porque en un principio gran parte del trabajo de experimentacin y aplicacin se realiz de manera independiente por varios grupos. Gran parte de los primeros trabajos de compilacin estaba relacionada con la traduccin de frmulas aritmticas a cdigo de mquina. En la dcada de 1950, se consider a los compiladores como programas notablemente difciles de escribir. EL primer compilador de FORTRAN, por ejemplo, necesit para su implantacin de 18 aos de trabajo en grupo (Backus y otros [1975]). Desde entonces, se han descubierto tcnicas sistemticas para manejar muchas de las importantes tareas que surgen en la compilacin. Tambin se han desarrollado buenos lenguajes de implantacin, entornos de programacin y herramientas de software. Con estos avances, puede hacerse un compilador real incluso como proyecto de estudio en un curso de un semestre sobre diseo sobre de compiladores.

Partes en las que trabaja un compilador Conceptualmente un compilador opera en fases. Cada una de las cuales transforma el programa fuente de una representacin en otra. Se muestra una descomposicin tpica de un compilador. En la prctica se pueden a gripar fases y las representaciones intermedias entres las fases agrupadas no necesitan ser construidas explcitamente. Programa fuente

Programa objeto Fases de un compilador. Las tres primeras fases, que forman la mayor parte de la porcin de anlisis de un compilador se analizan en la seccin IX. Otras dos actividades, la administracin de la tabla se smbolos y el manejo de errores, se muestran en interaccin con las seis fases de anlisis lxico, anlisis sintctico, anlisis semntico, generacin de cdigo intermedio, optimacin de cdigo y generacin de cdigo. De modo informal, tambin se llamarn "fases" al administrador de la tabla de smbolos y al manejador de errores. Administrador de la tabla de smbolos 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 tiene validez) y, en el caso de nombres de procedimientos, cosas como el nmero y tipos de sus argumentos, el mtodo de pasar cada argumento (por ejemplo, por referencia) y el tipo que devuelve, si los hay. Una tabla de smbolos es una estructura de datos que contiene un registro por cada identificador, con los campos para los atributos del identificador. La estructura de datos permite encontrar rpidamente el registro de cada identificador y almacenar o consultar rpidamente datos en un registro Cuando el analizador lxico detecta un identificador en el programa fuente, el identificador se introduce en la tabla de smbolos. Sin embargo, normalmente los atributos de un identificador no se pueden determinar durante el anlisis lxico. Por ejemplo, en una declaracin en Pascal como dar posicin, inicial, velocidad: real; El tipo real no se conoce cuando el analizador lxico encuentra posicin, inicial y velocidad. Las fases restantes introducen informacin sobre los identificadores en la tabla de smbolos y despus la utilizan de varias formas. Por ejemplo, cuando se est haciendo el anlisis semntico y la generacin de cdigo intermedio, se necesita saber cules son los tipos de los identificadores, para poder comprobar si el programa fuente los usa de una forma vlida y as poder generar las operaciones apropiadas con ellos. El generador de cdigo, por lo general, introduce y utiliza informacin detallada sobre la memoria asignada a los identificadores. Deteccin e informacin de errores Cada frase puede encontrar errores. Sin embargo, despus de detectar un error. Cada fase debe tratar de alguna forma ese error, para poder continuar la compilacin, permitiendo la deteccin de ms errores en el programa fuente. Un compilador que se detiene cuando encuentra el primer error, no resulta tan til como debiera. Las fases de anlisis sintctico y semntico por lo general manejan una gran proporcin de los errores detectables por el compilador. La fase lxica puede detectar errores donde los caracteres restantes de la entrada no forman ningn componente lxico del lenguaje. Los errores donde la cadena de componentes lxicos violan las reglas de estructura (sintaxis) del lenguaje son determinados por la fase del anlisis sintctico. Durante el anlisis semntico el compilador intenta detectar construcciones que tengan la estructura sintctica correcta, pero que no tengan significado para la operacin implicada, por ejemplo, si se intenta sumar dos identificadores. Uno de los cuales es el nombre de una matriz, y el otro, el nombre de un procedimiento. Las fases de anlisis Conforme avanza la traduccin, la representacin interna del programa fuente que tiene el compilador se modifica. Para ilustrar esas representaciones, considrese la traduccin de la proposicin Posicin:= inicial + velocidad * 60 (1) Posicin:= inicial + velocidad * 60 Id1:= id2 + id3 * 60 Tabla de smbolos 1 2 3 4: = id1 + id2 *

Id3 entareal 60 temp1 := entareal(60) temp2 := id3 * temp1 temp3 := id2 + temp2 id1 := temp3 temp1 := id3 * 60.0 id1 := id2 + temp1 MOVF id3, R2 MULF #60.0, R2 MOVF id2, R1 ADDF R2, R1 MOVF R1, id1 La fase de anlisis lxico lee los caracteres de un programa fuente y los agrupa en una cadena de componentes lxicos en los que cada componente representa una secuencia lgicamente coherente de caracteres, como un identificador, una palabra clave (if, while, etc), un carcter de puntuacin, o un operador de varios caracteres, como :=. La secuencia de caracteres que forman un componente lxico se denomina lexema del componente. A ciertos componentes lxicos se les agregar un "valor lxico". As, cuando se encuentra un identificador como velocidad, el analizador lxico no slo genera un componente lxico, por ejemplo, id, sino que tambin introduce el lexema velocidad en la tabla de smbolos, si an no estaba all. El valor lxico asociado con esta aparicin de id seala la entrada de la tabla de smbolos correspondiente a velocidad. Usaremos id1, id2 e id3 para posicin, inicial y velocidad, respectivamente, para enfatizar que la representacin interna de un identificador es diferente de la secuencia de caracteres que forman el identificador. Por tanto, la representacin de (1) despus del anlisis lxico queda sugerida Por: id1:= id2 + id3 * 60 (2) Se deberan construir componentes para el operador de varios caracteres:= y el nmero 60, para reflejar su representacin interna. En la seccin IX ya se introdujeron las fases segunda y tercera: los anlisis sintctico y semntico. El anlisis sintctico impone una estructura jerrquica a la cadena de componentes lxicos, que se representar por medio de rboles sintcticos, Una estructura de datos tpica para el rbol se muestra, en la que un nodo interior es un registro con un campo para el operador y dos campos que contienen apuntadores a los registros de los hijos izquierdo y derecho. Una hoja es un registro con dos o ms campos, uno para identificar el componente lxico de la hoja, y los otros para registrar informacin sobre el componente lxico. Se puede tener informacin adicional sobre las construcciones del lenguaje aadiendo ms campos a les registros de los nodos. := id1 + id2 * id3 60 (a) 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.

La representacin intermedia puede tener diversas formas. Existe una forma intermedia llamada "cdigo de tres direcciones", que es como el lenguaje ensamblador para una mquina en la que cada posicin de memoria puede actuar como un registro. El cdigo de tres direcciones consiste en una secuencia de instrucciones, cada una de las cuales tiene como mximo tres operandos. El programa fuente de (1) puede aparecer en cdigo de tres direcciones como temp1 := entarea1(60) temp2 := id3 * temp1 (2) temp3 := id2 + temp2 id1 := temp3 Esta representacin intermedia tiene varias propiedades. Primera, cada instruccin de tres direcciones tiene a lo sumo un operador, adems de la asignacin. Por tanto, cuando se generan esas instrucciones el compilador tiene que decidir el orden en que deben efectuarse, las operaciones; la multiplicacin precede a la adicin al programa fuente de (1). Segunda, el compilador debe generar un nombre temporal para guardar los valores calculados por cada instruccin. Tercera, algunas instrucciones de "tres direcciones" tienen menos de tres operadores, por ejemplo la primera y la ltima instrucciones de (2). Optimacin de Cdigo La fase de optimacin de cdigo trata de mejorar el cdigo intermedio de modo que resulte un cdigo de mquina ms rpido de ejecutar. Algunas optimaciones son triviales. Por ejemplo, un algoritmo natural genera el cdigo intermedio (2) utilizando una instruccin para cada operador de la representacin del rbol despus del anlisis semntico, aunque hay una forma mejor de realizar los mismos clculos usando las dos instrucciones Temp1 := id3 * 60.0 (3) Id1 := id2 + temp1 Este sencillo algoritmo no tiene nada de malo, puesto que el problema se puede solucionar en la fase de optimacin de cdigo. Esto es, el compilador puede deducir que la conversin de 60 de entero a real se puede hacer de una vez por todas en el momento de la compilacin, de modo que la operacin entreal se puede eliminar. Adems, temp3 se usa slo una vez, para transmitir su valor a id1. Entonces resulta seguro sustituir a id1 por temp3, a partir de lo cual la ltima proposicin de (2) no se necesita y se obtiene el cdigo de (3). Hay muchas variaciones en la cantidad de optimacin de cdigo que ejecutan los distintos compiladores. En lo que hacen mucha optimacin llamados "compiladores optimadores", una parte significativa del tiempo del compilador se ocupa en esta fase. Sin embargo hay id 1 +__ id 1 *__ 3 num 60 Optimaciones sencillas que mejoran significativamente del tiempo del compilador se ocupa en esta fase. Sin embargo, hay optimaciones sencillas que mejoran sensiblemente el tiempo de ejecucin del programa objeto sin retardar demasiado la compilacin.