Kotlin (Programmiersprache) - Kotlin (programming language)

Kotlin
Kotlin-Logo 2021.svg
Paradigma Multiparadigma : objektorientiert , funktional , zwingend , blockstrukturiert , deklarativ , generisch , reflexiv , gleichzeitig
Entworfen von JetBrains
Entwickler JetBrains
Erstmals erschienen 22. Juli 2011 ; vor 10 Jahren ( 2011-07-22 )
Stabile Version
1.5.31  Bearbeiten Sie dies auf Wikidata / 20. September 2021 ; Vor 28 Tagen ( 20. September 2021 )
Vorschauversion
build-1.6.20-dev-107 / 26. August 2021 ; Vor 53 Tagen ( 2021-08-26 )
Schreibdisziplin Abgeleitet , statisch , stark
Plattform
Betriebssystem Plattformübergreifend
Lizenz Apache-Lizenz 2.0
Dateinamenerweiterungen .kt, .kts, .ktm
Webseite kotlinlang .org Bearbeite dies bei Wikidata
Beeinflusst von

Kotlin ( / k ɒ t l ɪ n / ) ist eine plattformübergreifende , statisch typisiert , Allzweck- Programmiersprache mit Typinferenz . Kotlin ist so konzipiert, dass es vollständig mit Java interoperiert , und die JVM- Version der Kotlin- Standardbibliothek hängt von der Java-Klassenbibliothek ab , aber die Typinferenz ermöglicht eine präzisere Syntax . Kotlin zielt hauptsächlich auf die JVM ab, kompiliert aber auch in JavaScript (zB für Frontend-Webanwendungen mit React ) oder nativen Code (über LLVM ); B. für native iOS- Apps, die Geschäftslogik mit Android- Apps teilen . Die Kosten für die Sprachentwicklung werden von JetBrains getragen , während die Kotlin Foundation die Marke Kotlin schützt.

Am 7. Mai 2019 gab Google bekannt, dass die Programmiersprache Kotlin nun seine bevorzugte Sprache für Android- App-Entwickler ist. Seit der Veröffentlichung von Android Studio 3.0 im Oktober 2017 ist Kotlin als Alternative zum Standard-Java-Compiler enthalten. Der Android-Kotlin-Compiler erzeugt standardmäßig Java 8-Bytecode (der in jeder späteren JVM ausgeführt wird), lässt jedoch dem Programmierer die Wahl, auf Java 9 bis 16 zur Optimierung abzuzielen oder mehr Funktionen zuzulassen. hat bidirektionale Record-Class- Interoperabilitätsunterstützung für JVM, eingeführt in Java 16, die ab Kotlin 1.5 als stabil gilt.

Die Kotlin-Unterstützung für die Kompilierung direkt in JavaScript (dh das klassische Backend) wird von seinen Entwicklern seit Kotlin 1.3 als stabil angesehen, während sich das neue Kotlin/JS(IR) ab Version 1.5.30 in der Beta-Phase befindet. Die neuen optimierten Implementierungen von Kotlin/JVM(IR) und Kotlin/JS ( IR- basiert) wurden in Version 1.4 eingeführt. Kotlin/JVM(IR) gilt ab Version 1.5 als stabil. Kotlin/Native (für zB Apple Silicon Support) gilt seit Version 1.3 als Beta.

Geschichte

Im Juli 2011 stellte JetBrains Project Kotlin vor, eine neue Sprache für die JVM, die seit einem Jahr in Entwicklung war. JetBrains-Chef Dmitry Jemerov sagte, dass die meisten Sprachen mit Ausnahme von Scala nicht die gewünschten Funktionen hätten . Als Mangel führte er jedoch die langsame Kompilierungszeit von Scala an. Eines der erklärten Ziele von Kotlin ist es, so schnell wie Java zu kompilieren. Im Februar 2012 hat JetBrains das Projekt unter der Apache 2-Lizenz als Open Source veröffentlicht .

Der Name stammt von der Insel Kotlin in der Nähe von St. Petersburg . Andrey Breslav erwähnte, dass das Team beschlossen habe, es nach einer Insel zu benennen, so wie Java nach der indonesischen Insel Java benannt wurde (obwohl die Programmiersprache Java vielleicht nach dem Kaffee benannt wurde).

JetBrains hofft, dass die neue Sprache die Verkäufe von IntelliJ IDEA ankurbeln wird.

Kotlin v1.0 wurde am 15. Februar 2016 veröffentlicht. Dies gilt als das erste offiziell stabile Release und JetBrains hat sich ab dieser Version zu einer langfristigen Abwärtskompatibilität verpflichtet.

Auf der Google I/O 2017 kündigte Google erstklassigen Support für Kotlin auf Android an .

Kotlin v1.2 wurde am 28. November 2017 veröffentlicht. Die Funktion zum Teilen von Code zwischen JVM- und JavaScript-Plattformen wurde dieser Version neu hinzugefügt (ab Version 1.4 ist die Multiplattform-Programmierung eine Alpha- Funktion, die von "experimentell" aktualisiert wurde). Mit dem neuen Kotlin/JS Gradle Plugin wurde eine Full-Stack- Demo erstellt.

Kotlin v1.3 wurde am 29. Oktober 2018 veröffentlicht und bringt Coroutinen für die asynchrone Programmierung.

Am 7. Mai 2019 gab Google bekannt, dass die Programmiersprache Kotlin nun seine bevorzugte Sprache für Android-App-Entwickler ist.

Kotlin v1.4 wurde im August 2020 veröffentlicht, mit einigen geringfügigen Änderungen an der Unterstützung für Apples Plattformen, dh an der Objective-C / Swift- Interop .

Kotlin v1.5 wurde im Mai 2021 veröffentlicht.

Entwurf

Entwicklungsleiter Andrey Breslav sagte, dass Kotlin als objektorientierte Sprache mit industrieller Stärke und als "bessere Sprache" als Java konzipiert wurde , aber dennoch vollständig mit Java-Code interoperabel ist, sodass Unternehmen eine schrittweise Migration von Java zu Kotlin durchführen können .

Semikolons sind optional als Erklärung Terminator ; in den meisten Fällen reicht ein Zeilenumbruch aus, damit der Compiler auf das Ende der Anweisung schließen kann.

Kotlin- Variablendeklarationen und Parameterlisten haben den Datentyp nach dem Variablennamen (und mit einem Doppelpunkt- Trennzeichen), ähnlich wie bei BASIC , Pascal , TypeScript und Rust .

Variablen in Kotlin können schreibgeschützt, mit dem Schlüsselwort val deklariert oder mutable mit dem Schlüsselwort var deklariert werden.

Klassenmember sind standardmäßig öffentlich, und Klassen selbst sind standardmäßig final, was bedeutet, dass das Erstellen einer abgeleiteten Klasse deaktiviert ist, es sei denn, die Basisklasse wird mit dem Schlüsselwort open deklariert.

Neben den Klassen und Memberfunktionen (äquivalent zu Methoden) der objektorientierten Programmierung unterstützt Kotlin auch die prozedurale Programmierung mit der Verwendung von Funktionen . Kotlin Funktionen (und Konstrukteure) Unterstützung Standardargumente , mit variabler Länge Argument Listen benannten Argumente und Überlastungen durch eindeutige Signatur. Klassenmemberfunktionen sind virtuell, dh werden basierend auf dem Laufzeittyp des Objekts, auf das sie aufgerufen werden, verteilt.

Kotlin 1.3 fügt (stabil in stdlib; benutzerdefinierte Verträge experimentell) Unterstützung für Verträge hinzu (inspiriert von Eiffels Design by Contract Programming Paradigm)

Kotlin Entwickler nach, können Sie rufen JavaScript - Code von Kotlin, zB schreiben voll, typsichere Reagieren Anwendungen oder Schreib- und halten Full-Stack Webanwendungen Validierungslogik mit dem Frontend teilen, oder Sie können „erzeugen Bibliotheken von Ihrem Kotlin Code, können als Module aus jeder in JavaScript oder TypeScript geschriebenen Codebasis verwendet werden .

Syntax

Prozeduraler Programmierstil

Kotlin lockert Javas Beschränkung, statische Methoden und Variablen nur innerhalb eines Klassenkörpers zuzulassen . Statische Objekte und Funktionen können auf der obersten Ebene des Pakets definiert werden, ohne dass eine redundante Klassenebene erforderlich ist. Aus Kompatibilitätsgründen mit Java bietet Kotlin eine JvmNameAnmerkung, die einen Klassennamen angibt, der verwendet wird, wenn das Paket von einem Java-Projekt aus angezeigt wird. Zum Beispiel @file:JvmName("JavaClassName").

Haupteinstiegspunkt

Wie in C , C++ , C# , Java und Go ist der Einstiegspunkt in ein Kotlin- Programm eine Funktion namens "main", der ein Array mit beliebigen Befehlszeilenargumenten übergeben werden kann . Dies ist seit Kotlin 1.3 optional. Die String-Interpolation im Perl- , PHP- und Unix-Shell- Stil wird unterstützt. Typrückschluss wird ebenfalls unterstützt.

// Hello, World! example
fun main() {
    val scope = "World"
    println("Hello, $scope!")
}

fun main(args: Array<String>) {
    for (arg in args)
        println(arg)
}

Erweiterungsfunktionen

Ähnlich wie C# ermöglicht Kotlin das Hinzufügen einer Erweiterungsfunktion zu jeder Klasse, ohne dass die Formalitäten zum Erstellen einer abgeleiteten Klasse mit neuen Funktionen erforderlich sind. Eine Erweiterungsfunktion hat Zugriff auf alle öffentlichen Schnittstellen einer Klasse, die sie verwenden kann, um eine neue Funktionsschnittstelle zu einer Zielklasse zu erstellen. Eine Erweiterungsfunktion erscheint genau wie eine Funktion der Klasse und wird bei der Codevervollständigung von Klassenfunktionen angezeigt. Zum Beispiel:

package MyStringExtensions

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

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

Durch Platzieren des vorhergehenden Codes in der obersten Ebene eines Pakets wird die String-Klasse um eine lastCharFunktion erweitert, die in der ursprünglichen Definition der String-Klasse nicht enthalten war.

// Overloading '+' operator using an extension function
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)

Argumente mit Spread-Operator entpacken

Ähnlich wie bei Python entpackt der Spread-Operator Stern (*) den Inhalt eines Arrays als durch Kommas getrennte Argumente in eine Funktion:

fun main(args: Array<String>) { 
    val list = listOf("args: ", *args)
    println(list)
}

Destrukturierungserklärungen

Destrukturierungsdeklarationen zerlegen ein Objekt gleichzeitig in mehrere Variablen, zB könnte ein 2D-Koordinatenobjekt in zwei ganze Zahlen, x und y , destrukturiert werden.

Das Map.EntryObjekt unterstützt beispielsweise die Destrukturierung, um den Zugriff auf seine Schlüssel- und Wertfelder zu vereinfachen:

for ((key, value) in map)
    println("$key: $value")

Verschachtelte Funktionen

Kotlin ermöglicht die Deklaration lokaler Funktionen innerhalb anderer Funktionen oder Methoden.

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")
    // Save user to the database 
    ...
}

Klassen sind standardmäßig endgültig

Um in Kotlin eine neue Klasse von einem Basisklassentyp abzuleiten, muss die Basisklasse explizit als "offen" gekennzeichnet werden. Dies steht im Gegensatz zu den meisten objektorientierten Sprachen wie Java, wo Klassen standardmäßig geöffnet sind.

Beispiel für eine Basisklasse, aus der eine neue Unterklasse abgeleitet werden kann.

// open on the class means this class will allow derived classes
open class MegaButton  {

    // no-open on a function means that 
    //    polymorphic behavior disabled if function overridden in derived class
    fun disable() { ... }

    // open on a function means that
    //    polymorphic behavior allowed if function is overridden in derived class
    open fun animate() { ... }
}

class GigaButton: MegaButton {

    // Explicit use of override keyword required to override a function in derived class
    override fun animate() { println("Giga Click!") } 
}

Abstrakte Klassen sind standardmäßig geöffnet

Abstrakte Klassen definieren abstrakte oder "rein virtuelle" Platzhalterfunktionen, die in einer abgeleiteten Klasse definiert werden. Abstrakte Klassen sind standardmäßig geöffnet.

// No need for the open keyword here, it’s already open by default
abstract class Animated {

    // This virtual function is already open by default as well
    abstract fun animate()
  
    open fun stopAnimating() { }

    fun animateTwice() { }
}

Klassen sind standardmäßig öffentlich

Kotlin bietet die folgenden Schlüsselwörter Sichtbarkeit für Top-Level - Erklärung, wie Klassen zu beschränken und für die Teilnehmer: public, internal, protected, und private.

Bei Anwendung auf ein Klassenmitglied:

Stichwort Sichtweite
public (Ursprünglich) Überall, überallhin, allerorts
internal Innerhalb eines Moduls
protected Innerhalb von Unterklassen
private Innerhalb einer Klasse

Bei Anwendung auf eine Deklaration der obersten Ebene:

Stichwort Sichtweite
public (Ursprünglich) Überall, überallhin, allerorts
internal Innerhalb eines Moduls
private Innerhalb einer Datei

Beispiel:

// Class is visible only to current module
internal open class TalkativeButton : Focusable {
    // method is only visible to current class 
    private fun yell() = println("Hey!")

    // method is visible to current class and derived classes
    protected fun whisper() = println("Let's talk!")
}

Primärer Konstruktor vs. sekundärer Konstruktor

Kotlin unterstützt die Angabe eines "primären Konstruktors" als Teil der Klassendefinition selbst, bestehend aus einer Argumentliste nach dem Klassennamen. Diese Argumentliste unterstützt eine erweiterte Syntax auf Kotlins Standardfunktionsargumentlisten, die die Deklaration von Klasseneigenschaften im primären Konstruktor ermöglicht, einschließlich Sichtbarkeits-, Erweiterbarkeits- und Veränderlichkeitsattributen. Außerdem können beim Definieren einer Unterklasse Eigenschaften in Superschnittstellen und Superklassen im primären Konstruktor überschrieben werden.

// Example of class using primary constructor syntax
// (Only one constructor required for this class)
open class PowerUser(
    protected val nickname: String, 
    final override var isSubscribed: Boolean = true) 
  : User(...) {
    ...
}

In Fällen, in denen mehr als ein Konstruktor für eine Klasse benötigt wird, kann jedoch ein allgemeinerer Konstruktor verwendet werden, der als sekundäre Konstruktorsyntax bezeichnet wird und der in den meisten objektorientierten Sprachen wie C++, C# und Java verwendeten Konstruktorsyntax sehr ähnlich ist.

// Example of class using secondary constructor syntax
// (more than one constructor required for this class)
class MyButton : View {

    // Constructor #1 
    constructor(ctx: Context) : super(ctx) { 
        // ... 
    } 
  
    // Constructor #2
    constructor(ctx: Context, attr: AttributeSet) : super(ctx, attr) { 
        // ... 
    }
}

Datenklassen

Das data classKonstrukt von Kotlin definiert Klassen, deren Hauptzweck darin besteht, Daten zu speichern. Dieses Konstrukt ist ähnlich wie bei normalen Klassen , außer , dass die wichtigsten Funktionen equals, toStringund hashCodewerden von den Klasseneigenschaften automatisch generieren. In Java wird von solchen Klassen erwartet, dass sie ein Standardsortiment von Funktionen wie diese bereitstellen. Datenklassen müssen keine Methoden deklarieren, obwohl jede mindestens eine Eigenschaft haben muss. Eine Datenklasse wird oft ohne Body geschrieben, obwohl es möglich ist, einer Datenklasse beliebige Methoden oder sekundäre Konstruktoren zuzuweisen, die für jede andere Klasse gültig sind. Das dataSchlüsselwort wird vor dem classSchlüsselwort verwendet, um eine Datenklasse zu definieren.

fun main(args: Array) {
    // create a data class object like any other class object
    var book1 = Book("Kotlin Programming", 250)
    println(book1)
    // output: Book(name=Kotlin Programming, price=250)
}
     
// data class with parameters and their optional default values
data class Book(val name: String = "", val price: Int = 0)

Interaktive Kotlin-Shell

$ kotlinc-jvm
type :help for help; :quit for quit
>>> 2 + 2
4
>>> println("Hello, World!")
Hello, World!
>>>

Kotlin als Skriptsprache

Kotlin kann auch als Skriptsprache verwendet werden. Ein Skript ist eine Kotlin-Quelldatei (.kts) mit ausführbarem Code der obersten Ebene.

// list_folders.kts
import java.io.File
val folders = File(args[0]).listFiles { file -> file.isDirectory() }
folders?.forEach { folder -> println(folder) }

Skripte können ausgeführt werden, indem die -scriptOption und die entsprechende Skriptdatei an den Compiler übergeben werden.

$ kotlinc -script list_folders.kts "path_to_folder_to_inspect"

Nullsicherheit

Kotlin unterscheidet zwischen nullable und non-nullable Datentypen. Alle Nullable-Objekte müssen mit einem "?" deklariert werden. Postfix nach dem Typnamen. Operationen an Nullable-Objekten erfordern besondere Sorgfalt von Entwicklern: Vor der Verwendung des Werts muss eine Nullprüfung durchgeführt werden. Kotlin bietet nullsichere Operatoren, um Entwicklern zu helfen:

fun sayHello(maybe: String?, neverNull: Int) {
    // use of elvis operator
    val name: String = maybe ?: "stranger"
    println("Hello $name")
}

Ein Beispiel für die Verwendung des sicheren Navigationsoperators:

// returns null if...
// - foo() returns null,
// - or if foo() is non-null, but bar() returns null,
// - or if foo() and bar() are non-null, but baz() returns null.
// vice versa, return value is non-null if and only if foo(), bar() and baz() are non-null
foo()?.bar()?.baz()

Lambdas

Kotlin bietet Unterstützung für Funktionen höherer Ordnung und anonyme Funktionen oder Lambdas.

// the following function takes a lambda, f, and executes f passing it the string, "lambda"
// note that (s: String) -> Unit indicates a lambda with a String parameter and Unit return type
fun executeLambda(f: (s: String) -> Unit) {
    f("lambda")
}

Lambdas werden mit geschweiften Klammern deklariert, { } . Wenn ein Lambda Parameter akzeptiert, werden diese in geschweiften Klammern deklariert und gefolgt vom Operator -> .

// the following statement defines a lambda that takes a single parameter and passes it to the println function
val l = { c : Any? -> println(c) }
// lambdas with no parameters may simply be defined using { }
val l2 = { print("no parameters") }

Komplexes "Hallo Welt"-Beispiel

fun main(args: Array<String>) {
    greet {
        to.place
    }.print()
}

// Inline higher-order functions
inline fun greet(s: () -> String) : String = greeting andAnother s()

// Infix functions, extensions, type inference, nullable types, 
// lambda expressions, labeled this, Elvis operator (?:)
infix fun String.andAnother(other : Any?) = buildString() 
{ 
    append(this@andAnother); append(" "); append(other ?: "") 
}

// Immutable types, delegated properties, lazy initialization, string templates
val greeting by lazy { val doubleEl: String = "ll"; "he${doubleEl}o" }

// Sealed classes, companion objects
sealed class to { companion object { val place = "world"} }

// Extensions, Unit
fun String.print() = println(this)

Werkzeuge

  • IntelliJ IDEA bietet Plug-in-Unterstützung für Kotlin. IntelliJ IDEA 15 war die erste Version, die das Kotlin-Plugin im IntelliJ-Installer bündelte und Kotlin-Unterstützung sofort bereitstellte.
  • JetBrains bietet auch ein Plugin für Eclipse .
  • Die Integration mit gängigen Java-Build-Tools wird unterstützt, einschließlich Apache Maven , Apache Ant und Gradle .
  • Android Studio (basierend auf IntelliJ IDEA) bietet offizielle Unterstützung für Kotlin, beginnend mit Android Studio 3.
  • Emacs hat einen Kotlin-Modus in seinem Melpa-Paket-Repository.
  • Vim hat ein Plugin, das auf GitHub verwaltet wird.
  • Json2Kotlin generiert nativen Kotlin-Code im POJO- Stil für die Zuordnung von Webservice-Antworten.

Anwendungen

Als Kotlin auf der Google I/O im Mai 2017 als offizielle Android-Entwicklungssprache angekündigt wurde , wurde es neben Java und C++ die dritte vollständig für Android unterstützte Sprache. Ab 2020 wird Kotlin immer noch am häufigsten auf Android verwendet, wobei Google schätzt, dass 70% der Top-1000-Apps im Play Store in Kotlin geschrieben sind. Google selbst hat 60 in Kotlin geschriebene Apps, darunter Maps und Drive. Viele Android-Apps, wie beispielsweise Googles Home, werden derzeit auf Kotlin migriert und verwenden daher sowohl Kotlin als auch Java. Kotlin auf Android wird als vorteilhaft für seine Null-Zeiger-Sicherheit sowie für seine Funktionen angesehen, die einen kürzeren, besser lesbaren Code ermöglichen.

Neben seiner prominenten Verwendung auf Android gewinnt Kotlin in der serverseitigen Entwicklung an Bedeutung. Das Spring Framework hat am 4. Januar 2017 mit Version 5 offiziell Kotlin-Unterstützung hinzugefügt. Um Kotlin weiter zu unterstützen, hat Spring seine gesamte Dokumentation in Kotlin übersetzt und integrierte Unterstützung für viele Kotlin-spezifische Funktionen wie Coroutinen hinzugefügt. Neben Spring hat JetBrains ein Kotlin-First-Framework namens Ktor zum Erstellen von Webanwendungen entwickelt.

Im Jahr 2020 stellte JetBrains in einer Umfrage unter Entwicklern fest, die Kotlin verwenden, dass 56 % Kotlin für mobile Apps verwenden, während 47 % es für ein Web-Back-End verwenden. Etwas mehr als ein Drittel aller Kotlin-Entwickler gaben an, von einer anderen Sprache zu Kotlin zu migrieren. Die meisten Kotlin-Benutzer zielten auf Android (oder anderweitig auf der JVM) ab, wobei nur 6% Kotlin Native nutzten.

Annahme

Im Jahr 2018 war Kotlin die am schnellsten wachsende Sprache auf GitHub mit 2,6-mal mehr Entwicklern im Vergleich zu 2017. Laut der Stack Overflow Developer Survey 2020 ist sie die viertbeliebteste Programmiersprache.

Kotlin wurde auch mit dem Breakout Award der O'Reilly Open Source Software Conference 2019 ausgezeichnet.

Viele Unternehmen/Organisationen haben Kotlin für die Backend-Entwicklung verwendet:

  • Google
  • Norwegische Steuerverwaltung
  • Gradle
  • Amazonas
  • Quadrat
  • JetBrains
  • Fluss
  • Allegro
  • OLX
  • Shazam
  • Drehpunkt
  • Raketenreisen
  • Meshcloud
  • Zalando

Einige Unternehmen/Organisationen haben Kotlin für die Webentwicklung verwendet:

  • JetBrains
  • Data2viz
  • Fritz2
  • Barclays Bank

Eine Reihe von Unternehmen haben öffentlich erklärt, dass sie Kotlin verwenden:

Siehe auch

Verweise

  • Dieser Artikel enthält Zitate aus Kotlin-Tutorials, die unter einer Apache 2.0-Lizenz veröffentlicht werden.

Externe Links