Colección de citas famosas - Colección de consignas - Un compilador típico se puede dividir en varias etapas lógicas principales

Un compilador típico se puede dividir en varias etapas lógicas principales

Esta es nuestra tarea de hoy.

Un compilador típico se puede dividir en siete etapas lógicas principales, a saber, analizador léxico, analizador de sintaxis, analizador semántico, generador de código intermedio y código independiente de la máquina. optimizador, generador de código, optimizador de código dependiente de la máquina. Las funciones principales de cada etapa:

(1) Analizador léxico: el análisis léxico lee el flujo de caracteres que constituye el programa fuente y los combina en un flujo de tokens léxicos de acuerdo con las reglas léxicas del lenguaje de programación.

(2) Analizador gramatical: compruebe si la salida del flujo de tokens mediante análisis léxico se ajusta a las reglas gramaticales del lenguaje de programación y, en función de la jerarquía de varias construcciones del lenguaje reflejadas por estas reglas, utilice el primer elemento de cada token para construir una representación intermedia en forma de árbol. Esta representación intermedia describe la situación gramatical del flujo del token en forma de sintaxis abstracta.

(3) Analizador semántico: utilice la información del árbol de sintaxis y la tabla de símbolos para verificar la coherencia semántica del programa fuente de acuerdo con la definición del lenguaje para garantizar que todas las partes del programa se puedan combinar de manera significativa. También recopila información de tipo y la almacena en una tabla de símbolos o árbol de sintaxis.

(4) Generador de código intermedio: genera una representación intermedia explícita de nivel inferior para el programa fuente. Esta representación intermedia puede considerarse como un programa de máquina abstracto.

(5) Optimizador de código independiente de la máquina: intente mejorar el código intermedio para producir un mejor código de destino. Normalmente, mejor significa una ejecución más rápida, pero también pueden existir otros objetivos, como un código de destino más corto o un menor consumo de energía al ejecutar el código de destino.

(6) Generador de código: toma una representación intermedia del programa fuente como entrada y la asigna a un idioma de destino. Si el lenguaje de destino es código de máquina, debe seleccionar registros o unidades de memoria para las variables utilizadas por el programa fuente y luego traducir la secuencia de instrucciones intermedias a una secuencia de instrucciones de máquina que realicen la misma tarea.

(7) Optimizador de código dependiente de la máquina: intenta mejorar el código de máquina de destino para producir un mejor código de máquina de destino.