You are on page 1of 5

Introducción a la Compilación

Compiladores Un compilador es un programa que lee un programa fuente, que está escrito en un lenguaje, y lo traduce a un programa objeto, es decir a otro lenguaje. También tiene la capacidad de informar al usuario de la presencia de errores en el programa fuente. Modelo de análisis y síntesis de la compilación En la compilación e isten dos partes! • "nálisis! di#ide al programa fuente en sus componentes y crea una representación intermedia del mismo. • $íntesis! construye, a partir de la representación intermedia, el programa objeto deseado. En el análisis, se determinan las operaciones que implica el programa fuente y se registran en una estructura jerárquica llamada árbol. El conte to de un compilador %ara crear un programa objeto ejecutable se necesitan otros programas además de un compilador. Un programa fuente se puede di#idir en módulos almacenados en arc&i#os distintos. 'a tarea de reunir el programa fuente a menudo se confía a un programa distinto, el cual recibe el nombre de preprocesador. Análisis del Programa Fuente El análisis, en la compilación, consta de tres fases! (. Análisis Lineal (Análisis Léxico o Exploración) ! la cadena de caracteres que constituye al programa fuente se lee de i)quierda a derec&a y se agrupa en componentes lé icos, que son secuencias de caracteres que tienen un significado colecti#o. *. Análisis Jerárquico (Análisis Sintáctico) ! los caracteres o componentes lé icos se agrupan de manera jerárquica en colecciones alojadas con un significado colecti#o. En otras palabras se agrupan los componentes lé icos del programa fuente en frases gramaticales que el compilador utili)a para sinteti)ar la salida. +ic&as frases gramaticales del programa fuente se representan mediante un árbol de análisis sintáctico. 'a di#isión entre el análisis lé ico y análisis sintáctico es arbitraria. ,abitualmente se escoge una di#isión que simplifique la tarea completa del análisis. +ic&a di#isión se determina si una construcción del lenguaje fuente es in&erentemente recursi#a o no, esto debido a que las construcciones lé icas no requieren recursión, mientras que las construcciones sintácticas suelen requerirla. -. Análisis Semántico! re#isa el programa fuente para tratar de encontrar errores semánticos y re.ne la información sobre los tipos para la fase posterior de generación de código. Un componente importante del análisis semántico es la #erificación de tipos, en la cual el

Las Fases de un Compilador 'os compiladores trabajan en base a fases. con los campos para los atributos del identificador. +ic&a representación debe de poseer dos propiedades importantes. permitiendo la detección de más errores en el programa fuente. 'as fases de análisis sintáctico y semántico por lo general manejan una gran parte de los errores detectables por el compilador. 'a fase de análisis sintáctico determinan los errores donde la cadena de componente lé icos incumplen las reglas de estructura 0sinta is1 del lenguaje. 'a estructura de datos permite encontrar el registro de cada identificador de una manera rápida.til. para poder continuar la compilación. +etección e información de errores En cada fase del compilador se pueden encontrar errores. pero que no tengan sentido para la operación in#olucrada. %or ejemplo. éste se introduce en la taba de símbolos. algunos compiladores &acen una representación intermedia e plícita del programa fuente.n componente lé ico del lenguaje. por lo general. Una de ellas se llama código de tres direcciones que es como el lenguaje ensamblador para una máquina en la que cada posición de memoria puede actuar como un registro. se necesita saber cuáles son los tipos de los identificadores.compilador comprueba si cada operador tiene operandos permitidos por la especificación del lenguaje fuente. +espués de detectar un error cada fase debe de manejarlo de alguna forma. ya que un compilador que se detiene cuando encuentra el primer error no es muy . El código de tres direcciones consiste en una secuencia de . El generador de código. /uando el anali)ador lé ico detecta un identificador en el programa fuente. y almacenar o consultar los datos de ese registro. para poder comprobar si el programa fuente los utili)a de una manera #álida y así generar las operaciones apropiadas con cada uno de ellos. introduce y utili)a información detallada sobre la memoria establecida a los identificadores. debe ser fácil de producir y fácil de traducir al programa objeto. %ero normalmente los atributos de un identificador no se pueden determinar durante el análisis lé ico. En el análisis semántico el compilador intenta descubrir construcciones que tengan la estructura sintáctica correcta. 'a representación intermedia puede tener #arias formas. "dministración de la tabla de símbolos Una tabla de símbolos es una estructura de datos que contiene un registro por cada identificador. 'as fases que restan introducen información sobre los identificadores en la tabla de símbolos y después la utili)an de #arias formas. cada una de las cuales transforma el programa fuente de una representación a otra. la cual se considera como un programa para una máquina abstracta. 2eneración de código intermedio "l concluir el análisis sintáctico y el semántico. 'a fase lé ica puede descubrir errores donde los caracteres restantes de la entrada no constituyen ning. cuando se está &aciendo el análisis semántico y la generación de código intermedio.

cada una de las instrucciones intermedias se traduce a una secuencia de instrucciones de máquina que ejecuta la misma tarea. 66. . " su #e) e isten las optimaciones sencillas las cuales mejoran el tiempo de ejecución del programa objeto sin atrasar e cesi#amente la compilación. #alores para sus parámetros formales. %or lo que cuando se generan esas instrucciones. -. el compilador tiene que decidir el orden en el que se efectuarán las operaciones. que forma su definición. El compilador debe generar un nombre temporal para guardar los #alores calculados por cada instrucción. /onstan de un nombre para macro que se está definiendo y de un cuerpo. +espués. es decir. Esta representación tiene #arias propiedades! (. -. Programas de Sistemas Relacionados con un Compilador %reprocesadores 'os preprocesadores producen la entrada para un compilador. *. 7. Inclusión de archivos! inserta arc&i#os de encabe)amiento en el te to del programa. E iste muc&a #ariación en la cantidad de optimi)ación de código que ejecutan los diferentes compiladores. 'as posiciones de memoria se seleccionan para cada una de las #ariables usadas por el programa. Uso de macros! consiste en dar nombre a la macro y brindar parámetros reales. Un aspecto decisi#o es la asignación de #ariables a registros. 'os procesadores de macros tratan dos clases de proposiciones! 6.instrucciones donde cada una tiene como má imo tres operandos. y por lo general consiste en código de máquina relocali)able o código ensamblador. "lgunas instrucciones de tres direcciones tienen menos de tres operandos. Procesamiento de macros! permite al usuario utili)ar abre#iaturas de construcciones más grandes. y pueden reali)ar las siguientes funciones! (. 3ptimi)ación del código Está fase trata de mejorar el código intermedio. las cuales reciben el nombre de macros. Preprocesadores racionales!! estos preprocesadores enriquecen los lenguajes antiguos con recursos más modernos de flujo de control y de estructuras de datos. E isten los llamados 4compiladores optimadores5 en los cuales se &ace muc&a optimi)ación y una parte significati#a del tiempo del compilador se ocupa en dic&a fase. *. Extensión a len"ua#es! estos procesadores tratan de crear posibilidades al lenguaje que equi#alen a macros incorporados. de modo que se obtenga un código de máquina más rápido de ejecutar.n carácter e clusi#o o palabra cla#e. +efinición de macros! se indican con alg. además de la asignación. /ada instrucción de tres direcciones tiene a lo sumo un operador. 2eneración de código 'a generación de código objeto es la fase final de un compilador.

mero de pasadas . El Agrupamiento de las Fases Etapa inicial y etapa final 'a etapa inicial está compuesta por los análisis lé ico y sintáctico. que consiste en la lectura de un arc&i#o de entrada y en la escritura de un arc&i#o de salida. El código ensamblador es una #ersión mnemotécnica del código de máquina. produciendo código de máquina relocali)able que se puede pasar directamente al editor de carga y enlace. En la primera pasada se ubican todos los identificadores que denoten posiciones de memoria y se guardan en una tabla de símbolos. El análisis lé ico. done se usan nombres en lugar de códigos binarios para operaciones y también se usan nombres para las direcciones de memoria. y traduce cada identificador que representa una posición de memoria a la dirección dada por ese identificador en la tabla de símbolos. el análisis sintáctico. el análisis semántico y la generación de código intermedio pueden ser agrupados en una pasada. en está encontramos los aspectos de la fase de optimi)ación de código. En la segunda pasada se traduce cada código de operación a la secuencia de $its que representa esa operación en lenguaje de máquina. 'a etapa final incluye las partes del compilador que dependen de la máquina objeto. otros reali)an el trabajo del ensamblador. junto con el manejador de errores y las operaciones con la tabla de símbolos. %asadas 8ormalmente se aplican #arias fases de la compilación en una sola pasada. El editor de enlace permite formar un solo programa a partir de #arios arc&i#os de código de máquina relocali)able. En ésta etapa también se incluye cierta optimi)ación de código y el manejo de errores correspondiente a cada fase. una #e) encontrados los identificadores se les asignan posiciones de memoria. El proceso de carga consiste en tomar el código de máquina relocali)able. dando así como resultado el código de máquina relocali)able 0lo que significa que puede cargarse empe)ando en cualquier posición de la memoria1. modificar las direcciones relocali)ables y colocar las instrucciones y los datos modificados en las posiciones adecuadas de la memoria. 9educción del n. Ensamblado de dos pasadas Este tipo de ensamblador reali)a dos pasadas sobre la entrada. la creación de la tabla de símbolos.Ensambladores "lgunos compiladores producen código ensamblador. además de la generación de código. el análisis semántico y la generación de código intermedio. /argadores y editores de enlace Un programa llamado cargador reali)a las dos funciones de carga y edición de enlaces.

-. a partir de una especificación basada en e presiones regulares.8o se puede generar el código objeto para una construcción si no se conocen los tipos de las #ariables utili)adas en esa construcción. que en algunos casos. %eneradores automáticos de códi"o ! toman un conjunto de reglas que definen la traducción de cada operación del lenguaje intermedio al lenguaje de maquina para la maquina objeto. %eneradores de anali&adores sintácticos ! producen anali)adores sintácticos a partir de una entrada fundamentada en una gramática independiente del conte to. *. 'ispositivos de traducción diri"ida por la sintaxis ! producen grupos de rutinas que recorren el árbol del análisis sintáctico. Es por esa ra)ón. es posible dejar un segmento en blanco para la información que falta y llenar la ranura en el momento que la información esté disponible. %eneradores de anali&adores léxicos! generan automáticamente anali)adores lé icos. :.erramientas para la /onstrucción de /ompiladores Entre las &erramientas . . generando código intermedio.tiles para la construcción de compiladores encontramos! (. 'as reglas deben incluir suficiente detalle para poder manejar los distintos métodos de acceso posibles a los datos. . 7. 'ispositivos para análisis de (lu#o de datos ! consiste en la recolección de información sobre la forma en que se trasmiten los #alores de una parte de un programa a cada una de las otras partes.