wandres.dev
ONTOLOGÍA · El mapa de Kotlin

La ontología de Kotlin

El mapa mental del lenguaje: el sistema de tipos y la nulabilidad, el estilo funcional y los DSLs, las corrutinas y Flow, el compilador K2 y los cuatro backends de la plataforma.

⏱ 12 min

Kotlin cumplió quince años en 2026 y llegó a la versión 2.4 sin haber roto nunca de verdad a sus usuarios, algo insólito en un lenguaje que en ese tiempo pasó de ser un sustituto pragmático de Java a compilar para JVM, para binario nativo, para WebAssembly y para JavaScript. Ese equilibrio no salió gratis: cada azúcar sintáctico que parece cómodo esconde una decisión de diseño y una transformación concreta del compilador. Este track trata del lenguaje en sí, no de ninguna plataforma que lo use. Vamos a estudiar qué hay debajo de cada palabra clave, qué código genera y qué cuesta.

🎯 Al terminar esta lección sabrás
  • Ver el mapa mental completo del lenguaje Kotlin moderno, de los tipos al compilador.
  • Entender que la nulabilidad y las corrutinas son propiedades del sistema de tipos y del compilador, no convenciones.
  • Situar K2, el IR y KSP como la infraestructura que sostiene todo lo demás.
  • Reconocer el camino completo desde la sintaxis hasta el diseño de API multiplataforma.

El territorio, de un vistazo

mindmap
root((Kotlin))
  Tipos
    Nulabilidad
    Clases y data
    Sealed
    Genericos y varianza
  Funcional
    Lambdas
    Extensiones
    inline
    DSLs
  Concurrencia
    Corrutinas
    Flow
    Canales
    Estructurada
  Compilador
    K2
    IR
    KSP
    Plugins
  Plataformas
    JVM
    Native
    Wasm
    JS
    Multiplataforma
  Produccion
    Testing
    API
    Rendimiento

Las ideas clave

🛡️

La nulabilidad vive en los tipos

String y String? son tipos distintos, y el compilador se niega a mezclarlos. La ausencia de valor deja de ser un fallo de disciplina para convertirse en un error de compilación que no puedes ignorar.

🧵

Las corrutinas no son hilos

Una función suspend no reserva ningún hilo: el compilador la reescribe como una máquina de estados que puede parar y reanudarse. La concurrencia se vuelve barata porque deja de ser un recurso del sistema operativo.

⚙️

K2 lo desbloqueó todo

La reescritura del frontend que llegó en Kotlin 2.0 no fue solo velocidad: dio un modelo semántico unificado sobre el que se apoyan la inferencia moderna, los plugins de compilador y los context parameters que se estabilizaron en 2.4.

🌍

Un lenguaje, cuatro backends

El mismo código fuente atraviesa el IR común y sale como bytecode de la JVM, como binario nativo con LLVM, como WebAssembly o como JavaScript. Multiplataforma no es una librería: es la arquitectura del compilador.

Por qué importa

En Kotlin casi nada es azúcar: casi todo es una transformación con un coste que puedes conocer

Hay una diferencia enorme entre saber escribir Kotlin y saber qué hace Kotlin, y esa diferencia es exactamente la que separa a quien colecciona recetas de quien predice el comportamiento de su programa antes de ejecutarlo. Casi ninguna característica del lenguaje es puro maquillaje sintáctico sobre lo mismo de siempre: casi todas son transformaciones concretas del compilador, con un código generado concreto y un coste concreto. Marcar una función como suspend no la vuelve mágicamente asíncrona, sino que añade un parámetro oculto de tipo Continuation y reescribe el cuerpo como una máquina de estados donde cada punto de suspensión es una etiqueta a la que se puede volver; por eso las corrutinas son baratas y por eso una suspensión dentro de un bucle cerrado tiene un coste que se puede razonar. Marcar una lambda como inline no es una sugerencia de rendimiento: elimina literalmente la asignación del objeto lambda copiando el cuerpo en el punto de llamada, que es la razón de que let, apply o forEach no generen basura y de que return no local funcione. Una data class no es una clase con menos ruido, sino una clase para la que el compilador genera equals, hashCode, toString, copy y los componentN, con todas las consecuencias que eso tiene sobre la herencia y la compatibilidad binaria. Una value class a veces desaparece por completo y a veces hace boxing según dónde aparezca, y saber en qué casos ocurre cada cosa es la diferencia entre una abstracción gratis y una abstracción cara. Quien aprende Kotlin como una lista de idiomatismos que hay que imitar se queda en la superficie y se sorprende cada vez que el perfilador dice algo raro. Quien aprende qué genera el compilador en cada caso puede leer el bytecode cuando hace falta, predecir el rendimiento sin medirlo a ciegas y diseñar APIs sabiendo qué le está pidiendo a quien las use. Ese es el nivel al que apunta este track.

El camino

  • Niveles 1–11 · La base del lenguaje — sintaxis y valores, nulabilidad, clases y objetos, sealed, delegación y propiedades con sus accesores.
  • Niveles 12–21 · Kotlin idiomático — lambdas y funciones de orden superior, funciones de ámbito, inline, genéricos y varianza, colecciones y secuencias, DSLs con receptores, contratos, context parameters y el manejo de errores.
  • Niveles 22–27 · Concurrencia — corrutinas por dentro: contexto, dispatchers, concurrencia estructurada, cancelación, Flow frío y caliente, canales y patrones de sincronización.
  • Niveles 28–32 · El compilador — K2 y el frontend, interoperabilidad con la JVM, value class y clases en línea, reflexión y KSP para generar código.
  • Niveles 33–35 · Multiplataforma — KMP y los conjuntos de fuentes, Kotlin/Native con su recolector 2.0 sin objetos congelados, y los backends de Wasm y JS.
  • Niveles 36–39 · Producción — testing del lenguaje, diseño de API y compatibilidad binaria, rendimiento y medición, y la síntesis final.
⚔️ Sitúate en el mapa
  1. Coge una función tuya con una lambda y pregúntate si el compilador la está insertando o está asignando un objeto en cada llamada.
  2. Busca en tu código el último !! que escribiste y reconstruye qué información perdiste para tener que llegar ahí.
  3. Localiza una función suspend y dibuja a mano sus puntos de suspensión: ahí están los estados de la máquina que genera el compilador.
  4. Comprométete con la premisa del track: cada palabra clave que uses tiene un código generado detrás, y tu trabajo es conocerlo.