Todo programa que escribes tiene que atravesar una frontera: la que separa el texto que tú entiendes del código que la máquina ejecuta. Esta sesión desarma esa frontera pieza por pieza — vas a ver, en vivo, cómo un compilador desmonta tu código en fases y cómo un intérprete lo ejecuta línea por línea, con un motor de análisis real corriendo en esta misma página.
01-Unidad-I-Lenguajes-Sesion2.md (guion de la Sesión 2) y respeta la numeración de Unidad I - Lenguajes de programación.md. Complementa, sin sustituir, tu nota interactiva de scroll vertical ya generada para este mismo subtema.
Un programa fuente, por sí solo, no significa nada para el hardware. Alguien —compilador o intérprete— tiene que tender el puente entre lo que escribiste y lo que la máquina puede ejecutar. La diferencia entre ambos no es qué hacen, sino cuándo y cómo lo hacen.
Un traductor editorial recibe el manuscrito completo, lo traduce de principio a fin, revisa consistencia terminológica, y entrega un libro ya terminado. Nadie lee mientras se traduce. Así trabaja un compilador: procesa todo el programa antes de que corra una sola instrucción.
Un intérprete de conferencia no espera a que el orador termine el discurso: traduce y transmite frase por frase, en tiempo real. Si el orador dice algo ambiguo, el error de traducción aparece en el momento, no antes. Así trabaja un intérprete de código: traduce y ejecuta cada instrucción, una tras otra.
| Aspecto | Compilador | Intérprete |
|---|---|---|
| ¿Cuándo traduce? | Todo el programa, antes de ejecutar | Cada instrucción, en el momento de ejecutarla |
| ¿Qué entrega? | Un ejecutable independiente | Ningún archivo nuevo — ejecuta directo |
| Ejemplos | C, C++, Rust, Go | Python (CPython), Ruby, PHP |
Vas a ver total = precio * cantidad + descuento —tu ejemplo de 01-Unidad-I-Lenguajes-Sesion2.md— atravesar las seis fases reales de un compilador. Cada fase es clickeable: al seleccionarla, el panel de abajo ejecuta esa etapa con un motor de análisis léxico/sintáctico/semántico escrito para esta página.
Edita el programa de abajo (lenguaje reducido: asignaciones y print) y pulsa «Ejecutar siguiente línea». Cada línea se lee, se analiza y se ejecuta de inmediato con un intérprete real construido en JavaScript para esta página — sin fase de generación de código final separada.
variable = expresión y print(variable), con + - * / y paréntesis.| Variable | Valor |
|---|
La mayoría del software que usas hoy no es "puramente" compilado ni "puramente" interpretado. Java, C# y Python combinan ambas estrategias: compilan a un código intermedio portable (bytecode) que una máquina virtual interpreta o compila just-in-time (JIT).
.javajavac.class| Lenguaje | Compila a | Ejecuta con | Estrategia |
|---|---|---|---|
| Java | javac → bytecode .class | JVM (intérprete + JIT HotSpot) | Híbrido |
| C# | CIL (Common Intermediate Language) | CLR (.NET) | Híbrido |
| Python | bytecode .pyc | Máquina virtual de CPython | Híbrido |
| C | Código máquina nativo | Hardware directamente | Compilado puro |
| Ruby (clásico) | — | Intérprete línea a línea | Interpretado puro |
Arrastra los elementos (o usa las flechas ▲▼ si usas teclado o pantalla táctil) hasta que queden en el orden correcto de ejecución.
Escribe tu propio fragmento (misma gramática reducida) y observa el pipeline completo del compilador reaccionar a tu código real — tokens, árbol, chequeo de tipos, código intermedio, optimización y código final generados por el mismo motor que usa esta página, no una animación pregrabada.
Usa el mismo panel de la diapositiva 03:
10 preguntas. Si fallas en el primer intento verás una pista antes de la respuesta correcta — la retroalimentación siempre explica el concepto, no solo si acertaste.
01-Unidad-I-Lenguajes-Sesion2.md (guion de clase original), Unidad I - Lenguajes de programación.md (nota conectora, numeración 1.2.4), 1.2.4-Compiladores-e-Interpretes.html (versión scroll vertical, paleta institucional — recurso hermano de esta presentación). Lecturas: 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.
Describe, con tus propias palabras, qué sucede internamente al compilar este fragmento: promedio = (nota1 + nota2 + nota3) / 3. Menciona explícitamente qué hace cada una de las seis fases con este fragmento.