Compiladores
Los compiladores son programas que necesitan un archivo que contiene el código fuente (source code) y luego ejecutan el proceso de traducción del código fuente a lenguaje máquina (proceso de compilación). El código máquina resultante se coloca en un nuevo archivo para su ejecución posterior. Este archivo se suele denominar fichero binario ejecutable.
Ejemplos de lenguajes de programación que utilizan compilador son: C, C++, Rust, Go, Fortran, Pascal, Swift, Kotlin, Haskell y Ada.

En sistemas Windows estos ejecutables tienen la extensión .exe o .dll.
Si abrimos un archivo con código máquina en un archivo de texto veríamos algo totalmente ilegible:

Una vez tengamos un ejecutable, no es posible obtener el código fuente original. Se trata de un proceso irreversible. Sólo es posible deducir el código fuente a partir de un ejecutable mediante ingeniería inversa.
Funcionamiento de un compilador
El funcionamiento de un compilador se estructura de la siguiente manera:
- Análisis léxico: El compilador lee el código fuente y lo divide en unidades léxicas llamadas tokens (como palabras clave, identificadores, operadores, etc.).
Por ejemplo, la instrucción
int x = 5;se divide en tokens comoint,x,=,5, y;. - Análisis sintáctico: El compilador analiza la estructura del código para asegurarse de que sigue la sintaxis del lenguaje. Este paso construye un árbol de análisis sintáctico que representa la estructura del programa. Por ejemplo, la instrucción
int x = 5;se analiza para verificar que la declaración es válida dentro del contexto del lenguaje. - Análisis semántico: El compilador verifica el significado del código y se asegura de que el uso de las variables, tipos de datos y operaciones sea coherente y correcto. Por ejemplo, verifica que
xsea una variable que puede ser asignada y que5es un valor compatible con el tipoint. - Optimización: El compilador aplica diversas técnicas para mejorar el código, reducir el tamaño del código y mejorar el desempeño. Esta etapa puede optimizar tanto el código fuente como el código intermedio. Por ejemplo, puede simplificar operaciones matemáticas o eliminar código innecesario.
- Generación de código: El compilador traduce la representación interna del código a código de máquina o a un código intermedio que puede ser ejecutado por un procesador. Por ejemplo, la instrucción
int x = 5;se traduce a un conjunto de instrucciones que la CPU puede ejecutar para asignar el valor5a la variablex. - Enlazado: El compilador o un enlazador externo combina el código objeto generado con las bibliotecas y módulos necesarios para crear el archivo ejecutable final.
Ventajas
- Desempeño: El código compilado puede ejecutarse mucho más rápido que el código interpretado, ya que está convertido en código de máquina que la CPU puede ejecutar directamente.
- Optimización: Los compiladores aplican diversas técnicas de optimización que mejoran la eficiencia del código ejecutado.
- Detección de errores: Los compiladores realizan un análisis exhaustivo del código fuente (denominado análisis estático) y pueden detectar errores e inconsistencias antes de la ejecución, lo que facilita la corrección de problemas.
- Independencia del código fuente: Una vez compilado, el código objeto o ejecutable no requiere la presencia del compilador para ser ejecutado, permitiendo la distribución y ejecución del software sin dependencias adicionales.
Desventajas
- Tiempo de compilación: La compilación puede llevar tiempo, especialmente para programas grandes o complejos, lo que puede ralentizar el proceso de desarrollo y depuración.
- Flexibilidad: La modificación y prueba de código pueden ser menos flexibles en comparación con la interpretación, ya que cada cambio requiere recompilación.
- Complejidad: El proceso de compilación puede ser complejo y requiere una comprensión profunda del funcionamiento del compilador y de las técnicas de optimización.