Firma UABC – FCITEC
Universidad Autónoma de Baja California · FCITEC, Unidad Valle de las Palmas
Ingeniería en Desarrollo de Software y Tecnologías Emergentes — Plan 2021-2
Paradigmas de Programación · Grupo 544, Subgrupo 0 · Dr. Jose Manuel Muñoz Contreras
Unidad I · 1.2 Niveles de descripción · Tema 1.2.4

Del código que escribes
al código que corre

Entre tu editor de texto y la pantalla que muestra el resultado hay un proceso invisible: alguien tiene que traducir lo que escribiste a algo que el hardware entienda. Dos estrategias compiten por ese trabajo — compilar y interpretar — y esta nota te lleva paso a paso por ambas.

⏱ Lectura + práctica: ~50 min Requiere: 1.2.1–1.2.3 (léxico, sintaxis, semántica) Incluye: 2 simulaciones + 1 quiz
código fuente → ¿compilar o interpretar? → ejecución
00Punto de partida

Traducir no es lo mismo que ejecutar

Ya viste que un lenguaje se puede analizar en cuatro niveles: léxico, sintáctico, semántico y pragmático (1.2.1–1.2.3). Ese análisis responde qué significa el programa. Pero falta una pregunta distinta: una vez que el programa es válido, ¿cómo llega a ejecutarse sobre el hardware real?

Definición

Traducir es convertir el código fuente a otra representación (código máquina, bytecode, etc.). Ejecutar es llevar a cabo esas instrucciones sobre un procesador, real o virtual. Un compilador y un intérprete son las dos estrategias clásicas para combinar ambas tareas — y difieren, sobre todo, en cuándo ocurre la traducción respecto a la ejecución.

→ A partir de aquí, todo lo que veas —los seis engranes del pipeline, el cursor que recorre líneas de código, la comparación final— son simulaciones interactivas. Tómate el tiempo de accionarlas: se entienden mejor viéndolas moverse que leyéndolas.
01Primera estrategia

¿Qué es un compilador?

Un compilador traduce todo el programa antes de que se ejecute una sola instrucción. Lee el código fuente completo, lo analiza en varias fases sucesivas, y al final entrega un archivo ejecutable independiente. Ejemplos: C, C++, Rust, Go, Haskell (GHC).

total = precio * cantidad + descuento
1
Léxico
2
Sintáctico
3
Semántico
4
Cód. intermedio
5
Optimización
6
Cód. final
Listo para compilar Pulsa «Siguiente fase» para ver cómo total = precio * cantidad + descuento avanza por cada etapa del compilador.
Fase 0 / 6
⚠ Ojo: las fases 1–3 (léxico, sintáctico, semántico) son exactamente los mismos análisis de 1.2.1–1.2.3. El compilador no inventa un proceso nuevo: retoma esos niveles de descripción y les agrega generación y optimización de código.

El resultado final —código máquina o un ejecutable— corre directamente sobre el hardware, sin que el compilador intervenga de nuevo. Por eso los programas compilados suelen arrancar y correr más rápido: todo el trabajo de traducción ya se pagó de antemano.

02Segunda estrategia

¿Qué es un intérprete?

Un intérprete no genera un ejecutable aparte: lee y ejecuta el código fuente línea por línea, en el momento. No hay una fase de "traducir todo primero" — traducir y ejecutar ocurren entrelazados. Ejemplos: Python (CPython), Ruby, PHP.

precio = 120 cantidad = 3 total = precio * cantidad print(total)
// la salida del programa aparecerá aquí, línea por línea
Línea 0 / 4
💡 Nota histórica: muchos intérpretes modernos ya no son "puros" — combinan interpretación con compilación just-in-time (JIT) para ganar velocidad sin perder portabilidad. V8 (JavaScript), PyPy y la JVM con HotSpot son los ejemplos de referencia.
03Frente a frente

Comparativa: compilador vs. intérprete

Ninguno es "mejor" en abstracto — cada uno optimiza para prioridades distintas. La tabla resume las diferencias que más importan al elegir un lenguaje para un proyecto real.

CriterioCompiladorIntérprete
Momento de traducciónAntes de ejecutar, una sola vezDurante la ejecución, cada vez
Velocidad de ejecuciónGeneralmente mayorGeneralmente menor
Detección de erroresEn tiempo de compilaciónHasta que la línea se ejecuta
Portabilidad del código fuenteDepende del destino (salvo bytecode)Alta — corre donde haya intérprete
Ciclo de desarrolloCompilar → ejecutar (más lento por iteración)Ejecutar directo (iteración rápida)
Ejemplos representativosC, C++, Rust, GoPython (CPython, que antes compila a bytecode), Ruby, PHP — la estrategia es propiedad de la implementación, no del lenguaje

Conviene compilar cuando…

  • Se necesita máximo rendimiento en producción (sistemas embebidos, videojuegos, cómputo de alto desempeño)
  • El entorno de despliegue es estable y conocido
  • Se quiere detectar errores antes de entregar el software al usuario final

Conviene interpretar cuando…

  • Se prioriza velocidad de desarrollo e iteración (prototipado, scripting)
  • Se necesita portabilidad sin recompilar para cada sistema operativo
  • Se trabaja en entornos interactivos (REPL, notebooks, exploración de datos)
04La realidad no es binaria

El caso híbrido: máquinas virtuales

La distinción compilador/intérprete no siempre es tajante. Muchos lenguajes modernos usan una estrategia mixta: compilan a un código intermedio portable (bytecode) que luego una máquina virtual interpreta o compila JIT en tiempo de ejecución.

Código fuente
.java
→
Compilador
javac
→
Bytecode
.class
→
JVM
intérprete + JIT
→
Ejecución
LenguajeCompila aEjecuta con
Javajavac → bytecode .classJVM (intérprete + JIT HotSpot)
C#CIL (Common Intermediate Language)CLR (.NET)
Pythonbytecode .pycMáquina virtual de CPython
⚠ Piensa en compilar/interpretar como los dos extremos de un espectro, no como una etiqueta fija por lenguaje. La misma implementación de Python compila a bytecode y luego interpreta ese bytecode — es, en el fondo, un caso híbrido disfrazado de "lenguaje interpretado".
05Verificación de aprendizaje

Práctica: clasifica el lenguaje

Para cada lenguaje, decide si su estrategia principal es compilado, interpretado o híbrido (bytecode + máquina virtual / JIT). Recibirás retroalimentación inmediata.

Rust ¿cómo se traduce y ejecuta?
Ruby ¿cómo se traduce y ejecuta?
Java ¿cómo se traduce y ejecuta?
JavaScript (V8) ¿cómo se traduce y ejecuta?
C ¿cómo se traduce y ejecuta?
Python (CPython) ¿cómo se traduce y ejecuta?
Aciertos: 0 / 6
🤔 Para discutir: un estudiante dice "Python es más lento que C porque es un lenguaje peor diseñado." ¿Qué matiz le harías usando lo visto en esta nota?
06Síntesis

Lo esencial de 1.2.4

Compiladores e intérpretes son dos estrategias para resolver el mismo problema —llevar el código fuente a ejecución— con compromisos distintos entre velocidad, portabilidad y ciclo de desarrollo. La mayoría del software real que usas hoy vive en algún punto intermedio del espectro, combinando ambas ideas.

Para recordar

Compilar = traducir todo antes de ejecutar. Interpretar = traducir y ejecutar entrelazados, línea por línea. Híbrido = compilar a un código intermedio portable que una máquina virtual interpreta o compila JIT.

Preguntas de reflexión

Lecturas recomendadas

Sebesta, R. (2015). Concepts of Programming Languages (11.ª ed.), cap. 1. Pearson. Scott, M. (2015). Programming Language Pragmatics (4.ª ed.), cap. 1–2. Morgan Kaufmann.