coldwa.st
Todas las guíasProgramaciónWebDatosHerramientasBases de datosHaskellConceptosCabal y buildsToolchainCompiladorRendimientoEditor y HLS

Programación · Conceptos · Compilador

¿Qué es un compilador?

Por ColdwastActualizado el 23 jun 20268 min de lectura#compiler#concepts#haskell
Código fuente C++ resaltado con números de línea en un editor oscuro
Un código fuente como este — variables, bucles y condiciones escritos por una persona — es la entrada que el compilador lee para convertirla en un programa que la máquina puede ejecutar.

Escribes un programa en un lenguaje que sabes leer: palabras, sangría, nombres con sentido. El procesador de tu máquina no entiende nada de eso — ejecuta instrucciones binarias en crudo. La herramienta que tiende el puente es el compilador. Esta guía explica qué es un compilador, las etapas por las que pasa, en qué se diferencia de un intérprete, y dónde encaja un compilador como GHC cuando escribes Haskell.

La definición corta

Un compilador es un programa que traduce código fuente escrito en un lenguaje a otra forma — normalmente el código máquina que un ordenador puede ejecutar directamente. Le entregas los archivos de texto que escribiste y produce un ejecutable (o un formato intermedio) que la máquina, o un runtime, puede ejecutar. La traducción ocurre una vez, por adelantado, y el resultado se ejecuta solo, sin que el compilador esté presente.

Cómo funciona un compilador, paso a paso

Un compilador no traduce de un solo salto. Recorre una cadena de etapas, cada una pasando su resultado a la siguiente:

  • Análisis léxico (tokenización): el texto fuente se divide en pequeñas unidades — palabras clave, nombres, números, símbolos — llamadas tokens.
  • Análisis sintáctico: los tokens se organizan en un árbol que refleja la estructura del programa, según la gramática del lenguaje.
  • Análisis semántico: el compilador comprueba que el programa tenga sentido — nombres definidos, tipos coherentes, reglas del lenguaje respetadas. Aquí se detectan muchos de tus errores.
  • Optimización: el compilador reescribe el programa en un equivalente más rápido o más pequeño sin cambiar lo que hace.
  • Generación de código: finalmente emite la salida objetivo — código máquina, o una representación intermedia que otra herramienta terminará.

Si alguna etapa encuentra un problema, obtienes un error de compilación y no se produce ningún programa. Ese es el trato del compilador: se niega a construir código roto, así que toda una clase de errores se atrapa antes de que el programa siquiera se ejecute.

Un desarrollador con auriculares trabajando en un escritorio con un monitor y un portátil mostrando código en una sala azul oscura
Un desarrollador trabajando: escribes y editas el código fuente, luego ejecutas el compilador, que lee tus archivos y produce el programa ejecutable.

Compilador vs intérprete

El otro enfoque común es el intérprete, que lee tu código fuente y lo ejecuta directamente, línea por línea, cada vez que el programa corre — no se construye ningún ejecutable por adelantado. Un compilador traduce todo el programa una vez, al inicio, a una forma que la máquina ejecuta sola.

La diferencia práctica: los programas compilados suelen arrancar y correr más rápido, porque la traducción y la optimización ya ocurrieron, y los errores aparecen en tiempo de compilación. Los programas interpretados son más rápidos de probar y más flexibles, pero rehacen el trabajo de traducción en cada ejecución. Muchas cadenas de herramientas reales mezclan ambos — compilan a una forma intermedia y luego la ejecutan en una máquina virtual.

Dónde encajan GHC y Haskell

Cuando escribes Haskell, el compilador que usas es GHC (el Glasgow Haskell Compiler). Lee tus archivos fuente .hs, los comprueba de tipos a fondo, optimiza el resultado y produce un ejecutable nativo que puedes correr solo. El sistema de tipos fuerte de Haskell hace que la etapa de análisis semántico de GHC trabaje mucho por ti: muchos bugs se reportan como errores de compilación en lugar de fallar en tiempo de ejecución. Para el recorrido completo de su uso, mira nuestra guía del compilador GHC y cómo instalar Haskell con GHCup.

Los comandos que realmente te encuentras

  • Compilar un solo archivo: una herramienta como ghc Main.hs lee tu fuente y produce un ejecutable.
  • Construir un proyecto: herramientas de build como Cabal o Stack dirigen el compilador a través de muchos archivos y dependencias por ti.
  • Comprobar tipos sin build completo: muchos compiladores ofrecen un modo más rápido que busca errores sin emitir un binario.

La mayoría de las veces no llamas al compilador a mano — tu herramienta de build o tu editor lo hace y te muestra los errores. Pero saber qué hace por debajo hace esos errores mucho más fáciles de leer.

Las concesiones honestas

Los compiladores añaden un paso: cambias código, esperas el build, y luego ejecutas. En un proyecto grande esa espera se nota, por eso importan los compiladores rápidos y los builds incrementales. La recompensa es real: errores atrapados pronto, salida optimizada y un único ejecutable que puedes distribuir sin distribuir tu cadena de herramientas. Para un lenguaje fuertemente tipado como Haskell, esa comprobación por adelantado es gran parte del atractivo — el compilador es una red de seguridad, no solo un traductor.

Preguntas frecuentes

¿Qué es un compilador en términos simples?

Un compilador es un programa que traduce el código fuente que escribes a una forma que el ordenador puede ejecutar — normalmente código máquina. Le das tus archivos de texto y produce un ejecutable que corre solo, sin que el compilador esté presente. La traducción ocurre una vez, por adelantado.

¿Cuál es la diferencia entre un compilador y un intérprete?

Un compilador traduce todo tu programa una vez, por adelantado, a una forma ejecutable, así que el resultado arranca y corre rápido. Un intérprete lee y ejecuta tu código fuente directamente cada vez que el programa corre, sin paso de build separado. Los programas compilados suelen ser más rápidos; los interpretados son más rápidos de probar y más flexibles.

¿Cuáles son las etapas de un compilador?

Un compilador suele recorrer el análisis léxico (dividir el texto en tokens), el análisis sintáctico (construir un árbol de estructura), el análisis semántico (comprobar nombres y tipos), la optimización (hacer el programa más rápido o pequeño) y la generación de código (emitir el código máquina final o una forma intermedia). Un error en cualquier etapa detiene el build.

¿Es GHC un compilador?

Sí. GHC, el Glasgow Haskell Compiler, es el compilador estándar de Haskell. Lee tus archivos fuente .hs, los comprueba de tipos y los optimiza, y produce un ejecutable nativo que puedes correr solo. El sistema de tipos fuerte de Haskell hace que GHC atrape muchos bugs como errores de compilación antes de que el programa siquiera corra.

Guía independiente, mantenida por la comunidad. coldwa.st es un sitio de recursos de programación; este artículo es un texto explicativo original e inédito sobre cómo funcionan los compiladores. Las etapas descritas son estándar en los compiladores habituales; consulta la documentación de tu compilador para su comportamiento exacto.
Recomendado

Una máquina Linux para compilar y ejecutar tu código

Compilar un proyecto real — construir GHC, comprobar los tipos de una base Haskell grande y luego ejecutar el binario — es mucho más fácil en una máquina Linux de verdad que en un portátil. Un servidor en la nube te da acceso root para instalar una cadena de compilación y construir tu app en un entorno limpio. Infomaniak — un proveedor suizo que respeta la privacidad — ofrece servidores en la nube que configuras y alcanzas por SSH.

Ver Infomaniak Cloud →

Enlace de afiliado — apoya estas guías gratuitas.

Explora más explicaciones claras en nuestro índice de guías.