El proceso de compilación consta de seis etapas: análisis léxico, análisis de sintaxis, análisis semántico, generación de código intermedio, optimización de código y generación de código objetivo.
Intérprete: convierte un programa fuente en un idioma en un programa equivalente en otro idioma, el idioma de destino, y luego ejecuta el programa de destino. El intérprete acepta una oración de entrada de lenguaje de alto nivel, la interpreta y controla la ejecución de la computadora, obtiene inmediatamente el resultado de la ejecución de esta oración y luego acepta la siguiente oración.
Compilador (Compilador): se refiere a un programa que puede convertir un programa fuente escrito en un lenguaje de alto nivel en un programa de destino lógicamente equivalente (programa en lenguaje de máquina o programa en lenguaje ensamblador) en un lenguaje de bajo nivel. forma.
Explica la diferencia fundamental entre un programa y un compilador: si se debe generar código objeto.
La ambigüedad de la oración (la ambigüedad aquí se refiere a la estructura gramatical): si una oración de gramática G [S] puede encontrar dos derivaciones diferentes más a la izquierda (o derivación más a la derecha) o dos diferentes Si hay dos árboles de sintaxis diferentes, se dice que la oración es ambigua.
Ambigüedad gramatical: Una gramática es ambigua si contiene oraciones ambiguas, en caso contrario es ambigua.
El significado de LL(1): (la sintaxis de LL(1) es ambigua; la sintaxis de LL(1) no contiene recursividad hacia la izquierda)
1.ª L: escanea la entrada de izquierda a derecha El 2l de la cadena genera la derivada más a la izquierda.
1: Observa el símbolo de entrada 1 a la derecha para decidir qué fórmula de producción elegir.
Algunas conversiones equivalentes de gramáticas no LL(1) a gramáticas LL(1): 1. Extrae el factor común 2. Eliminar la recursividad por la izquierda.
Atributos de los símbolos gramaticales: el significado de la palabra, es decir, alguna información relacionada con los símbolos gramaticales, como tipo, valor, dirección de almacenamiento, etc.
Una gramática de atributos es un ternario A=(G, V, F).
g: Gramática libre de contexto.
v: Los atributos son limitados. Cada atributo está asociado con un carácter terminal o no terminal de la gramática. Las propiedades, al igual que las variables, se pueden calcular y transmitir.
f: Un conjunto limitado de afirmaciones o predicados sobre un atributo (un conjunto de reglas de cálculo para el atributo). Una afirmación o regla semántica está asociada con una producción y se refiere sólo a las propiedades asociadas con el carácter terminal o no terminal en el extremo izquierdo o derecho de la producción.
Propiedades sintéticas: si los valores de propiedad de un único A no terminal en la mitad izquierda de la producción están determinados por los valores de propiedad de A no terminal en la mitad derecha, entonces las propiedades de A se llaman género sintético.
Atributos heredados: si el valor del atributo del símbolo producido B a la derecha está determinado por el valor del atributo del símbolo no terminal a la izquierda u otros símbolos a la derecha, entonces el atributo de B es un atributo heredado.
(1) Los símbolos no terminales pueden tener propiedades integrales y propiedades heredadas, pero los símbolos de inicio de sintaxis no tienen propiedades heredadas.
(2) Los símbolos terminales solo tienen atributos integrales y no heredados. Son proporcionados por programas de vocabulario.
En el cálculo: los atributos completos se transmiten a lo largo del árbol de sintaxis de atributos; los atributos heredados se transmiten a lo largo del árbol de sintaxis de atributos.
La traducción guiada por gramática se refiere a la acción de completar la descripción de las reglas semánticas adjuntas al resultado utilizado en el proceso de análisis gramatical.
Implementación de traducción guiada por gramática: realice análisis gramatical en cadenas de símbolos de palabras, cree un árbol de análisis de sintaxis, luego construya un gráfico de dependencia de atributos según sea necesario, recorra el árbol de sintaxis y realice cálculos basados en reglas semánticas en cada nodo del árbol de sintaxis.
Código intermedio (lenguaje intermedio)
1 es una representación de la complejidad entre el lenguaje fuente y el lenguaje de máquina.
2. Generalmente, los compiladores rápidos generan directamente código objeto.
3. Para que la estructura del compilador sea lógicamente más simple y clara, a menudo se utilizan códigos intermedios, de modo que algunos detalles de implementación relacionados con la máquina puedan manejarse cuidadosamente durante la fase de generación del código. code Optimice en diferentes niveles para facilitar la implementación de la optimización del código.
¿Qué es el código intermedio? La representación interna del programa fuente es independiente de la estructura de la máquina de destino, lo que facilita la generación mecánica de código.
Por qué convertir a código intermedio: (1) La estructura lógica es clara; es beneficioso implementar el mismo lenguaje en diferentes máquinas de destino;
(2) Conveniente para trasplante, modificación y optimización independiente de la máquina.
Varias formas de códigos intermedios: notación polaca inversa, notación ternaria y de árbol, y cuaternaria.
La forma general de la tabla de símbolos: una tabla de símbolos consta de dos elementos, a saber, la columna de nombre y la columna de información.
La columna de información contiene muchas subcolumnas y bits de bandera, que se utilizan para registrar los nombres correspondientes y varios atributos. La columna de nombre también se denomina columna principal y el contenido de la columna principal se denomina palabras clave.
Las funciones de la tabla de símbolos: (1) recopilar atributos de símbolos (2) verificar la legalidad de la semántica del contexto; (3) verificar la consistencia y legalidad de los atributos del identificador en el contexto; La base de la asignación de direcciones durante la fase de generación del código de destino.
Principales atributos y funciones de los símbolos:
1. Tipo de símbolo (entero, número real, cadena, etc.) 3. Categoría de almacenamiento de símbolos (público * * *, privado).
4. Alcance y visibilidad de los símbolos (global y local)5. Información de almacenamiento y asignación de variables simbólicas (área de almacenamiento estático y área de almacenamiento dinámico)
Estrategia del esquema de asignación de almacenamiento: asignación de almacenamiento estático y dinámico: pila y montón.
Asignación de memoria estática
1, estrategia básica
En el momento de la compilación, todos los espacios de datos del programa de destino están organizados y la dirección de unidad de cada elemento de datos puede estar seguro.
2. Objetos de distribución aplicables: segmentos de código de destino de subprogramas; objetivos de datos globales (variables globales)
3. Requisitos para la asignación de almacenamiento estático: no se permiten llamadas recursivas, excluyendo la matriz de variables. .
Los programas FORTRAN son estructuras de segmentos, no se permite la recursividad y el tamaño y la naturaleza de los nombres de los datos son fijos. Esta es una asignación estática típica.
Asignación de almacenamiento dinámico
1. Si un lenguaje de programación permite programas recursivos, matrices variables o permite a los usuarios solicitar y liberar espacio libremente, entonces se necesita tecnología de administración de almacenamiento dinámico.
2. Dos métodos de asignación de almacenamiento dinámico: pila y montón.
Asignación de almacenamiento dinámico de pila
Estrategia de asignación: diseñe el espacio de datos de todo el programa como una pila.
En un programa de lenguaje con estructura recursiva, cada vez que se llama a un procedimiento, el espacio de datos que requiere se asigna en la parte superior de la pila. Cuando finaliza el procedimiento, este espacio se libera.
El espacio de datos requerido por el proceso incluye dos partes.
Parte de ello son los objetos de datos que viven en esta actividad, como variables locales, unidades de parámetros, variables temporales, etc.
La otra parte es la información de registro (datos de conexión) utilizada para gestionar las actividades del proceso.
Registro de Actividad
La información requerida para la ejecución de un proceso es gestionada por un área de almacenamiento continuo denominada registro de actividad.
Composición
1. Unidad de trabajo temporal; 2. Variables locales; 3. Información del estado de la máquina; 4. Cadena de acceso; . Ginseng real; 7. Dirección del remitente
¿Qué es la optimización del código?
La llamada optimización consiste en realizar una transformación equivalente en el código, de modo que el resultado del código transformado sea el mismo que antes de la transformación, pero la velocidad de ejecución es más rápida o el espacio de almacenamiento se reduce. .
Principio de optimización: Principio de equivalencia: después de la optimización, los resultados de la operación del programa no deben cambiar.
Principio efectivo: el código de destino optimizado tiene un tiempo de ejecución más corto y ocupa menos espacio de almacenamiento.
Principio de rentabilidad: conseguir mejores resultados de optimización al menor coste posible.
Técnicas de optimización comunes
(1) Eliminar operaciones redundantes (eliminar subexpresiones masculinas * * *) (2) Extrapolación de código para eliminar variables de inducción (3) Debilitamiento de fuerza (4) Cambio; las condiciones de control de bucle (5) Usar la propagación de copias para fusionar cantidades conocidas (6) Eliminar asignaciones inútiles.
Definición de bloque básico
Una secuencia de instrucciones con una sola entrada y una salida en un programa se denomina bloque básico del programa.
Dame una puntuación.