stringtranslate.com

Compilador de múltiples pasadas

Un compilador de múltiples pasos 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 sólo 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 , [1] en referencia al mayor alcance de las pasadas: pueden "ver" todo el programa que se está compilando, en lugar de solo una pequeña parte del mismo. El alcance más amplio disponible para estos compiladores permite una mejor generación de código (por ejemplo, un tamaño de código más pequeño, 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 de una sola vez debido a su diseño.

Compilador típico de múltiples pasadas

Análisis léxico

Esta etapa de un compilador de múltiples pasos consiste en eliminar información irrelevante del programa fuente que el análisis de sintaxis no podrá utilizar ni interpretar. La información irrelevante podría incluir cosas como comentarios y espacios en blanco. Además de eliminar la información irrelevante, el análisis léxico determina las fichas léxicas de la lengua. Este paso significa que la declaración directa generalmente no es necesaria si se utiliza un compilador de múltiples pasadas. Esta fase se centra en dividir una secuencia de caracteres en tokens con atributos como clase, 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 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 realizada 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 requiriera que las condiciones si las declaraciones fueran expresiones booleanas, se verificaría el tipo de cond para asegurarse de que fuera una expresión booleana válida.

si ( cond ) { ... } más { ... }       

Además de realizar un análisis semántico en esta etapa de la 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 de instrucciones ejecutables (a menudo ensambladas ). 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 haga que el programa sea más eficiente.

Otros pasos del compilador incluyen la fase intermedia de generación de código que tiene lugar antes de la generación del código y la fase de optimización del código que puede tener lugar cuando se escribe el programa fuente, o después de la fase intermedia de generación de código, o después de la fase de generación de código.

Ventajas de los compiladores de múltiples pasadas

Independiente de la máquina : dado que los múltiples pases incluyen una estructura modular y la generación de código está desacoplada de los otros pasos del compilador, los pases se pueden reutilizar para diferentes hardware/máquinas.

Lenguajes más expresivos : múltiples pases eliminan la necesidad de declaraciones directas, lo que permite implementar la recursividad mutua de manera elegante. Los principales ejemplos de lenguajes que requieren declaraciones directas debido al requisito de ser compilables en una sola pasada incluyen C y Pascal , mientras que Java no tiene declaraciones directas.

Referencias

  1. ^ Grune, Dick; van Reeuwijk, Kees; Bal, Enrique; Jacobs, Ceriel; Langendoen, Koen (2012). Diseño de compilador moderno (Segunda ed.). Ámsterdam, Países Bajos: Springer. pag. 27.ISBN​ 978-1-4939-4472-9.