Un compilador de múltiples pasadas es un tipo de compilador que procesa el código fuente o el árbol de sintaxis abstracta de un programa varias veces. Esto contrasta con un compilador de una sola pasada , que recorre el programa solo una vez. Cada pasada toma el resultado de la pasada anterior como entrada y crea una salida intermedia. De esta manera, el código (intermedio) se mejora paso a paso, hasta que el paso final produce el código final.
Los compiladores de múltiples pasadas a veces se denominan compiladores amplios , [ cita requerida ] refiriéndose al mayor alcance de las pasadas: pueden "ver" el programa completo que se está compilando, en lugar de solo una pequeña parte de él. El alcance más amplio disponible para estos compiladores permite una mejor generación de código (por ejemplo, un código más pequeño, un código más rápido) en comparación con la salida de los compiladores de una sola pasada, a costa de un mayor tiempo de compilación y consumo de memoria. Además, algunos lenguajes no se pueden compilar en una sola pasada, como resultado de su diseño.
Compilador típico de múltiples pasadas
Análisis léxico
Esta etapa de un compilador de múltiples pasadas consiste en eliminar información irrelevante del programa fuente que el análisis de sintaxis no podrá utilizar o interpretar. La información irrelevante podría incluir comentarios y espacios en blanco. Además de eliminar la información irrelevante, el análisis léxico determina los tokens léxicos del idioma. Este paso significa que la declaración hacia adelante generalmente no es necesaria si se usa un compilador de múltiples pasos. Esta fase se centra en dividir una secuencia de caracteres en fichas con atributos como tipo, tipo, valor y potencialmente otros también.
Análisis de sintaxis
El análisis de sintaxis es responsable de observar las reglas de sintaxis del idioma (a menudo como una gramática libre de contexto ) y de construir alguna representación intermedia del idioma. Un ejemplo de esta representación intermedia podría ser algo así como un árbol de sintaxis abstracta o un gráfico acíclico dirigido .
Análisis semántico
El análisis semántico toma la representación hecha a partir del análisis de sintaxis y aplica reglas semánticas a la representación para asegurarse de que el programa cumpla con los requisitos de las reglas semánticas del lenguaje. Por ejemplo, en el siguiente ejemplo, en la etapa de análisis semántico, si el lenguaje requería que las condiciones sobre si las declaraciones fueran expresiones booleanas , se verificaría el tipo de cond para asegurarse de que sería una expresión booleana válida.
if ( cond ) { ... } else { ... }
Además de realizar análisis semántico en esta etapa de compilación, a menudo se crean tablas de símbolos para ayudar en la generación de código.
Codigo de GENERACION
Esta etapa final de un compilador típico convierte la representación intermedia del programa en un conjunto ejecutable de instrucciones (a menudo ensamblador ). Esta última etapa es la única etapa de la compilación que depende de la máquina. También se puede realizar una optimización en esta etapa de compilación que hace que el programa sea más eficiente.
Otras pasadas del compilador incluyen la fase de generación de código intermedia que tiene lugar antes de la generación de código y la fase de optimización de código que puede tener lugar cuando se escribe el programa fuente, o después de la fase de generación de código intermedia, o después de la fase de generación de código.
Ventajas de los compiladores de varias pasadas
Independiente de la máquina : dado que las múltiples pasadas incluyen una estructura modular y la generación de código desacoplada de los otros pasos del compilador, las pasadas se pueden reutilizar para diferentes hardware / máquinas.
Lenguajes más expresivos : los pases múltiples evitan la necesidad de declaraciones hacia adelante, lo que permite que la recursividad mutua se implemente con elegancia. Los principales ejemplos de lenguajes que requieren declaraciones hacia adelante debido al requisito de ser compilables en una sola pasada incluyen C y Pascal , mientras que Java no tiene declaraciones hacia adelante.
Referencias
- Bornat, Richard , Compiladores de comprensión y redacción: una guía para hacerlo usted mismo , Macmillan Publishing, 1979. ISBN 0-333-21732-2
- Bent Thomsen, Idiomas y compiladores SProg og Overseattere , Departamento de Ciencias de la Computación, Universidad de Aalborg