¿Qué es un compilador?

Un compilador es un programa que convierte el código fuente legible por humanos en un código de máquina ejecutable por computadora. Para hacer esto con éxito, el código legible por humanos debe cumplir con las reglas gramaticales de cualquier lenguaje de programación en el que esté escrito. Un compilador es solo un programa y no puede arreglar el código por usted. Si comete un error, debe corregir la sintaxis, de lo contrario no se compilará.

¿Qué sucede cuando se compila el código?

La complejidad de un compilador depende de la sintaxis del lenguaje y del nivel de abstracción proporcionado por el lenguaje de programación. Los compiladores de C son mucho más simples que los compiladores de C++ o C#.

análisis léxico

Al compilar, el compilador primero lee una secuencia de caracteres de un archivo de código fuente y genera una secuencia de tokens léxicos. Por ejemplo, código C++:

 
 
int C= (A*B)+10;

Se puede analizar en los siguientes tokens:

  • Escriba "int"
  • variable "c"
  • igual
  • paréntesis izquierdo
  • Variable "A"
  • de segunda categoría
  • Variable "B"
  • soporte de cierre
  • agregar
  • literal "10"

Análisis de sintaxis

La salida léxica va a la parte del analizador del compilador, que usa reglas gramaticales para determinar si la entrada es válida. A menos que las variables A y B hayan sido previamente declaradas y dentro del alcance, el compilador podría decir:

  • 'A': Identificador no declarado.

Si se declaran pero no se inicializan. El compilador emite una advertencia:

  • Variable local usada no inicializada 'A'.

Nunca ignore las advertencias del compilador. Pueden descifrar su código de formas extrañas e inesperadas. Corrija siempre las advertencias del compilador.

¿Un pase o dos pases?

Algunos lenguajes de programación están escritos para que el compilador lea el código fuente solo una vez y genere código máquina. Es tal lenguaje. Muchos compiladores requieren al menos dos pases. A veces esto se debe a una declaración directa de una función o clase.

En C++, las clases pueden declararse, pero no definirse hasta más tarde. El compilador no puede determinar cuánta memoria necesita una clase hasta que compila el cuerpo de la clase. Tiene que volver a leer el código fuente antes de generar el código de máquina correcto.

generar codigo maquina

Suponiendo que el compilador complete con éxito el análisis léxico y sintáctico, la etapa final es generar código de máquina. Es un proceso complicado, especialmente con las CPU modernas.

La compilación del código ejecutable debe ser lo más rápida posible y puede variar ampliamente según la calidad del código generado y la cantidad de optimización solicitada.

La mayoría de los compiladores le permiten especificar la cantidad de optimización, a menudo conocida por las compilaciones de depuración rápidas y la optimización completa para el código publicado.

La generación de código es un desafío

Los escritores de compiladores enfrentan desafíos al escribir generadores de código. Muchos procesadores utilizan

  • canalización de instrucciones
  • caché interna.

Si todas las instrucciones en un bucle de código pueden mantenerse en la memoria caché de la CPU, el bucle puede ejecutarse mucho más rápido que si la CPU tuviera que obtener instrucciones de la RAM principal. La memoria caché de la CPU es un bloque de memoria integrado en el chip de la CPU al que se puede acceder mucho más rápido que a los datos de la RAM principal.

caché y cola

La mayoría de las CPU tienen una cola de búsqueda previa en la que la CPU lee las instrucciones en la memoria caché antes de ejecutarlas. Si ocurre una bifurcación condicional, la CPU debe recargar la cola. Se debe generar código para minimizar esto.

Muchas CPU tienen partes separadas para:

  • Aritmética de enteros (entero)
  • Aritmética de punto flotante (decimal)

Estas operaciones a menudo se pueden ejecutar en paralelo para aumentar la velocidad.

Los compiladores generalmente generan código de máquina en archivos de objetos, que luego se vinculan entre sí mediante un programa de vinculación.

Supongo que te gusta

Origin blog.csdn.net/xipengbozai/article/details/131352346
Recomendado
Clasificación