Ingeniería de un compilador leyendo notas (1)

Inserte la descripción de la imagen aquí


Preámbulo:

Un optimizador moderno contiene varias tecnologías. El compilador utiliza una búsqueda heurística codiciosa para explorar un gran espacio de solución, utiliza un autómata finito determinista para identificar palabras en la entrada, se utiliza un algoritmo de punto fijo para juzgar el comportamiento del programa, y ​​el programa se predice por teorema y reductor algebraico para predecir El valor de la expresión. Los compiladores utilizan algoritmos de coincidencia rápida para mapear cálculos abstractos con operaciones a nivel de máquina, usan ecuaciones lineales de diofantina y aritmética de Presberg para analizar subíndices de matriz. El compilador utiliza muchos algoritmos clásicos y estructuras de datos, como tablas hash, algoritmos de gráficos y métodos de implementación de conjuntos dispersos, etc.


Capítulo 1: Descripción general de la compilación

Introduccion

|| Un compilador es un programa de computadora (similar a un sistema operativo) que es responsable de convertir un programa escrito en un idioma en un programa escrito en un idioma. Los componentes principales del compilador son: compilador, intérprete, conversión automática.

|| Hoja de ruta para la implementación del concepto:
para que el compilador implemente su función de conversión de idioma, debe tener las siguientes funciones:

  • Comprender la forma y el contenido del lenguaje de entrada (es decir, gramática y semántica).
  • Comprender la forma y el contenido del lenguaje de salida (es decir, gramática y semántica).
  • Esquema de mapeo: la regla de mapear el idioma de origen al idioma de destino

|| De los requisitos funcionales anteriores, podemos obtener la estructura del compilador:

  • Front end: se usa para procesar el idioma fuente
  • Backend: utilizado para procesar el idioma de destino
  • Forma intermedia: conectando los extremos delantero y trasero
  • Optimizador: conversión de optimización mejorada, utilizada para analizar y reescribir formas intermedias

|| Explicación del lenguaje de programación:
Función: Utilizamos el lenguaje de programación para expresar el cálculo como una secuencia de operaciones. Un programa de computadora es una secuencia abstracta de operaciones escritas por un lenguaje de programación.
Características: 1. El lenguaje de programación es un lenguaje formal utilizado para representar con precisión los cálculos, es un lenguaje que no permite la ambigüedad. 3, a menudo con alta abstracción

|| Si el compilador aún genera el lenguaje de programación para humanos, no el lenguaje ensamblador de la computadora. Que se llama el convertidor por la fuente de la fuente de

|| La diferencia entre intérprete y compilador:

  • La entrada al compilador es una especificación ejecutable, y la salida es otra especificación ejecutable
  • La entrada del compilador es una especificación ejecutable, y la salida es el resultado de ejecutar la especificación

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

|| El intérprete y el compilador tienen en común:

  • Es necesario analizar las especificaciones ejecutables ingresadas para determinar si son válidas
  • Se establecerá un modelo interno para representar la estructura y la semántica de la entrada.
  • Para determinar dónde almacenar el valor durante la ejecución

|| La diferencia entre algunos idiomas en el esquema de conversión:
APL, Scheme, more es implementada por el intérprete, en lugar del compilador
Java, que incluye tanto la compilación como la interpretación: (Lo siguiente representa aproximadamente el proceso)

  1. El código fuente de Java se compila en un formulario llamado bytecode
  2. Ejecute el programa de ejecución de bytecode en la máquina virtual Java correspondiente (JVM), la JVM es un intérprete de bytecode

|| Los principios básicos del
compilador : 1: el compilador debe preservar la semántica del programa compilado; la preservación es mantener la corrección durante el proceso de compilación (evitar la ambigüedad)
2: el compilador debe mejorarse de una manera que la clase perciba Entra al programa. Por ejemplo, el convertidor de fuente a fuente del lenguaje C se debe en cierta medida al programa de entrada, y el programa de entrada se mejora al programa fuente para que tenga una mejor usabilidad y generalidad.


Estructura del compilador

|| Descripción de la estructura:
el trabajo del front end implica comprender el programa fuente y registrar sus resultados de análisis en forma de IR;
el trabajo del optimizador se enfoca en mejorar la forma del IR;
el trabajo del back end es mapear el IR optimizado a un límite Recurso

|| El rendimiento real del código compilado depende de: la calidad de la interacción entre el optimizador y la tecnología utilizada en las dos etapas de back-end, decididas conjuntamente (no la función de optimización es buena, la función de mapeo es fuerte, el efecto de compilación es bueno , La conexión es importante)
Compilador
Inserte la descripción de la imagen aquí


Resumen de conversión

En el front-end:
|| Motivo: el código fuente debe traducirse primero

|| Conversiones realizadas en el front-end:

  1. Control gramatical:

    || ¿Qué es la gramática? La
    definición de un conjunto finito de reglas, llamado "gramática". Por lo general, dividimos las oraciones por parte del discurso, de modo que muchas oraciones puedan describirse mediante una sola regla gramatical Inserte la descripción de la imagen aquí
    || Los dos procesos separados en el extremo frontal se denominan "analizador léxico" y "analizador gramatical" para determinar si el código de entrada es realmente Pertenece al conjunto válido en la definición gramatical

    || Analizador de parte del habla:
    clasifique y clasifique: identifique cada palabra en una oración, y clasifique cada palabra en la parte correspondiente del discurso, y clasifíquela en forma de un par de (p, s) El
    papel de la clase de palabras) : divide la oración en una secuencia de palabras categorizadas

    || Analizador de gramática:
    realice el análisis (trabajo de análisis de gramática): haga coincidir el flujo de palabras clasificadas de acuerdo con las reglas de gramática del idioma de entrada especificado y realice la deducción
    : determine si el flujo de entrada es una oración en el idioma de origen Oraciones de gramática del lenguaje).

    || Verificación de
    tipo Realice la verificación de tipo: juicio de tipo (cadena / entero ...) en oraciones
    bien estructuradas : verifique si el uso de nombres en el programa de entrada es de tipo consistente

  2. La representación intermedia
    genera la forma IR del código, ya que se generan varios tipos de formas IR, implicará la estrategia de selección.


En el optimizador:

|| Motivo: cuando se ejecuta el programa IR, las instrucciones se ejecutan una por una según su orden en el código fuente, y el código se ejecutará en un contexto más limitado y predecible.
Función: para analizar el código IR de manera más efectiva, el optimizador analizará la forma IR del código para descubrir los hechos sobre el contexto, y utilizará este conocimiento sobre el contexto para reescribir el código para que pueda obtener la misma respuesta de manera más efectiva.

|| Conversiones que ocurren durante la optimización

  1. Análisis: determine dónde es seguro el programa y aplique beneficiosamente técnicas de optimización Técnicas de
    análisis comúnmente utilizadas: análisis de flujo de datos / análisis de correlación

  2. Conversión: reescribe el código analizado

|| Ejemplos en el
Inserte la descripción de la imagen aquí
backend:

|| Motivo: El backend atravesará el código IR optimizado. Para cada operación IR, selecciona la operación de la máquina de destino correspondiente para lograrlo, determina qué valores pueden residir en el registro y qué valores deben colocarse en la memoria, e inserta el código para implementar estas decisiones y elige una ejecución eficiente Orden.

|| Conversiones que ocurren en el backend

  1. Selección de instrucciones:
    reescribe la operación IR como la operación objetivo, este proceso se llama selección de instrucciones

  2. Asignación de registros: (Minimizar memoria) En la
    fase de selección de instrucciones, el compilador ignora intencionalmente el hecho de que la máquina de destino tiene registros limitados. Por lo tanto, esta etapa reescribirá el código para lograr la asignación de recursos de registro

  3. La programación de instrucciones (minimizando el tiempo)
    reorganiza el orden de las instrucciones, minimizando el tiempo perdido por las instrucciones que esperan que el operando mienta

76 artículos originales publicados · Me gusta 94 · Visitantes más de 20,000

Supongo que te gusta

Origin blog.csdn.net/a13352912632/article/details/105561218
Recomendado
Clasificación