Das Warten hat (fast) ein Ende

Scala 2.13: Feature Freeze und erster Release Candidate

Dominik Mohilo

© 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.

W-JAX 2019 Java-Dossier für Software-Architekten

Kostenlos: Java-Dossier für Software-Architekten 2019

Auf über 30 Seiten vermitteln Experten praktisches Know-how zu den neuen Valuetypes in Java 12, dem Einsatz von Service Meshes in Microservices-Projekten, der erfolgreichen Einführung von DevOps-Praktiken im Unternehmen und der nachhaltigen JavaScript-Entwicklung mit Angular und dem WebComponents-Standard.

 

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.

Verwandte Themen:

Geschrieben von
Dominik Mohilo
Dominik Mohilo
Dominik Mohilo studierte Germanistik und Soziologie an der Goethe-Universität in Frankfurt. Seit 2015 ist er Redakteur bei S&S-Media.
Kommentare

Hinterlasse einen Kommentar

Hinterlasse den ersten Kommentar!

avatar
4000
  Subscribe  
Benachrichtige mich zu: