¿Qué es un compilador de código y qué hace?

Un compilador es un programa que traduce el código fuente legible por el ser humano en código máquina ejecutable por ordenador. Para hacer esto con éxito, el código legible por humanos debe cumplir con las reglas sintácticas de cualquier lenguaje de programación en el que esté escrito. El compilador es sólo un programa y no puede arreglar tu código por ti. Si cometes un error, tienes que corregir la sintaxis o no se compilará.

 

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

La complejidad de un compilador depende de la sintaxis del lenguaje y de cuánta abstracción proporciona ese lenguaje de programación. Un compilador de C es mucho más simple que un compilador para C++ o C#.

 

Análisis léxico

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

int C= (A*B)+10;

podrían ser analizadas como estas fichas:

  • type "int"
  • variable "C"
  • equals
  • leftbracket
  • variable "A"
  • times
  • variable "B"
  • rightbracket
  • plus
  • literal "10"

 

Análisis sintáctico

La salida léxica va a la parte del compilador correspondiente al analizador sintáctico, que utiliza las reglas de la gramática para decidir si la entrada es válida o no. A menos que las variables A y B fueran declaradas previamente y estuvieran dentro del alcance, el compilador podría decir:

  • "A": identificador no declarado.

Si fueron declarados, pero no inicializados, el compilador emite una advertencia:

  • variable local "A" utilizada sin inicializar.

Nunca debe ignorar las advertencias del compilador. Pueden descifrar tu código de maneras extrañas e inesperadas. Siempre arregle las advertencias del compilador.

 

Algunos lenguajes de programación están escritos para que un compilador pueda leer el código fuente sólo una vez y generar el código de la máquina. Pascal es uno de esos idiomas. Muchos compiladores requieren al menos dos pasadas. A veces, se debe a declaraciones de funciones o clases.

En C++, una clase puede ser declarada pero no definida hasta más tarde. El compilador no puede calcular cuánta memoria necesita la clase hasta que compila el cuerpo de la clase. Debe releer el código fuente antes de generar el código máquina correcto.

 

Generación de código de máquina

Asumiendo que el compilador completa exitosamente los análisis léxicos y sintácticos, la etapa final es la generación de código máquina. Este es un proceso complicado, especialmente con las CPUs modernas.

La velocidad del código ejecutable compilado debe ser lo más rápida posible y puede variar enormemente en función de la calidad del código generado y de la cantidad de optimización solicitada.

La mayoría de los compiladores le permiten especificar la cantidad de optimización, típicamente conocida para compilaciones de depuración rápida y optimización completa para el código liberado.

 

La generación de código es un reto

El escritor del compilador se enfrenta a desafíos cuando escribe un generador de código. Muchos procesadores aceleran el procesamiento utilizando

  • Instrucción de canalización
  • Cachés internos.

Si todas las instrucciones dentro de un bucle de código se pueden mantener en la caché de la CPU, entonces ese bucle se ejecuta mucho más rápido que cuando la CPU tiene que obtener instrucciones de la RAM principal. La caché de la CPU es un bloque de memoria integrado en el chip de la CPU al que se accede mucho más rápido que los datos de la RAM principal.

 

Caches y colas

La mayoría de las CPUs tienen una cola de espera en la que la CPU lee las instrucciones en la caché antes de ejecutarlas. Si ocurre una rama condicional, la CPU tiene que recargar la cola. El código debe ser generado para minimizar esto.

Muchas CPUs tienen partes separadas para:

  • Aritmética entera (números enteros)
  • Aritmética de punto flotante (números fraccionarios)

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

Los compiladores suelen generar código máquina en archivos de objetos que luego se enlazan entre sí mediante un programa enlazador.

(0 votes)