¿Qué es un editor?

Compilador

Un compilador es un programa especial que convierte un programa escrito en un lenguaje de programación específico en código de máquina que una máquina puede ejecutar. Cuando escribimos un programa, el entorno que utilizamos es un editor de texto. En este momento, mi programa lo llama programa fuente. Después de esto, el programador puede ejecutar el compilador correspondiente y convertir el archivo fuente correspondiente (mediante un proceso complejo) en código de máquina especificando el nombre del archivo que debe compilarse.

[Editar] Método de trabajo del compilador

Primero, el compilador realiza un análisis de sintaxis, es decir, para separar esas cadenas. Luego se realiza el análisis semántico, que consiste en aclarar el significado de cada unidad gramatical analizada mediante análisis gramatical. El archivo objeto final generado también se denomina archivo obj. El código ejecutable final se puede generar mediante la vinculación realizada por el vinculador. A veces necesitamos vincular los archivos de destino generados por varios archivos para generar el código final. A este proceso lo llamamos reticulación.

El flujo de trabajo principal de un compilador moderno es el siguiente:

* Código fuente → preprocesador → compilador → ensamblador →Código objeto→Conector→Ejecutables

Cómo funciona

La compilación es desde el código fuente (generalmente un lenguaje de alto nivel) hasta el código objeto (generalmente un lenguaje de bajo nivel o lenguaje de máquina) que puede ser ejecutado directamente por una computadora o máquina virtual. Sin embargo, también existen compiladores que convierten lenguajes de bajo nivel en lenguajes de alto nivel. Los compiladores que regeneran código de lenguaje de alto nivel a partir de código de lenguaje de bajo nivel generado por lenguajes de alto nivel también se denominan descompiladores. También hay compiladores que generan un lenguaje de alto nivel a partir de otro, o que generan código intermedio que requiere procesamiento posterior (también llamado cascada).

La salida típica del compilador es un archivo objeto que consta de código de máquina que contiene los nombres y direcciones de puntos de entrada y llamadas externas (a funciones que no están en este archivo objeto). Un conjunto de archivos objeto, no necesariamente generados por el mismo compilador, pero el compilador utilizado debe usar el mismo formato de salida, se pueden vincular y generar un programa ejecutable que el usuario puede ejecutar directamente.

Tipos de compiladores

Un compilador que genera código objeto que está diseñado para ejecutarse en el mismo entorno que la computadora y el sistema operativo (plataforma) en el que se basa el propio compilador. llamado compilador "nativo". Además, el compilador también puede generar código objeto para ejecutarlo en otras plataformas. Este tipo de compilador también se denomina compilador cruzado. Los compiladores cruzados son muy útiles a la hora de generar nuevas plataformas de hardware. Un "compilador de fuente a fuente" se refiere a un compilador que utiliza un lenguaje de alto nivel como entrada y también genera un lenguaje de alto nivel. Por ejemplo: los compiladores de paralelización automática a menudo toman un lenguaje de alto nivel como entrada, transforman el código que contiene y lo anotan con anotaciones de código paralelo (como OpenMP) o con construcciones de lenguaje (como la directiva DOALL de FORTRAN).

El preprocesador (preprocesador)

La función es completar el programa fuente sustituyendo segmentos de programa predefinidos y otros.

Frontal del compilador (frontend)

El front-end es el principal responsable de analizar (analizar) el programa fuente de entrada, y el analizador léxico y el analizador de sintaxis trabajan juntos. El analizador léxico es responsable de encontrar las 'palabras' (Tokens) en el programa fuente, y el analizador de sintaxis reúne estas palabras dispersas en expresiones, declaraciones, funciones, etc. significativas de acuerdo con una gramática predefinida. Por ejemplo, "a = b + c;" el analizador léxico frontal ve "a, =, b, +, c;". El analizador de sintaxis primero los ensambla en la expresión "b + c" de acuerdo con la gramática definida. , y luego ensamblado en la declaración "a = b + c". El front-end también es responsable de la verificación semántica, como verificar si las variables involucradas en la operación son del mismo tipo y el manejo simple de errores.

El resultado final suele ser un árbol de sintaxis abstracta (o AST), de modo que el backend se puede optimizar y procesar aún más sobre esta base.

Backend del compilador (backend)

El backend del compilador es el principal responsable de analizar, optimizar el código intermedio (Representación intermedia) y generar código de máquina (Code Generation).

En términos generales, todos los análisis, optimizaciones y modificaciones del compilador se pueden dividir en dos categorías: dentro de funciones (intraprocedimientos) o entre funciones (interprocedimientos). Es obvio que el análisis y la optimización entre funciones son más precisos, pero tardan más en completarse.

El objeto del análisis del compilador es el código intermedio generado y pasado por el front-end. Los compiladores de optimización modernos a menudo usan varios niveles de código intermedio para representar programas. Alto nivel El código intermedio (IR de alto nivel) es. cercano al formato del programa fuente de entrada, depende del idioma y contiene más información global y la estructura del código de nivel medio (IR de nivel medio) es similar a El lenguaje de entrada es independiente y el de bajo nivel; El código intermedio (IR de bajo nivel) es similar al lenguaje de máquina. Se producen diferentes análisis y optimizaciones en la capa más adecuada de código intermedio.

El análisis de compilación común incluye árbol de llamadas de funciones (árbol de llamadas), gráfico de flujo de control (gráfico de flujo de control) y cadena de definición-uso, uso-definición de variables (definir-usar/usar) basado en esto -definir o cadena u-d/d-u), análisis de alias de variables (análisis de alias), análisis de puntero (análisis de puntero), análisis de dependencia de datos (análisis de dependencia de datos), etc.

Los resultados del análisis del programa anterior son los requisitos previos para la optimización del compilador y la transformación del programa. Las optimizaciones y cambios comunes incluyen: inserción de funciones, eliminación de código muerto, normalización de bucles, desenrollado de bucles, fusión de bucles, fisión de división de bucles), relleno de matriz, etc. El propósito de la optimización y transformación es reducir la longitud del código, aumentar el uso de memoria y caché, y reducir la frecuencia de lectura y escritura de discos y el acceso a datos de la red. Optimizaciones más avanzadas pueden incluso convertir el código de serie en código paralelizado de subprocesos múltiples.

La generación de código máquina es el proceso de convertir códigos intermedios optimizados y modificados en instrucciones de máquina. Los compiladores modernos adoptan principalmente la estrategia de generar código ensamblador en lugar de generar directamente código objeto binario. Incluso en la etapa de generación de código, los compiladores avanzados todavía tienen que realizar mucho trabajo de análisis, optimización y transformación. Por ejemplo, cómo asignar registros (asignación de registros), cómo seleccionar instrucciones de máquina apropiadas (selección de instrucciones), cómo fusionar varias líneas de código en una oración, etc.

css/tongji.js">