Scala 2.13: Feature Freeze und erster Release Candidate

© Shutterstock / Zita
In letzter Zeit ist es wieder etwas ruhiger um die Programmiersprache Scala geworden, das letzte Release, Version 2.12.8, gab es vor ziemlich genau vier Monaten. Nun ist der erste Release-Kandidat für Scala 2.13 erschienen. Wir haben uns angeschaut, was das nächste größere Update an Bord hat.
Das erklärte Ziel der Scala Community für das nächste größere Release, war und ist ein großes Reinemachen in der Standardbibliothek und eine Verbesserung der Performance des Compilers. Zudem wurde Scala 2.13 offiziell als Library Release angekündigt, es stehen also keine signifikanten Änderungen an der Sprache selbst an. Rückwärtskompatibel ist die Sprache dennoch nicht, es besteht also keine Binärkompatibilität der 2.13er-Reihe zur 2.12er-Reihe.
Eine weitere große Änderung betrifft die Collections Library, die komplett überarbeitet wurde. Neben einigen Verbesserungen ging es den Entwicklern der Bibliothek vor allem darum, die Verwendung der Collections zu vereinfachen.
Scala 2.13 M1-M3
Bevor wir uns die neue Collections Library und die damit verbundenen Änderungen ansehen, sollten wir uns die ersten Meilensteine der neuen Scala-Version anschauen, die nicht viel, aber doch ein paar kleine Neuerungen beinhalten. Im ersten Milestone (Scala 2.13.0-M1) ging es vor allem um das Bootstrapping der 2.13 Release-Infrastruktur. Außerdem wurden die Parallel Collections aus der Standardbibliothek in ein eigenes Modul ausgelagert, welches das Package scala.collection.parallel
und damit die neue Heimat der Parallel Collections enthält.
Das M1 Release stellt auch eine kleine Schlankheitskur für Scala 2.13 dar, alle als deprecated markierten Dinge aus Predef
, scala._
und scala.runtime
wurden entfernt. Auch einige Module sind nicht mehr Teil der Distribution (scala-swing & scala-parser-combinators), bleiben aber via Maven Central erhältlich.
Während im zweiten Meilenstein nur kleinere Änderungen am REPL beinhaltete, war Scala 2.13.0-M3 wieder ein etwas reichhaltigeres Release. Meilenstein Nummer 3 brachte unter anderem die Unterstützung für Literal-Typen. Außerdem verwendet die Standardbibliothek nun das compact1-Profil, wodurch der Footprint von Scala-Anwendungen deutlich reduziert werden konnte.
Scalas neue Collections Library
Mit Scala 2.13.0-M3 erschien die letzte Scala-Version, die noch auf die alte Collection Library setzt. Die neue Bibliothek soll einfacher zu nutzen sein, dafür wurde zum Beispiel die Typ-Hierarchie angepasst. So existiert Traversable
gar nicht mehr, es gibt nur noch Iterable
. Auch die Nutzung von Views wurde vereinfacht: Sie erweitern den korrespondierenden Collection-Typ nicht mehr.
Neu ist auch, dass Transformationsmethoden keinen impliziten CanBuildFrom
-Parameter haben, wodurch sich die Nutzung der Bibliothek weniger kompliziert gestaltet. Diese Änderung steht auch im Zusammenhang mit dem Compiler, der dadurch Quelltext von Nutzern effizienter kompilieren kann.
Es gibt auch Erweiterungen der Bibliothek in Form von Collection Types: immutable.ArraySeq
fasst ein Array zusammen, immutable.LazyList
ist eine „lazy“ verbundene Liste. immutable.Stream
ist seit Meilenstein Nummer 4 deprecated, entfernt wurden unter anderem die Collections MutableList
und immutable.Stack
.
Weitere Informationen zu der neuen Collections Library gibt es im Changelog zu Scala 2.13.0-M4, dort sind auch alle anderen Änderungen des Meilensteins aufgeführt.
Beschreibung des Breaking Changes | Alter Code | Neuer Code | Regel für die automatische Migration |
---|---|---|---|
Die Methode to[C[_]] wurde entfernt. |
xs.to[List] |
xs.to(List) |
NewCollections , CrossCompat |
mutable.Map hat keine updated -Methode mehr. |
mutable.Map(1 -> 2).updated(1, 3) |
mutable.Map(1 -> 2).clone() += 1 -> 3 |
NewCollections , CrossCompat |
mapValues und filterKeys geben nun anstelle einer Map eine MapView zurück. |
kvs.mapValues(f) |
kvs.mapValues(f).toMap |
RoughlyMapValues |
Iterable beinhalted keine sameElements -Operation mehr. |
xs1.sameElements(xs2) |
xs1.iterator.sameElements(xs2) |
NewCollections , CrossCompat |
collection.breakOut existiert nicht länger. |
val xs: List[Int] = ys.map(f)(collection.breakOut) |
val xs = ys.iterator.map(f).to(List) |
NewCollections |
zip gibt im Zusammenhang mit Map[K, V] nun ein Iterable zurück. |
map.zip(iterable) |
map.zip(iterable).toMap |
Experimental |
ArrayBuilder.make akzeptiert keine Klammern mehr. |
ArrayBuilder.make[Int]() |
ArrayBuilder.make[Int] |
NewCollections , CrossCompat |
Breaking Changes für Nutzer von Collections in Scala 2.13 / Quelle: Scala FAQ auf GitHub
Der letzte Meilenstein; der erste Release-Kandidat
Mit dem fünften Meilenstein begab sich Scala 2.13 schließlich in den Feature Freeze, d.h. rien ne va plus für neue Funktionen in der Sprache nach dessen Erscheinen. Entsprechend groß war die Liste an Änderungen, die noch gerade rechtzeitig umgesetzt wurden. Auch in Scala 2.13.0-M5 wurde die Collections Library noch einmal angefasst, so sind die Implementierungen von HashMap
sowie HashSet
nun der Standard und der Status empty-or-not einer LazyList
ist nun ebenfalls „lazy“.
Der Wunsch nach reproduzierbaren Builds stand schon eine ganze Weile im Raum. Um dem entgegenzukommen, arbeitet der Compiler nun mit deterministischer Kompilierung. Mit der Finalisierung des fünften Meilensteins wurde in Bezug auf den Compiler ein Resümee gezogen: Er soll nun 5 bis 10 Prozent schneller laufen, als in Scala 2.12, was sich auch im Performance-Vergleich zeigt.
Lesen Sie auch: Einfach Scala – ein Einstieg auch für Java-Entwickler
Zu guter Letzt erschien also nun der erste Release Candidate für Scala 2.13, bei dem nichts weiter getan wurde, als der Collections Library den finalen Feinschliff zu geben. Man sollte allerdings bedenken, dass dieses Release nun nicht mehr binärkompatibel zu den vorangegangenen Meilensteinen ist.
Weitere Informationen zu Scala 2.13 und den großen Änderungen in Sachen Collections finden sich unter anderem in der Dokumentation, wo Martin Odersky und Lex Spoon eine Einführung zum neuen Collections Framework gegeben haben. Dort findet sich auch ein Artikel von Julien Richard-Foy zur Architektur der Bibliothek. Ansonsten finden sich sämtliche Neuerungen, die Scala 2.13 mit sich bringen wird, in den Release Notes zu den jeweiligen Meilensteinen (M1, M2, M3, M4 und M5).
PS: Scala ist ab Version 2.13 nun unter der Apache-2.0-Lizenz lizensiert.
Hinterlasse einen Kommentar