← Todas las entradas

Qué son los compiladores (y por qué todo programador debería entenderlos)

En clase suelo preguntar quién ha escrito alguna vez un compilador. Casi nadie levanta la mano. Luego pregunto quién ha depurado un error de tipos, optimizado un bucle lento, o se ha preguntado por qué el mismo código corre distinto en dos máquinas. Ahí levantan la mano todos. Un compilador no es un tema de nicho: es la maquinaria invisible detrás de cada una de esas preguntas.

Las fases de un compilador

Simplificando bastante, un compilador transforma código fuente en instrucciones ejecutables en cinco etapas. El análisis léxico convierte el texto en una secuencia de tokens (palabras clave, identificadores, símbolos). El análisis sintáctico organiza esos tokens en un árbol que representa la estructura gramatical del programa. El análisis semántico verifica que ese árbol tenga sentido —tipos compatibles, variables declaradas, alcance correcto—. La generación de código intermedio traduce el árbol a una representación más cercana a la máquina, y ahí entra la optimización: eliminar código muerto, simplificar expresiones, reordenar instrucciones para aprovechar mejor el hardware. Al final, la generación de código produce las instrucciones reales para el procesador o para una máquina virtual.

Por qué importa aunque nunca escribas uno

Casi ningún programador construirá un compilador en su carrera. Pero entender estas fases cambia cómo se lee un mensaje de error: un error de "tipo incompatible" ocurre en el análisis semántico, no en tiempo de ejecución, y eso te dice dónde buscar. Explica por qué algunos lenguajes detectan errores antes de correr el programa y otros no. Y explica por qué el mismo algoritmo, escrito de dos formas distintas, puede compilar a código con rendimiento muy diferente: el optimizador solo puede trabajar con las garantías que el código le da.

Un ejercicio que uso en el aula

Pido a los estudiantes que tomen una expresión aritmética simple, como 3 + 4 * 2, y construyan a mano el árbol sintáctico que respeta la precedencia de operadores. Es un ejercicio de minutos, pero deja algo instalado: entender por qué existe la precedencia, y qué implica que un lenguaje decida romperla o respetarla, no es un dato de examen —es la primera vez que se ve el árbol detrás del texto.

Uno no necesita construir un compilador para beneficiarse de pensar como quien construye uno: en capas, verificando supuestos antes de actuar sobre ellos.