Programmiersprache: Kotlin 1.7 enthält Alphaversion des neuen K2-Compilers

Das Release stellt den neuen Kotlin/JVM-Compiler K2 vor, der sich noch in der Alphaphase befindet, stabilisiert Sprachfeatures und verbessert die Performance.

In Pocket speichern vorlesen Druckansicht 67 Kommentare lesen

(Bild: bestfoto77/Shutterstock.com)

Lesezeit: 4 Min.
Von
  • Silke Hahn

JetBrains hat die neue Hauptversion von Kotlin herausgegeben. Version 1.7 der Programmiersprache enthält die Alphaversion des neuen Kotlin- und JVM-Compilers K2, soll bestehende Features der Sprache stabilisieren und bringt laut dem Kotlin-Team Verbesserungen im Bereich der Performance für die Java Virtual Machine (JVM), für JavaScript und native Plattformen.

An Highlights hebt das Entwicklungsteam weitere Neuerungen hervor: Kotlin soll das inkrementelle Kompilieren in Gradle nun auch für Änderungen unterstützen, die innerhalb abhängiger Module vonstatten gehen, die nicht in Kotlin geschrieben sind. Es ist mit dem Tool für automatisiertes Build-Management kompatibel. Das Team hat die Annotationen der Opt-in-Anforderungen stabilisiert, die Non-nullable Types überarbeitet und die Builder-Inferenz ebenfalls auf stabilere Füße gestellt.

Letzteres ist eine spezielle Art der Typinferenz, die beim Aufruf generischer Builder-Funktionen nützlich sein kann. Sie hilft dem Compiler, die Typargumente eines Aufrufs anhand der Typinformationen über andere Aufrufe innerhalb seines Lambda-Arguments abzuleiten. Kotlin 1.7 und die künftig folgenden Versionen sollen laut Release-Meldung die Builder-Inferenz automatisch aktiviert haben. Wer sich genauer dafür interessiert, kann bei JetBrains nachlesen, wie sich eigene generische Builder für Kotlin schreiben lassen. Wer mit generischen Buildern arbeitet, könnte es nützlich finden, die Typargumente eines Builder-Aufrufs anhand der Typinformationen über andere Aufrufe innerhalb des Lambda-Arguments abzuleiten. Das Kotlin-Team erklärt das Vorgehen beim Verwenden von buildMap() anhand einer Codepassage:

fun addEntryToMap(baseMap: Map<String, Number>, additionalEntry: Pair<String, Int>?) {
   val myMap = buildMap {
       putAll(baseMap)
       if (additionalEntry != null) {
           put(additionalEntry.first, additionalEntry.second)
       }
   }
}

Für Typargumente hält Kotlin 1.7 nun den Underscore Operator _ bereit. Er lässt sich dazu verwenden, ein Typargument automatisch abzuleiten, wenn andere Typen bereits festgelegt sind. In der Dokumentation zur Programmiersprache demonstriert das ein Codebeispiel wie folgt:

abstract class SomeClass<T> {
    abstract fun execute(): T
}

class SomeImplementation : SomeClass<String>() {
    override fun execute(): String = "Test"
}

class OtherImplementation : SomeClass<Int>() {
    override fun execute(): Int = 42
}

object Runner {
    inline fun <reified S: SomeClass<T>, T> run(): T {
        return S::class.java.getDeclaredConstructor().newInstance().execute()
    }
}

fun main() {
    // T is inferred as String because SomeImplementation derives from SomeClass<String>
    val s = Runner.run<SomeImplementation, _>()
    assert(s == "Test")

    // T is inferred as Int because OtherImplementation derives from SomeClass<Int>
    val n = Runner.run<OtherImplementation, _>()
    assert(n == 42)
}

Das Release erlaubt das Implementieren durch das Delegieren an den Inline-Wert einer Inline-Klasse. Somit sollen sich Wrapper, die meistens keinen Speicher zuweisen, nun einfacher erstellen lassen. Bislang hatten Kotlin-Entwickler beim Erstellen von Wrappern für einen Wert oder eine Klasseninstanz alle Schnittstellenmethoden noch per Hand implementieren müssen. Kotlin 1.7 löst das Problem mit der Implementierung durch Delegation, die nun eben auch für Inline-Klassen funktioniert, wie ein Code-Beispiel veranschaulicht:

interface Bar {
    fun foo() = "foo"
}

@JvmInline
value class BarWrapper(val bar: Bar): Bar by bar

fun main() {
    val bw = BarWrapper(object: Bar {})
    println(bw.foo())
}

Alle weiteren Änderungen lassen sich der vollständigen Changelist entnehmen, die das Kotlin-Team in der Dokumentation zur Programmiersprache hinterlegt hat. Der Kotlin-Entwickler und JetBrains-Mitarbeiter Anton Arhipov gibt in einem YouTube-Video in rund zwanzig Minuten einen kompakten Überblick über die neuen Eigenschaften von Kotlin 1.7:

Empfohlener redaktioneller Inhalt

Mit Ihrer Zustimmmung wird hier ein externes YouTube-Video (Google Ireland Limited) geladen.

Ich bin damit einverstanden, dass mir externe Inhalte angezeigt werden. Damit können personenbezogene Daten an Drittplattformen (Google Ireland Limited) übermittelt werden. Mehr dazu in unserer Datenschutzerklärung.

Wer Kotlin noch nicht installiert hatte, kann das mit IntelliJ IDEA oder Android Studio Chipmunk tun. Eine Erklärung und Unterstützung dabei gibt es über Slack, Probleme lassen sich über den Kotlin-Issue-Tracker melden und auf GitHub steht ein Kommandozeilen-Compiler bereit. Diese Ressourcen und weitere Hinweise lassen sich dem Blogeintrag zum Release von Kotlin 1.7 entnehmen. Allen, die sich für die geplanten Neuerungen interessieren, sei ein Blick in die aktualisierte Roadmap ans Herz gelegt, die vorläufig bis November 2022 gilt.

Eine wesentliche Priorität ist demzufolge die Arbeit an dem neuen Compiler in Richtung Beschleunigung, Parallelität und Vereinheitlichung. Zu einem späteren Zeitpunkt will das Team sich auch der "Pluggability" widmen. Ein weiterer Schwerpunkt ist offenbar der schnellere Turnaround des Zyklus von Änderungen, Testen und Debugging, und Kotlin Multiplatform Mobile soll auch weitere Features erhalten. Einen weiter reichenden Ausblick auf die Zukunft der Programmiersprache bietet das Kotlin-Team in einem separaten Blogeintrag zu den Schlüsselprojekten bis 2023.

(sih)