Kotlin (/ˈkɒtlɪn/) é unha linguaxe de programación de alto nivel multiplataforma, de tipado estático, e de propósito xeral con inferencia de tipos. Kotlin está deseñado para interoperar totalmente con Java, e a versión JVM da biblioteca estándar de Kotlin depende da biblioteca de clases de Java, pero a inferencia de tipos permite que a súa sintaxe sexa máis concisa. Kotlin está dirixido principalmente á JVM, pero tamén compila en JavaScript (por exemplo, para aplicacións web frontend que usan React) ou código nativo a través de LLVM (por exemplo, para aplicación nativas de iOS que comparten lóxica empresarial con aplicacións de Android). Os custos de desenvolvemento da linguaxe corren a cargo de JetBrains, mentres que a Fundación Kotlin protexe a marca rexistrada Kotlin.

O 7 de maio de 2019, Google anunciou que a linguaxe de programación Kotlin se convertera na súa linguaxe preferida para os desenvolvedores de aplicacións de Android. Desde o lanzamento de Android Studio 3.0 en outubro de 2017, Kotlin incluíuse como alternativa ao compilador estándar de Java. O compilador Kotlin de Android emite bytecode de Java 8 por defecto (que se executa en calquera JVM posterior), pero permite orientarse dende Java 9 ata Java 20 para optimizar, ou permite máis funcionalidades; ten compatibilidade con interoperabilidade de clases de rexistro bidireccional para JVM, introducida en Java 16, considerada estable a partir de Kotlin 1.5.

Kotlin ten compatibilidade coa web con Kotlin/JS, a través dun backend intermedio baseado en representacións que foi declarado estable desde a versión 1.8, lanzada en decembro de 2022. Kotlin/Native (por exemplo, compatibilidade con Apple silicon) foi declarado estable desde a versión 1.9.20, lanzada en novembro de 2023.

Historia miniatura|Mascota de Kotlin chamada Kodee (versión regular) miniatura|Mascota de Kotlin chamada Kodee (versión pequena)

Nome O nome deriva da illa Kotlin, unha illa rusa no Golfo de Finlandia, preto de San Petersburgo. Andrey Breslav, antigo deseñador principal de Kotlin, mencionou que o equipo decidiu nomeala como unha illa, imitando a linguaxe de programación Java que comparte nome coa illa indonesia de Xava.

Desenvolvemento A primeira confirmación no repositorio Git de Kotlin foi o 8 de novembro de 2010.

En xullo de 2011, JetBrains presentou o Proxecto Kotlin, unha nova linguaxe para a JVM, que levaba un ano en desenvolvemento. O líder de JetBrains, Dmitry Jemerov, dixo que a maioría das linguaxes non tiñan as características que buscaban, coa excepción de Scala. Non obstante, citou o lento tempo de compilación de Scala como unha deficiencia. Un dos obxectivos declarados de Kotlin é compilar tan rápido como Java. En febreiro de 2012, JetBrains publicou o proxecto en código aberto baixo a licenza Apache 2.

JetBrains esperaba que Kotlin impulsase as vendas de IntelliJ IDEA.

Kotlin 1.0 foi lanzado o 15 de febreiro de 2016. Esta considérase a primeira versión oficialmente estable, e JetBrains comprometeuse coa compatibilidade con versións anteriores a longo prazo a partir desta versión.

No Google I/O de 2017, Google anunciou soporte de primeira clase para Kotlin en Android. O 7 de maio de 2019, Google anunciou que a partir de ese momento, Kotlin era a súa linguaxe preferida para os desenvolvedores de aplicacións de Android.

Deseño O xefe de desenvolvemento, Andrey Breslav, afirmou que Kotlin está deseñado para ser unha linguaxe orientada a obxectos de potencia industrial e unha "mellor linguaxe" que Java, pero que aínda así sexa totalmente interoperable co código Java, o que permite ás empresas facer unha migración gradual de Java a Kotlin.

Os puntos e coma son opcionais como terminador de instrucións; na maioría dos casos un salto de liña é suficiente para que o compilador deduza que a instrución rematou.

As declaracións de variables e as listas de parámetros de Kotlin teñen o tipo de dato despois do nome da variable (e cun separador de dous puntos), de xeito similar a Ada, BASIC, Pascal, TypeScript e Rust. Isto, segundo un artigo de Roman Elizarov, actual xefe do proxecto, resulta na aliñación dos nomes das variables e é máis agradable á vista, especialmente cando hai unhas poucas declaracións de variables sucesivas e un ou máis dos tipos son demasiado complexos para a inferencia de tipos ou necesitan ser declarados explicitamente para que os lectores humanos os entendan.

A influencia de Scala pódese ver no amplo soporte tanto para a programación orientada a obxectos como para a funcional e nunha serie de características específicas:

Existe unha distinción entre variables mutables e inmutábeis (palabra clave var vs val). Todas as clases son públicas e finais (non herdables) por defecto. As funcións e os métodos admiten argumentos predeterminados, listas de argumentos de lonxitude variable e argumentos nomeados.

Kotlin 1.3 engadiu soporte para contratos, que son estables para as declaracións estándar da biblioteca, pero aínda experimentais para as declaracións definidas polo usuario. Os contratos están inspirados no paradigma de programación deseño por contrato de Eiffel.

Seguindo ScalaJS, o código de Kotlin pódese transpilar a JavaScript, o que permite a interoperabilidade entre o código escrito nas dúas linguaxes. Isto pódese usar para escribir aplicacións web completas en Kotlin ou para compartir código entre un backend de Kotlin e un frontend de JavaScript.

Sintaxe

Estilo de programación procedimental Kotlin relaxa a restrición de Java de permitir que os métodos e variables estáticos existan só dentro dun corpo de clase. Os obxectos e funcións estáticos pódense definir no nivel superior do paquete sen necesidade dun nivel de clase redundante. Para compatibilidade con Java, Kotlin proporciona unha anotación JvmName que especifica un nome de clase usado cando se visualiza o paquete desde un proxecto Java. Por exemplo, @file:JvmName("JavaClassName").

Punto de entrada principal Do mesmo xeito que en C, C++, C#, Java, e Go, o punto de entrada a un programa de Kotlin é unha función chamada "main", á que se lle pode pasar unha lista que contén calquera argumento da liña de comandos. Isto é opcional desde Kotlin 1.3. Admítese a interpolación de cadeas ao estilo shell de Perl, PHP, e Unix. Tamén se admite a inferencia de tipo.// Exemplo Hello, World! fun main() { val scope = "World" println("Hello, $scope!") }fun main(args: Array<String>) { for (arg in args) println(arg) }

Funcións de extensión De xeito similar a C#, Kotlin permite engadir unha función de extensión a calquera clase sen as formalidades de crear unha clase derivada con novas funcións. Unha función de extensión ten acceso a toda a interface pública dunha clase, que pode usar para crear unha nova interface de función para unha clase de destino. Unha función de extensión aparecerá exactamente como unha función da clase e mostrarase na inspección de finalización de código das funcións da clase. Por exemplo:package com.example.myStringExtensions

fun String.lastChar(): Char = get(length - 1)

>>> println("Kotlin".lastChar())

Ao colocar o código anterior no nivel superior dun paquete, a clase String amplíase para incluír unha función lastChar que non estaba incluída na definición orixinal da clase String.// Sobrecarga do operador '+' usando unha función de extensión operator fun Point.plus(other: Point): Point { return Point(x + other.x, y + other.y) }

>>> val p1 = Point(10, 20) >>> val p2 = Point(30, 40) >>> println(p1 + p2) Point(x=40, y=60) Funcións de ámbito Kotlin ten cinco funcións de ámbito, que permiten cambiar o ámbito dentro do contexto dun obxecto. As funcións de ámbito son let, run, with, apply, e also.

Desempaquetar argumentos co operador de dispersión Semellante a Pitón, o asterisco de operador estendido (*) desempaqueta o contido dunha lista como argumentos individuais para unha función, por exemplo:fun main(args: Array<String>) { val list = listOf("args: ", *args) println(list) } Desestruturación de declaracións As declaracións de desestruturación descompoñen un obxecto en varias variables á vez, por exemplo, un obxecto de coordenadas 2D pode desestruturarse en dous enteiros, x e y.

Por exemplo, o obxecto Map.Entry admite a desestruturación para simplificar o acceso aos seus campos de clave e valor: Non se debe confundir co método destrutor común nas linguaxes orientadas a obxectos. for ((key, value) in map) println("$key: $value")

Funcións aniñadas Kotlin permite declarar funcións locais dentro doutras funcións ou métodos.class User(val id: Int, val name: String, val address: String)

fun saveUserToDb(user: User) { fun validate(user: User, value: String, fieldName: String) { require(value.isNotEmpty()) { "Can't save user ${user.id}: empty $fieldName" }

validate(user, user.name, "Name") validate(user, user.address, "Address") // Gardar o usuario na base de datos ... }

As clases son finais por defecto En Kotlin, para derivar unha nova clase a partir dun tipo de clase base, a clase base debe marcarse explicitamente como "open". Isto contrasta coa maioría das linguaxes orientadas a obxectos, como Java, onde as clases están abertas por defecto.

Exemplo dunha clase base que está aberta para derivar unha nova subclase a partir dela:// open na clase significa que esta clase permitirá clases derivadas open class MegaButton {

// se non hai un open nunha función significa que // o comportamento polimórfico desactívase se a función se sobrescribe na clase derivada fun disable() { ... }

// open nunha función significa que // o comportamento polimórfico permítese se a función se sobrescribe na clase derivada open fun animate() { ... } }

class GigaButton: MegaButton() {

// Uso explícito da palabra clave override necesario para sobrescribir unha función na clase derivada override fun animate() { println("Giga Click!") } }

As clases abstractas son abertas por defecto As clases abstractas definen funcións abstractas ou estruturas puramente virtuais de funcións que se definirán nunha clase derivada. As clases abstractas están abertas por defecto.// Non se precisa a palabra clave open aquí, xa está aberta por defecto abstract class Animated {

// Esta función virtual xa está aberta por defecto tamén abstract fun animate()

open fun stopAnimating() { }

fun animateTwice() { } }

As clases son públicas por defecto Kotlin proporciona as seguintes palabras clave para restrinxir a visibilidade das declaracións de nivel superior (como as clase) e dos membros da clase: public, internal, protected e private.

Cando se aplica a un membro da clase: Palabra claveVisibilidadepublic (por defecto)En todas partesinternalDentro dun móduloprotectedDentro de subclasesprivateDentro dunha clase Cando se aplica a unha declaración de nivel superior: Palabra claveVisibilidadepublic (por defecto)En todas partesinternalDentro dun móduloprivateDentro dun ficheiro Exemplo:// A clase só é visible para o módulo actual internal open class TalkativeButton { // o método só é visible para a clase actual private fun yell() = println("Hey!") // o método é visible para a clase actual e as clases derivadas protected fun whisper() = println("Let's talk!") } internal class MyTalkativeButton: TalkativeButton() { fun utter() = super.whisper() } MyTalkativeButton().utter() Construtor primario vs. construtores secundarios Kotlin admite a especificación dun "construtor primario" como parte da propia definición da clase, que consiste nunha lista de argumentos despois do nome da clase. Esta lista de argumentos admite unha sintaxe ampliada nas listas de argumentos de funcións estándar de Kotlin que permite a declaración de propiedades da clase no construtor primario, incluíndo atributos de visibilidade, extensibilidade e mutabilidade. Ademais, ao definir unha subclase, as propiedades das superinterfaces e superclases poden ser anuladas no construtor primario.// Exemplo dunha clase que usa a sintaxe do construtor primario