Kotlin (Programmiersprache)

aus Wikipedia, der freien Enzyklopädie
Zur Navigation springen Zur Suche springen
Kotlin
Logo
Basisdaten
Paradigmen: Objektorientierte Programmiersprache
Erscheinungsjahr: 2011 (erste Erscheinung)
2016 (stabil)
Designer: JetBrains
Entwickler: JetBrains und Open-Source-Entwickler
Aktuelle Version 1.3.40[1]  (19. Juni 2019)
Typisierung: statisch, stark
Beeinflusst von: Java, Scala, C#, Groovy[2], Gosu, JavaScript
Lizenz: Apache 2[3]
kotlinlang.org

Kotlin ist eine plattformübergreifende, statisch typisierte Programmiersprache, die in Bytecode für die Java Virtual Machine (JVM) übersetzt wird, aber auch in JavaScript-Quellcode oder (mittels LLVM) in Maschinencode umgewandelt werden kann. Hauptsächlich wird die Sprache von den in Sankt Petersburg ansässigen JetBrains-Programmierern entwickelt.[4][5] Daher stammt auch der Name: Kotlin ist eine Insel vor St. Petersburg.[6]

Kotlin lässt sich außerdem zur Entwicklung von Android-Apps verwenden und wird dafür seit 2017 offiziell von Google unterstützt.[7] Seit Mai 2019 ist Kotlin die von Google bevorzugte Sprache für Android-Appentwicklung.[8]

Entwicklung[Bearbeiten | Quelltext bearbeiten]

Nach einem Jahr Entwicklung stellte JetBrains im Juli 2011 das Projekt „Kotlin“ der Öffentlichkeit als neue Sprache für die JVM vor.[9][10] Im Februar 2012 veröffentlichte JetBrains den Quellcode unter einer Apache-2-Lizenz.[11] Am 15. Februar 2016 wurde die Version 1.0 von Kotlin veröffentlicht.[12] Diese Version wird als erster offizieller Stable-Release betrachtet.

Der leitende Entwickler Dmitry Jemerow erklärte, dass die meisten Sprachen nicht die Merkmale zeigten, nach denen sie gesucht hätten, mit Ausnahme von Scala. Diese jedoch habe einen langsamen Compiler.[10] Daher war eines der erklärten Ziele für Kotlin die hohe Kompiliergeschwindigkeit, wie man sie von Java her kenne.

Tools[Bearbeiten | Quelltext bearbeiten]

Für die auch von JetBrains entwickelte IDE IntelliJ IDEA steht ein Kotlin-Plugin zur Verfügung, welches seit IntelliJ IDEA 15 mitinstalliert werden kann.[13][14] Für Eclipse steht ebenfalls ein Plugin zur Verfügung.[15][16] Es existieren zudem Plugins für Apache Maven und Gradle und ein Task für Apache Ant.[17] Die offizielle Android-Entwicklungsumgebung Android Studio unterstützt von Version 3.0 an Kotlin als native Sprache zum Entwickeln von Android-Apps.[18]

Syntax[Bearbeiten | Quelltext bearbeiten]

Die Sprache ist syntaktisch nicht zu Java kompatibel, aber so gestaltet, dass sie mit Java-Code interoperieren kann. Außerdem nutzt sie bestehenden Code der Java Class Library (JCL), z. B. das Java Collections Framework (JCF).

Anders als in Java wird bei Kotlin der Datentyp einer Variable nicht vor dem Variablennamen, sondern danach, abgetrennt durch einen Doppelpunkt, notiert. Allerdings unterstützt Kotlin auch Typinferenz, sodass der Typ oft auch weggelassen werden kann, wenn er aus dem Zusammenhang klar ist. Als Anweisungsende genügt der Zeilenumbruch, optional kann jedoch auch ein Semikolon verwendet werden.[19] Zusätzlich zu Klassen und Methoden (in Kotlin: member functions) aus der objektorientierten Programmierung unterstützt Kotlin prozedurale Programmierung unter Verwendung von Funktionen sowie bestimmte Aspekte der funktionalen Programmierung.[20] Als Einstiegspunkt dient wie bei C u. ä. eine main-Funktion.

Hallo Welt[Bearbeiten | Quelltext bearbeiten]

Ein Programm, das die Zeichenkette „Hallo Welt“ ausgibt.

fun main() {                          // Einsprungpunkt (Main-Funktion)
    println("Hallo Welt!")            // Gib den String 'Hallo Welt!' aus
}

Funktionen[Bearbeiten | Quelltext bearbeiten]

// Definition einer Funktion "funktionsBeispiel"
fun funktionsBeispiel() {
    // Weist der unveränderlichen Variable 'a' den Integer-Wert 120 zu
    val a = 120                                      

    // if..else-Anweisung
    if (a == 100) {
        // Ausgabe von Text auf der Konsole
        println("a entspricht 100")
    } else if (a == 130) {
        println("a entspricht 130")
    } else {
        println("a entspricht weder 100 noch 130")
    }
}

// Funktion mit zwei Argumenten und einem Rückgabewert
fun add(x: Int, y: Int): Int {                       
    return x + y
}

// Besteht eine Funktion aus nur einem Ausdruck, dürfen die geschweiften Klammern, der Rückgabetyp und das "return" weggelassen werden.
fun add2(x: Int, y: Int) = x + y                     

// Einsprungpunkt (Main-Funktion)
fun main(args: Array<String>) {
    // Definition einer verschachtelten Funktion, die nur in main aufgerufen werden kann.
    fun test() {
        println("Hello World!")
    }
    // Aufrufen der Funktion
    funktionsBeispiel()
}

Higher-Order Functions[Bearbeiten | Quelltext bearbeiten]

Kotlin unterstützt die Verwendung von Funktionen höherer Ordnung sowie von Closures mithilfe von Funktionszeigern, anonymen Funktionen und Lambda-Ausdrücken.

// Funktion, die eine andere Funktion entgegennimmt
fun callWithInt(number: Int, fn: (Int) -> Int) {
    val result = fn(number)
    println(result)
}

// Funktion, die eine andere Funktion zurückgibt
fun makeAdder(a: Int): (Int) -> Int {
    fun add(b: Int) = a + b
    return ::add
}

// Anders als in Java dürfen in Kotlin Closures auf Variablen auch schreibend zugreifen
fun makeCounter(): () -> Int {
    var number = 0
    fun counter() = ++number
    return ::counter
}

fun double(x: Int) = x * 2

fun main() {
    // Aufruf mit Funktionszeiger
    callWithInt(42, ::double)
    
    // Aufruf mit anonymer Funktion
    callWithInt(42, fun(x: Int) = x * 2)
    
    // Aufruf mit Lambda-Ausdruck
    callWithInt(42, { x -> x * 2})
    
    // Als letztes Argument dürfen Lambdas außerhalb der runden Klammern geschrieben werden.
    // Wenn die Funktion nur ein Argument erwartet, heißt dieses "it", falls nicht anders festgelegt.
    callWithInt(42) { it * 2 }
    
    val add2 = makeAdder(2)
    println(add2(5)) // gibt 7 aus
    
    val counter = makeCounter()
    println(counter()) // Gibt 1 aus
    println(counter()) // Gibt 2 aus
}

Funktionen höherer Ordnung werden auch in der Standardbibliothek verwendet, insbesondere bei Collections-Datentypen wie Listen, Maps oder Sets.

val list = setOf(1, 2, 3, 4, 5)

println(list.map { it * 2 }) // [2, 4, 6, 8, 10]
println(list.filter { it > 2 }) // [3, 4, 5]
println(list.groupBy { it % 2 }) // {1=[1, 3, 5], 0=[2, 4]}

val cities = listOf("Berlin", "Hamburg", "Muenchen", "Koeln", "Frankfurt")

// Die Anfangsbuchstaben der drei Städte mit den kürzesten Namen hintereinander
val result = cities
    .sortedBy { it.length }
    .take(3)
    .map { it[0] }
    .fold("") { acc, char -> acc + char }

println(result) // KBH

Null Safety[Bearbeiten | Quelltext bearbeiten]

Die falsche Verwendung von Null-Pointern, die zu sogenannten „Null Pointer Exceptions“ führen können, ist in vielen Programmiersprachen eine häufige Fehlerursache. Daher stellt Kotlin eine Reihe von Features zu Verfügung, die das Auftreten solcher Null Pointer Exceptions bereits zur Kompilierzeit verhindern sollen. So muss der Entwickler zum Beispiel beim Deklarieren einer Variable explizit angeben, ob diese den Wert null annehmen darf oder nicht. Variablen, die null sein können, werden „nullable“ (etwa: nullbar) genannt.

// Erstellt eine Variable vom Typ "Int" (darf nicht "null" sein)
var a: Int = 123

// Erstellt eine Variable, die den Wert "null" annehmen darf.
var b: Int? = 456

// Nicht erlaubt (Erzeugt einen Kompilierfehler)
a = null

// Zugelassen
b = null

Wenn eine Variable, die null werden kann, verwendet wird, ohne sie vorher auf null geprüft zu haben, führt dies beim Kompilieren ebenfalls zu einem Fehler.

fun nullSafety() {
    val test: String? = "Test"
    
    // Kompilierfehler (könnte "Null Pointer Exception" verursachen)
    println(test.length)
    
    // Erlaubt, da auf null abgeprüft wird.
    if (test != null) println(test.length)
    
    // Auch erlaubt (zweite Bedingung wird nur überprüft, wenn die erste falsch ist)
    if (test == null || test.length == 0) println("Leerer String")
    
    // Ebenfalls erlaubt
    if (test == null) return
    println(test.length)
}

Kotlin bietet außerdem für einige typische Fälle besondere Syntax, um den benötigten Code zu verkürzen.

val ort = kunde?.adresse?.ort
val ortOderLeer = ort ?: ""

// Obiger Code ist gleichbedeutend mit:
val ort: String?
if (kunde == null || kunde.adresse == null) {
    ort = null
} else {
    ort = kunde.adresse.ort
}
val ortOderLeer: String
if (ort == null) {
    ortOderLeer = ""
} else {
    ortOderLeer = ort
}

Rezeption[Bearbeiten | Quelltext bearbeiten]

In der Ausgabe Januar 2012 des Dr. Dobb’s Journal wurde die Programmiersprache zur Sprache des Monats (language of the month) erklärt.[21]

Der Kotlin-Website zufolge setzen kleine wie große Projekte die Sprache ein:

  • Pinterest nutzen monatlich 150 Millionen Anwender.
  • Gradle setzt Kotlin für Installationsskripte ein.
  • Evernote verwendet Kotlin für seinen Android-Client.
  • Uber nutzt Kotlin für interne Werkzeuge.
  • Corda, eine vollständig in Kotlin entwickelte Open-Source-Software, wird von mehreren Großbanken verwendet.[22]
  • Coursera entwickelt Android-Apps zum Teil mit Kotlin.
  • Atlassian verwendet Kotlin für das Werkzeug Trello unter Android.[23]

Weblinks[Bearbeiten | Quelltext bearbeiten]

Einzelnachweise[Bearbeiten | Quelltext bearbeiten]

  1. blog.jetbrains.com.
  2. Introduction to Kotlin Programming.
  3. kotlin/license/README.md. In: JetBrains/kotlin. GitHub, abgerufen am 20. September 2017.
  4. Sandra Upson: The Language that Stole Android Developers’ Hearts. WIRED, 19. Mai 2017, abgerufen am 23. Februar 2018 (englisch).
  5. FAQ – Kotlin Programming Language. Abgerufen am 21. Februar 2018 (englisch).
  6. Janice Heiss: The Advent of Kotlin: A Conversation with JetBrains' Andrey Breslav. Oracle Technology Network. April 2013. Abgerufen am 2. Februar 2014.
  7. Maxim Shafirov: Kotlin on Android. Now official. In: Kotlin Blog. 17. Mai 2017, abgerufen am 18. Juni 2019 (amerikanisches Englisch).
  8. heise online: Google I/O: Googles Bekenntnis zu Kotlin. Abgerufen am 18. Juni 2019.
  9. Hello World
  10. a b Paul Krill: JetBrains readies JVM language Kotlin. InfoWorld. 22. Juli 2011. Abgerufen am 2. Februar 2014.
  11. John Waters: Kotlin Goes Open Source. 1105 Enterprise Computing Group. 22. Februar 2012. Abgerufen am 2. Februar 2014.
  12. Andrey Breslav: Kotlin 1.0 Released: Pragmatic Language for JVM and Android. 15. Februar 2016.
  13. What’s New in IntelliJ IDEA.
  14. Kotlin – Plugins.
  15. Getting Started with Eclipse Neon – Kotlin Programming Language.
  16. Kotlin for Eclipse.
  17. Kotlin Build Tools.
  18. Rainald Menge-Sonnentag: Entwicklungsumgebung Android Studio 3.0 spricht Kotlin. heise.de. 26. Oktober 2017. Abgerufen am 27. Oktober 2017.
  19. Semicolons. Abgerufen am 8. Februar 2014.
  20. functions. Abgerufen am 8. Februar 2014.
  21. Andrey Breslav: Language of the Month: Kotlin. 20. Januar 2012. Abgerufen am 2. Februar 2014.
  22. Corda.
  23. Project Kotlin.: „Kotlin in backend, data processing and service development“