Scala 2.12 erschienen: Scala-Funktionen direkt aus Java 8 heraus starten

Scala 2.12 + Java 8 = ♥

Dominik Mohilo

Scala-Logo © Scala;

Landschaft © Shutterstock.com / Galushko Sergey (mod.)

Lange wurde darüber diskutiert, nun ist es endlich soweit: Scala 2.12 ist da. Kernstück des Updates ist die verbesserte Interoperabilität mit Java 8, doch auch einige neue Sprachfeatures und Optimierungen des Toolings sind Teil der neuen Scala-Version. Wir haben uns die Verbesserungen angesehen.

Was in unserem Scala-Experten-Check hier auf JAXenter bereits anklang, bestätigt das aktuelle Release von Scala 2.12: Revolutionäre neue Features hat die neue Scala-Version auch nach etwa zweieinhalb Jahren Entwicklungszeit nicht zu bieten. Nichtsdestotrotz ist das aktuelle Release ein Meilenstein in der Evolution der JVM-Sprache.

Das sagen die Experten über Scala 2.12

Daniel WestheideDaniel Westheide: Spannend finde ich vor allem, dass Scala 2.12 Java 8 voraussetzt und dadurch auch die Interoperabilität zwischen Scala und Java 8 verbessert wird. Zum einen werden einige Scala-Konstrukte sich nun die Java-8-Bytecode-Erweiterungen zunutze machen, zum anderen heißt das, dass man Scala-Funktionen ohne weiteres aus Java 8 heraus aufrufen können wird.

ivanIvan Kusalic: Ich interessiere mich am meisten für den Style Checker. Scala-Syntax ist sehr flexibel, was eigentlich großartig ist. Doch als Folge davon sind zusätzliche Anstrengungen nötig, um größere Codebasen konsistent zu halten. In meinem Team kümmern wir uns um diesen Aspekt in den Code-Reviews, aber es dauert eine Weile, bis Team-Mitglieder hier Geschwindigkeit aufnehmen.

markus HauckMarkus Hauck: Durch die Einführung neuer Features in Java 8 hat es Scala einfacher, viele der Features der Sprache nach Java zu übersetzen.  Außerdem gibt es viele kleinere Änderungen in der Standardbibliothek, so ist z.B. Either endlich “right-biased” und auch Futures haben einige nützliche neue Methoden bekommen.

heiko seebergerHeiko Seeberger: Scala 2.12 hat eigentlich fast nur ein Ziel, und zwar die Integration mit Java 8. Als Anwender können wir nun die neuen Java Streams aus Scala heraus aufrufen, indem wir Scala Lambdas übergeben; umgekehrt funktioniert das natürlich analog. Unter der Haube sorgt die Verwendung von neuen JVM Features dazu, dass der Compiler viel weniger Bytecode erzeugen muss.

Julien Tournay: Der verbesserte Support für Java 8 ist wirklich schön. Dadurch sollte die Runtime Performance, Bytecode-Größe und Komplilierungsgeschwindigkeit signifikant verbessert werden. Eine Sache, über die ich mich besonders freue, ist, dass der SI-2712 endlich bearbeitet wurde. Dieser Bug hat Scala-Entwicklern jahrelang Probleme verursacht, insbesondere Autoren von Bibliotheken.

Neue Sprachfeatures im Detail

Ein wichtiger Schritt in Richtung Interoperabilität mit Java 8 und Binärkompatibilität ist die Fähigkeit von Scala 2.12, Traits direkt zu einem Interface mit Default-Methoden zu kompilieren. Traits und Funktionen werden somit zu deren Äquivalenten in Java 8 kompiliert. Der Compiler ist also nicht mehr gezwungen, Implementierungsklassen (T$class.class) und anonyme Funktionsklassen (C$$anonfun$1.class) zu generieren.

Der Type Checker von Scala akzeptiert mit Version 2.12 nun auch Funktionsliterale als validen Ausdruck für jeden Single-Abstract-Methoden-Typen (SAM). Die zusätzliche Option, die die Nutzung der FunctionN-Typen der Standardbibliothek nicht mehr obligatorisch macht, soll die Nutzung von Bibliotheken, die für Java 8 geschrieben wurden, in Scala verbessern. Durch die Verwendung von Default-Methoden werden Scalas eingebaute FunctionN-Traits in SAM-Interfaces kompiliert. Somit können Scala-Funktionen aus Java-Code unter Verwendung der Lambda-Syntax erstellt werden.

Scala-Funktionen mit Javas Lambda-Syntax / Quelle: Scala-lang.org

Scala-Funktionen mit Javas Lambda-Syntax / Quelle: Scala-lang.org

Mit Scala 2.12 gibt die Programmiersprache auf die gleiche Weise Bytecode für (Lambda-)Funktionen aus, wie Java 8. Dabei ist es egal, ob diese Funktionen FunctionN-Klassen aus der Standardbibliothek oder eine vom Nutzer definierte SAM-Type ansprechen.

Verbesserungen des Toolings

Das Backend GenBCode, das Bytecode direkt von den Scala Compiler Trees generiert, ist neuer Standard für die aktuelle Scala-Version. Die alten Backends (GenASM und GenIcode) wurden entfernt. Auch der Output von Scaladoc wurde überarbeitet und soll sich nun moderner und attraktiver anfühlen und leichter zu nutzen sein.

Der komplett überarbeitete Optimizer stellt eine der zentralen Verbesserungen des Updates dar. Er ist, genau wie der neue Inliner, im neuen Backend GenBCode enthalten und wird über die Compiler-Option -opt konfiguriert. Als Standardeinstellung entfernt er lediglich unerreichbaren Code innerhalb einer Methode, eine Liste von möglichen Einstellungsoptionen kann über -opt:help eingesehen werden. Zu den möglichen Optionen gehören unter anderem das Inlining finaler Methoden und die Eliminierung toten Codes.

Vorsicht! Die Entwickler von Scala 2.12 empfehlen, das Inlining nur für Produktions-Builds zu aktivieren. Zudem sollte man darauf achten, dass sämtliche Abhängigkeiten die gleiche Version haben, wenn Inlining auf Code vom Klassenpfad angewandt wird.

Zu guter Letzt wurde auch das Java-8-Kompatibilitätsmodul für Scala in der aktuellen Version 2.12 überarbeitet. Zwar ist die Interoperabilität zwischen Single Abstract Methods in Java 8 und Funktionen in Scala fest in die Sprache eingebaut, aber das Modul macht die Arbeit für Entwickler mit Java-8-SAMs noch komfortabler. Die Unterstützung für Java-8-Streams wurde ebenfalls implementiert.

Kompatibilität

Auch der Release-Zyklus 2.12.x wird wieder nach dem Prinzip der Binärkompatibilität entwickelt, d.h. alle Updates der 2.12-Entwicklungslinien werden binärkompatibel sein. Diese Politik wird bereits seit Version 2.10 angewandt, gilt allerdings nur für die Release-Zyklen an sich. Die Scala-Versionen 2.11 und 2.12 sind zwar größtenteils quellcodekompatibel, nicht aber binärkompatibel. Mit dieser Vorgehensweise soll sichergestellt werden, dass die Standardbibliothek und der Compiler auch weiterhin verbessert werden können.

Weitere Informationen zum aktuellen Update von Scala sind den Release Notes zu entnehmen, dort sind auch Breaking Changes und bekannte Probleme mit der aktuellen Version hinterlegt.

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
400
  Subscribe  
Benachrichtige mich zu: