Kotlin es lo que pasa cuando una empresa que hace herramientas de desarrollo —JetBrains— diseña un lenguaje: cada decisión responde a un problema concreto que habían visto miles de veces en código Java real. No inventa paradigmas; quita fricción, y esa modestia es la razón de su éxito.
🎯 Por qué está en este programa
Kotlin es un primo de la familia JVM (Atlas), cuyo representante en el núcleo es Java.
Aporta al programa la comparación más didáctica de todo el Atlas: el mismo programa, en la misma máquina virtual, con la misma biblioteca — y la mitad de líneas. Y aporta dos conceptos concretos: la nulabilidad en el sistema de tipos (clase 100) y las corrutinas con concurrencia estructurada (clase 134).
| Año | 2011; 1.0 en 2016; oficial en Android desde 2017; 2.0 en 2024 |
| Autoría | JetBrains, con Andrey Breslav al frente del diseño inicial |
| Familia | JVM; con influencia de Scala, C#, Groovy y ML |
| Paradigma | Multiparadigma: OO y funcional, con orientación a DSL |
| Tipado | Estático, con inferencia y nulabilidad en el tipo |
| Memoria | La de la JVM; en Native, con conteo de referencias |
| Ejecución | Bytecode JVM; también Kotlin/Native, Kotlin/JS y Kotlin/Wasm |
| Estado | 🟢 Oficial en Android, en crecimiento en servidor y multiplataforma |
JetBrains hacía IntelliJ IDEA, y su producto estaba escrito en Java. En 2010 tenían dos problemas: Java evolucionaba despacio —los genéricos habían tardado ocho años, las lambdas tardarían diez— y Scala, que les gustaba, compilaba demasiado lento para una base de código de su tamaño.
Así que hicieron el suyo, con dos requisitos poco habituales y muy reveladores:
.java y .kt en el mismo proyecto.Esa primera decisión es la que explica la adopción: no hubo que elegir. Es la estrategia opuesta a la de D frente a C++ (clase 175), y funcionó.
El punto de inflexión llegó en 2017, cuando Google anunció Kotlin como lenguaje oficial de Android, y en 2019 lo declaró preferente. El contexto ayudaba: Google estaba en pleito con Oracle por las APIs de Java, y Kotlin ofrecía una salida.
Kotlin 2.0 (2024) trajo el compilador K2, con mejoras grandes de velocidad, y consolidó Kotlin Multiplatform: el mismo código de negocio compilado a JVM, a nativo para iOS, a JavaScript y a WebAssembly.
Es la aportación más transferible de esta ficha (clase 100):
var nombre: String = "Ana"
nombre = null // ✗ NO COMPILA
var apodo: String? = null // ← el ? declara que puede faltar
println(apodo?.length) // llamada segura: si es nulo, da nulo
println(apodo ?: "sin apodo") // operador Elvis: valor por defecto
println(apodo!!.length) // afirmación: falla si es nulo
Tony Hoare llamó a la referencia nula "su error del billón de dólares", y Kotlin lo resuelve como Rust, Swift y Elm: separando en el sistema de tipos lo que puede faltar de lo que no.
Y el segundo concepto, las corrutinas con concurrencia estructurada:
coroutineScope { // ← el ÁMBITO es la clave
val a = async { pedirUsuario() }
val b = async { pedirPedidos() }
procesar(a.await(), b.await())
} // si algo falla aquí dentro, se CANCELA todo lo lanzado en este ámbito
La concurrencia estructurada significa que una tarea no puede sobrevivir al ámbito que la lanzó (clase 135). Eso elimina de raíz las tareas huérfanas y las cancelaciones a medias, que son el problema clásico del código asíncrono — y es una idea que después han adoptado Java (Loom), Swift y Python.
Y hay una tercera cosa que Kotlin hace especialmente bien y que la clase 163 aprovecha: los DSL.
dependencies { // ← esto es Kotlin, no un formato de configuración
implementation("org.jetbrains:annotations:24.0.0")
}
Las lambdas con receptor y las funciones de extensión permiten construir lenguajes de dominio que parecen configuración y están comprobados por el compilador — que es lo que Gradle usa.
expect/actual para
lo específico de cada plataforma.value class) sin coste en ejecución, y contratos que ayudan al análisis
de flujo.kotlinx completo: serialización con generación de código en compilación —sin reflexión
(clase 159)—, fechas, corrutinas y entrada/salida.kotlinc main.kt -include-runtime -d venta.jar && java -jar venta.jar
kotlin main.kts # como guion, sin compilar
./gradlew build test # lo habitual (clases 143 y 147)
./gradlew ktlintCheck detekt # estilo y análisis (clase 146)
fun main() {
val (precio, cantidad, descuento) = readLine()!!.split(" ").map { it.toDouble() }
val total = precio * cantidad * (1 - descuento)
println("Total: %.2f".format(total))
}
Lo que hay que ver, comparando con Java línea a línea.
val (a, b, c) no existe en Java, y es de las cosas que más se echan de
menos al volver.!! después de readLine() es la nulabilidad en acción: readLine() devuelve String?
porque puede no haber línea, y !! afirma que la hay. En Java eso sería un null silencioso
esperando a explotar, y aquí está escrito en el código.val es inmutable —var es la mutable—, y la convención del ecosistema es usar val por
defecto (clase 102), igual que Rust y Scala."%.2f".format(total) llama por debajo a String.format de Java: la interoperabilidad no es
una capa, es el mismo objeto. Y por eso Locale sigue siendo una trampa a vigilar, igual que en
Java.⏮️ Volver al Atlas · 🗂️ Todas las fichas · 🔗 Relacionadas: Java · Scala · Swift · Groovy · C#