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.
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.
- 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
RendimientoLas 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
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 parametersy el manejo de errores. - Niveles 22–27 · Concurrencia — corrutinas por dentro: contexto, dispatchers, concurrencia estructurada, cancelación,
Flowfrío y caliente, canales y patrones de sincronización. - Niveles 28–32 · El compilador — K2 y el frontend, interoperabilidad con la JVM,
value classy 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.
- 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.
- Busca en tu código el último
!!que escribiste y reconstruye qué información perdiste para tener que llegar ahí. - Localiza una función
suspendy dibuja a mano sus puntos de suspensión: ahí están los estados de la máquina que genera el compilador. - Comprométete con la premisa del track: cada palabra clave que uses tiene un código generado detrás, y tu trabajo es conocerlo.