Parte 8 — Cómo funcionan los lenguajes

⏮️ Parte 7 · ⬅️ Programa · 📚 Índice · ⏭️ Parte 9

16 clases · rango 123–138 · clases de código · nivel intermedio · ~40 h (cronograma)

🧭 Lo que ocurre bajo el código: compilación, memoria, concurrencia y por qué falla lo que falla.


🧭 De qué trata esta parte

Esta es la parte que convierte la explicación en comprensión. Todo lo estudiado hasta aquí —tipos, funciones, estructuras, paradigmas— descansa sobre un conjunto de mecanismos concretos: un pipeline de compilación, una pila, un heap, una estrategia para liberar memoria y un modelo de ejecución concurrente.

El recorrido baja por capas. Primero el viaje del texto a la acción y las tres respuestas —compilador, intérprete, JIT— con su comparación AOT/JIT. Después, dónde viven los datos: pila, heap y las referencias que los alcanzan. Luego, las tres respuestas a «quién libera la memoria»: manual en C, recolector en Java o Go, y propiedad con préstamos en Rust y C++, comparadas por fin en el mismo sitio.

El tramo final es la concurrencia vista desde abajo: por qué cuenta += 1 no es atómico, qué son las corrutinas y los canales, cómo el modelo de actores elimina lo compartido y por qué el código que escribes no es el que se ejecuta. Cierra con el diagnóstico: clasificar un error por la fase en que nace y depurar en cada runtime.

🎒 Qué necesitas traer

Las Partes 5 y 6, en particular propiedad y ciclo de vida (103), paso de parámetros (079–081) y la Parte 7 para la concurrencia (121–122).

🎯 Qué sabrás hacer al terminar

Resultados comprobables: si no puedes hacerlos, la parte no está cerrada.

  1. Situar cualquier mensaje de error en la fase del pipeline donde nace.
  2. Explicar la diferencia práctica entre AOT y JIT en arranque, rendimiento y tamaño.
  3. Decir qué vive en la pila y qué en el heap para un programa dado, en cada lenguaje.
  4. Comparar gestión manual, recolector y propiedad nombrando qué garantiza y qué cuesta cada uno.
  5. Reproducir una condición de carrera y explicar por qué la reordenación la hace posible.
  6. Depurar con el instrumental nativo de cada runtime en lugar de a base de imprimir.

🗺️ El recorrido, clase a clase

Las clases están agrupadas en bloques por la razón que las une. El orden es secuencial: cada una asume la anterior.

🔹 Del texto a la acción · clases 123–126

El pipeline de compilación y las tres formas de ejecutar lo que produce.

🔹 Dónde viven los datos · clases 127–129

Pila, marco de llamada, heap y las referencias que lo enlazan todo.

🔹 Las tres respuestas a «quién libera» · clases 130–132

Manual, recolector y propiedad: el mismo problema con tres contratos incompatibles.

🔹 Hacer varias cosas a la vez · clases 133–136

Memoria compartida, corrutinas y canales, actores y el modelo de memoria.

🔹 Cuando algo falla · clases 137–138

Clasificar el error por su fase y diagnosticarlo con las herramientas del runtime.

⚠️ Los malentendidos que esta parte corrige

Se suele creer Lo que ocurre en realidad
«El recolector de basura evita las fugas de memoria.» Evita las clásicas, no las lógicas: una referencia viva que ya no necesitas es una fuga que el GC nunca recogerá.
«Rust es seguro porque no deja hacer cosas.» Es seguro porque mueve una comprobación que en C hace el programador —y a veces olvida— al compilador.
«Si el código es correcto, no hay condiciones de carrera.» Compilador y CPU reordenan. Sin sincronización explícita, «correcto» leído de arriba abajo no significa correcto al ejecutarse.

🧪 Cómo estudiar esta parte

  1. Lee el modelo y el pseudocódigo primero. Si entiendes el algoritmo neutral, las diez implementaciones son diez traducciones, no diez problemas.
  2. Lee las diez implementaciones, no solo la de tu lenguaje. El aprendizaje está en el contraste: ahí se distingue lo esencial del accidente sintáctico.
  3. Ejecuta el verificador (python scripts/verificar_equivalencia.py NNN) y comprueba tú mismo que coinciden. Fuerza después un caso límite y observa quién se rompe primero.
  4. Lee primos.md para ver el mismo programa en la familia de cada lenguaje: es donde el concepto deja de estar atado a diez nombres concretos.
  5. Haz el reto de transferencia. Portarlo a un lenguaje que no dominas es la única prueba real de que aprendiste el concepto y no la sintaxis.

📚 Fuentes de referencia de esta parte

Cada clase cita estos libros en su sección de referencias. No se reproduce su contenido: la redacción es original.

🔗 Qué abre esta parte

Entendida la máquina, la Parte 9 se ocupa de la otra mitad del oficio: construir software que otras personas puedan mantener.


⏮️ Parte 7 · ⬅️ Programa · 📚 Índice · ⏭️ Parte 9