agrupamiento de las fases

4
EL AGRUPAMIENTO DE LAS FASES 1) ETAPA INICIAL Y ETAPA FINAL La etapa inicial comprende aquellas fases, o partes de fases, que dependen principalmente del lenguaje fuente y que son en gran parte independientes de la maquina objeto. Ahí normalmente se incluyen los análisis léxico y sintáctico, la creación de la tabla de símbolos, el análisis semántico y la generación de código intermedio. La etapa inicial también puede hacer cierta optimación de código. La etapa inicial incluye, además, el manejo de errores correspondientes a cada una de las fases. 2) LA ETAPA FINAL La etapa final incluye aquellas partes del compilador que dependen de la maquina objeto y, en general, esas partes no dependen del lenguaje fuente, sino solo del lenguaje intermedio. En la etapa final, se encuentran aspectos de la fase de optimización de código, además de la generación de código, junto con el manejo de errores necesario y las operaciones con la tabla de símbolos. Se ha convertido en rutina el tomar la etapa inicial de un compilador y rehacer su etapa final asociada para producir un compilador para el mismo lenguaje fuente en una maquina distinta. Si la etapa final se diseña con cuidado, incluso puede no ser necesario rediseñarla demasiado. También resulta tentador compilar varios lenguajes distintos en el mismo lenguaje intermedio y usar la etapa final común para distintas etapas iníciales, obteniéndose así varios compiladores para una maquina. CLASIFICACIONES DE UN COMPILADOR UNA SOLA PASADA: examina el código fuente una vez, generando el código o programa objeto.

Upload: diego-montiel

Post on 01-Jul-2015

563 views

Category:

Documents


7 download

TRANSCRIPT

Page 1: Agrupamiento de las fases

EL AGRUPAMIENTO DE LAS FASES

1) ETAPA INICIAL Y ETAPA FINAL

La etapa inicial comprende aquellas fases, o partes de fases, que dependen principalmente del lenguaje fuente y que son en gran parte independientes de la maquina objeto. Ahí normalmente se incluyen los análisis léxico y sintáctico, la creación de la tabla de símbolos, el análisis semántico y la generación de código intermedio. La etapa inicial también puede hacer cierta optimación de código. La etapa inicial incluye, además, el manejo de errores correspondientes a cada una de las fases.

2) LA ETAPA FINAL

La etapa final incluye aquellas partes del compilador que dependen de la maquina objeto y, en general, esas partes no dependen del lenguaje fuente, sino solo del lenguaje intermedio. En la etapa final, se encuentran aspectos de la fase de optimización de código, además de la generación de código, junto con el manejo de errores necesario y las operaciones con la tabla de símbolos.

Se ha convertido en rutina el tomar la etapa inicial de un compilador y rehacer su etapa final asociada para producir un compilador para el mismo lenguaje fuente en una maquina distinta. Si la etapa final se diseña con cuidado, incluso puede no ser necesario rediseñarla demasiado. También resulta tentador compilar varios lenguajes distintos en el mismo lenguaje intermedio y usar la etapa final común para distintas etapas iníciales, obteniéndose así varios compiladores para una maquina.

CLASIFICACIONES DE UN COMPILADOR UNA SOLA PASADA: examina el código fuente una vez, generando el código o programa

objeto.

PASADAS MÚLTIPLES: requieren pasos intermedios para producir un código en otro lenguaje, y una pasada final para producir y optimizar el código producido durante los pasos anteriores.

OPTIMIZADORES: lee un código fuente, lo analiza y descubre errores potenciales sin ejecutar el programa.

COMPILADORES INCREMENTALES: generan un código objeto instrucción por instrucción (en vez de hacerlo para todo el programa) cuando el usuario teclea cada orden individual.

Page 2: Agrupamiento de las fases

El otro tipo de compiladores requiere que todos los enunciados o instrucciones se compilen conjuntamente.

ENSAMBLADOR: el lenguaje fuente es lenguaje ensamblador y posee una estructura sencilla.

COMPILADOR CRUZADO: se genera código en lenguaje objeto para una máquina diferente de la que se está utilizando para compilar. Es perfectamente normal construir un compilador de Pascal que genere código para MS-DOS y que el compilador funcione en Linux y se haya escrito en C++.

COMPILADOR CON MONTADOR: compilador que compila distintos módulos de forma independiente y después es capaz de enlazarlos.

AUTOCOMPILADOR: compilador que está escrito en el mismo lenguaje que va a compilar. Evidentemente, no se puede ejecutar la primera vez. Sirve para hacer ampliaciones al lenguaje, mejorar el código generado, etc.

METACOMPILADOR: es sinónimo de compilador de compiladores y se refiere a un programa que recibe como entrada las especificaciones del lenguaje para el que se desea obtener un compilador y genera como salida el compilador para ese lenguaje. El desarrollo de los metacompiladores se encuentra con la dificultad de unir la generación de código con la parte de análisis. Lo que sí se han desarrollado son generadores de analizadores léxicos y sintácticos. Por ejemplo, los conocidos:

LEX: generador de analizadores léxicos YACC: generador de analizadores sintácticos desarrollados para UNIX. Los

inconvenientes que tienen son que los analizadores que generan no son muy eficientes.

DESCOMPILADOR: es un programa que acepta como entrada código máquina y lo traduce a un lenguaje de alto nivel, realizando el proceso inverso a la compilación.

COMPILADOR JIT (Just In Time): forman parte de un intérprete y compilan partes del código según se necesitan.

Page 3: Agrupamiento de las fases

PARTES DE UN COMPILADORNormalmente los compiladores están divididos en dos partes:

a) Front End: es la parte que analiza el código fuente, comprueba su validez, genera el árbol de derivación y rellena los valores de la tabla de símbolos. Esta parte suele ser independiente de la plataforma o sistema para el cual se vaya a compilar.

b) Back End: es la parte que genera el código máquina, específico de una plataforma, a partir de los resultados de la fase de análisis, realizada por el Front End.

Esta división permite que el mismo Back End se utilice para generar el código máquina de varios lenguajes de programación distintos y que el mismo Front End que sirve para analizar el código fuente de un lenguaje de programación concreto sirva para generar código máquina en varias plataformas distintas.

El código que genera el Back End normalmente no se puede ejecutar directamente, sino que necesita ser enlazado por un programa enlazador (linker).