Programmiersprache Scala 3 ist fertig: Weniger ist mehr

Die neue Hauptversion bringt zahlreiche grundlegende Änderungen, mit denen die Programmiersprache verständlicher und zugänglicher sein soll.

In Pocket speichern vorlesen Druckansicht 237 Kommentare lesen
Lesezeit: 6 Min.
Von
  • Rainald Menge-Sonnentag
Inhaltsverzeichnis

Die lange erwartete neue Hauptversion der Programmiersprache Scala 3 ist nun fertig. Auch wenn beim Schreiben dieser Meldung eine offizielle Ankündigung noch aussteht, liegt im zugehörigen GitHub-Repository das Release 3.0.0 von Dotty bereit. Das Projekt Dotty startete vor acht Jahren parallel zur regulären Weiterentwicklung von Scala mit dem erklärten Ziel herauszufinden, wie ein neues Scala aussehen kann.

Der Scala-Erfinder Martin Odersky erklärte 2018 in einem Interview mit heise Developer, dass Dotty die Grundlage zu Scala 3 werden soll. Letztlich verzögerte sich das damals für Ende 2019 geplante Release noch um eineinhalb Jahre, aber bereits letztes Jahr standen die meisten wichtigen Änderungen fest. Der erste Milestone-Build erschien im November 2020, und von Februar bis Mai diesen Jahres ebneten drei Release Candidates den Weg zum nun veröffentlichten stabilen Release.

Scala blickt inzwischen auf eine zwanzigjährige Geschichte zurück. Martin Odersky begann mit den Arbeiten an der Programmiersprache im Jahr 2001 intern an der École Polytechnique Fédérale de Lausanne (EPFL). Im Frühjahr 2004 ist Scala für die Java-Plattform erschienen, und im Juni folgte eine Variante für .NET.

Scala ist sowohl funktional als auch objektorientiert. Außerdem ist die Programmiersprache stark typisiert und erweiterbar. Der funktionale Anteil drückt sich unter anderem darin aus, dass Funktionen vollwertige Sprachelemente sind, die sich in Variablen ablegen und als Parameter übergeben lassen. Hinsichtlich der objektorientierten Programmierung ist Scala "reiner" als Java: Alles ist ein Objekt, sodass sich beispielsweise auf ein einfaches Array oder eine Zahl eine Methode aufrufen lässt, womit Autoboxing beziehungsweise Unboxing entfallen.

Der Typ jeder Variable ist genau definiert, und Scala nutzt Type Inference, um aus der Initialisierung von Variablen den passenden Typ zu erkennen. Die Erweiterbarkeit ist einerseits eine Stärke der Programmiersprache, aber andererseits eine Hürde beim Einstieg in Scala. So erlaubt sie das Schreiben individueller Libraries, deren Inhalte sich quasi identisch zu integrierten Sprach-Features verwenden lassen.

Während Scala 2 bereits im Jahr 2006 auf die erste Version folgte, ließ sich das Team mit dem nun veröffentlichten Scala 3 deutlich mehr Zeit. Die neue Hauptversion zielt vor allem auf den einfacheren Umgang mit der Sprache und saubereren Code. Das bedeutet zum Teil das Zusammenlegen von Sprachkonstrukten und das Beseitigen von Unstimmigkeiten.

Die inhaltlichen Neuerungen von Dotty beziehungsweise Scala 3 beschreibt ein Artikel auf heise Developer umfangreich. Nennenswert sind unter anderem die Anpassungen oder "Zügelung" der mächtigen Implicits. Hintergrund ist, dass manche das mächtige Sprachfeature zu häufig oder im falschen Kontext genutzt haben. So soll schon das neue Schlüsselwort given statt implicit die Intention klarer beschreiben. Im Endspurt ist im Milestone Build 3 noch eine kleine Änderung eingeflossen, die das as daraus ebenso entfernt wie aus Patterns.

Eine wichtige Ergänzung sind zudem Toplevel-Definitionen: Bisher durften Entwicklerinnen und Entwickler Konstrukte wie Typen, Methoden oder Typ-Aliases nur in Klassen, Traits oder Objekten definieren. Scala 3 erlaubt dagegen Definitionen außerhalb dieser Elemente auf der obersten Ebene. Die in Scala 2.8 eingeführten Package Objects sind damit hinfällig. Die neue Art der Definition muss nicht wie bei den Package Objects in einem eigenen package erfolgen.

Der komplizierte Umgang mit Aufzählungen gehörte zu den Kritikpunkten am "alten" Scala, das mit Sealed Case Objects und Erweiterungen von scala.Enumeration zwei Ansätze bot, die beide ihre Tücken haben. Scala 3 führt daher nun das fast überfällige enum ein, das sich ebenso verwenden lässt wie in Java und anderen Programmiersprachen und darüber hinaus flexibler ist. Die neuen Scala-Enumerationen lassen sich im Gegensatz zum früheren scala.Enumeration aus Java-Code heraus verwenden. Voraussetzung ist lediglich, dass sie von java.lang.Enum abgeleitet sind. Die Aufzählungen können zudem parametrisiert sein wie in folgendem Beispiel aus der Dokumentation:

enum Color(val rgb: Int):
  case Red   extends Color(0xFF0000)
  case Green extends Color(0x00FF00)
  case Blue  extends Color(0x0000FF)

Die aus der funktionalen Programmierung stammenden Union Types legen mit dem Oder-Operator A | B fest, dass ein Wert zu einem Zeitpunkt entweder vom Typ A oder vom Typ B ist. Auf die Weise erlauben sie einen flexiblen, aber typsicheren Code: Beim Verwenden eines anderen Typs wirft der Compiler einen Fehler aus. Die Umsetzung derselben Logik über Vererbung ist zwar ebenso möglich, erfordert aber mehr Code und eine genaue Planung der Klassenhierarchie.

Umgekehrt definieren die neu eingeführten Intersection Types über den Und-Operator, dass ein als A & B definierter Wert zur selben Zeit sowohl vom Typ A als auch vom Typ B sein muss. Auf die Weise lassen sich die Methoden beider Typen für den Wert verwenden.

Scala 3 forciert sauber eingerückten Code, und der Compiler spuckt für falsche Einrückungen eine Fehlermeldung aus. Letztere lässt sich allerdings über den Compiler-Parameter -no-indent deaktivieren. Für sauber eingerückten Code dürfen neuerdings geschweifte Klammern für Blöcke entfallen. Details dazu finden sich in der Dokumentation. Der Compiler soll zudem verständlichere Fehlermeldungen mit zugehörigen Hilfestellungen ausgeben, die auf die ursächliche Quelle des Fehlers hinweisen.

Insgesamt wirkt Scala 3 tatsächlich klarer als die Vorgängerversionen. In wie weit die Änderungen neue Entwickler anziehen kann, wird sich zeigen. Wer bereits mit der Sprache geliebäugelt hat, aber bisher zurückgeschreckt ist, findet vermutlich nun den besten Zeitpunkt zum Einstieg. Auf der Scala-3-Site findet sich eine Einstiegshilfe. Die umfangreichen Neuerungen bedeuten allerdings für erfahrene Scala-Entwickler eine Umstellung. Für sie hat das Scala-Team einen Migrationsleitfaden von Scala-2-Projekten nach Scala 3 veröffentlicht.

Die Release Notes auf GitHub führen im Vergleich zum letzten Release Candidate lediglich einen behobenen Tippfehler auf. Außerdem ist die Umsetzung der Typed Abstract Syntax Trees TASTy nicht mehr als experimentell gekennzeichnet . Den größten Teil nimmt die Aufzählung der Personen ein, die zum Projekt beigetragen haben: Die Liste zeigt insgesamt 358 Entwicklerinnen und Entwickler. Wenig überraschend hat Spracherfinder Martin Odersky mit 8661 Commits den Löwenanteil an Beiträgen geleistet.

(rme)