wandres.dev
ONTOLOGÍA · El mapa de Lua

La ontología de Lua

El mapa mental del lenguaje: valores y tablas, funciones y closures, metatablas y corrutinas, el recolector y la máquina virtual, la API C y el ecosistema que lo embebe.

⏱ 12 min

Lua es un lenguaje pequeño hasta el escándalo: ocho tipos, un solo tipo compuesto, un manual que se lee en una tarde y un intérprete que cabe en unos cientos de kilobytes. Esa pequeñez no es minimalismo estético ni juventud del proyecto: es un requisito de ingeniería. Lua nació para vivir dentro de otro programa —un juego, un servidor, un editor— y todo lo que ves en él está subordinado a esa condición. Aquí no vas a aprender un lenguaje con baterías incluidas; vas a aprender un conjunto de piezas primitivas y el arte de componerlas. Y llegas en un momento interesante: Lua 5.5 salió en diciembre de 2025 y el mundo real sigue partido en dos, porque LuaJIT no lo ha seguido.

🎯 Al terminar esta lección sabrás
  • Ver el mapa mental completo del lenguaje Lua, del núcleo al ecosistema.
  • Entender por qué la tabla y la metatabla explican casi todo lo demás.
  • Situar el runtime —recolector, máquina virtual, bytecode— y la API C.
  • Reconocer el camino de 29 niveles y dónde encaja cada bloque.

El territorio, de un vistazo

mindmap
root((Lua))
  Nucleo
    Valores
    Tablas
    Funciones
    Closures
  Mecanismos
    Metatablas
    Corrutinas
    Iteradores
    Errores
  Runtime
    Recolector
    Maquina virtual
    Bytecode
  API C
    Pila
    Userdata
    Embeber
  Ecosistema
    LuaJIT
    Neovim
    Juegos
    nginx

Las ideas clave

🧱

Una tabla para gobernarlas a todas

Lua tiene un único tipo compuesto. La misma tabla hace de array, de diccionario, de objeto, de módulo, de espacio de nombres y de entorno global. Aprender la tabla por dentro —parte secuencia, parte hash— es aprender la mitad del lenguaje.

🔌

Diseñado para ser embebido

Lua no aspira a ser una plataforma con gestor de paquetes y framework web. Su público es el programa anfitrión que lo incrusta: motores de juego, nginx, routers, Neovim. Por eso la API C no es un anexo avanzado, es tan parte del lenguaje como la sintaxis.

🪞

El único mecanismo de extensión

No hay clases, ni propiedades, ni sobrecarga de operadores como características separadas. Hay metatablas, y con ellas se construyen todas: herencia, encapsulación, proxies, operadores, control de acceso a globales. Un mecanismo, muchos idiomas.

📖

Cabe entero en tu cabeza

El manual de referencia completo se lee en un rato. Eso es una decisión de diseño deliberada, no una carencia: un lenguaje que un desarrollador de juegos puede dominar en un fin de semana es un lenguaje que se adopta.

Por qué importa

El lenguaje más fácil de aprender y uno de los más difíciles de dominar

Lua es el lenguaje más fácil de aprender y uno de los más difíciles de dominar, y la razón es exactamente la misma en los dos casos: te da cuatro piezas y espera que construyas el resto. No hay clases, hay metatablas y un campo __index que redirige búsquedas fallidas. No hay módulos privilegiados, hay tablas y una función llamada require que las cachea. No hay async, hay corrutinas y tú decides el planificador que las despierta. Quien llega desde un lenguaje con baterías incluidas siente durante las primeras semanas que le falta absolutamente todo: no encuentra la palabra clave class, ni un sistema de tipos, ni una biblioteca estándar con más de un puñado de funciones, ni siquiera una forma canónica de dividir un texto. Quien entiende el diseño ve otra cosa: que cada idioma de Lua —la clase, la herencia múltiple, el módulo, el iterador con estado, el sandbox que aísla código no confiable, el objeto inmutable, el sistema de eventos— es una composición explícita de esas mismas cuatro piezas, escrita en unas pocas líneas que puedes leer y modificar. Ese es el intercambio: el lenguaje renuncia a decidir por ti para poder caber en unos cientos de kilobytes y vivir dentro de un motor de juego, de un servidor web, de un router o de tu editor de texto, sin imponerle al anfitrión ni un runtime pesado ni un modelo de objetos ajeno. Dominar Lua, por tanto, no consiste en memorizar una biblioteca ni en aprenderse las excepciones de una gramática barroca: consiste en desarrollar el criterio para construir, con lo poquísimo que hay, exactamente la abstracción que tu problema necesita —y en saber cuándo no construir ninguna.

El camino

  • Niveles 1–9 · El núcleo — el lenguaje y su filosofía, tipos y valores, números y cadenas, la tabla por dentro, funciones, closures y upvalues, ámbito léxico y _ENV, con las novedades de 5.5 por medio: declaración explícita de variables globales, tablas de varargs con nombre y variables de control del for ya inmutables.
  • Niveles 10–14 · Los mecanismos — metatablas y metamétodos, objetos y herencia, módulos y require, y el modelo de errores.
  • Niveles 15–20 · Control y biblioteca — corrutinas, iteradores y el protocolo for, la biblioteca estándar, los patrones de Lua y metaprogramación.
  • Niveles 21–23 · El runtime — el recolector de basura, que en 5.5 hace las recolecciones mayores de forma incremental, los arrays compactos que recortan cerca del 60% la memoria de las tablas grandes, la máquina virtual de registros y el bytecode.
  • Niveles 24–27 · La API C y embeber — la pila virtual, C llamando a Lua y Lua llamando a C, userdata y sandboxing.
  • Niveles 27–29 · El otro Lua y el cierre — LuaJIT, anclado en la semántica de 5.1 y por eso un mundo aparte, el rendimiento real y la síntesis final.
⚔️ Sitúate en el mapa
  1. Abre un intérprete y escribe una tabla con claves numéricas y de texto a la vez: acabas de usar array y diccionario en la misma estructura.
  2. Busca en el manual de referencia la lista completa de tipos. Son ocho. Cuenta cuántos tiene tu lenguaje habitual.
  3. Localiza en cualquier proyecto Lua real la línea donde se crea una “clase”: verás una tabla y una metatabla, nunca una palabra clave.
  4. Comprométete con la premisa: aquí no hay funciones ocultas que resuelvan tu problema; hay piezas, y la composición la pones tú.