Scala 2.8 belohnt Fans der Programmiersprache

Der Sprung von Version 2.7 auf Version 2.8 bringt wesentlich mehr Neuerungen, als die Versionszahl vermuten lässt, und belohnt die Fraktion derer, die das neue Release der Programmiersprache schon lange herbeisehnen.

In Pocket speichern vorlesen Druckansicht 49 Kommentare lesen
Lesezeit: 5 Min.
Von
  • Michael Stal

Das lange Warten hat ein Ende. Die Programmiersprache Scala ist ab sofort in der Version 2.8 verfügbar. Während einiges beim Alten bleibt, erfährt die Sprache auch eine Menge substanzieller Erweiterungen und Überarbeitungen. Zudem lässt Version 2.8 auch viele der Methoden fallen, die bisher als "deprecated" annotiert waren. Ebenso entfällt die Unterstützung für die Version 1.4 der Java Virtual Machine (JVM). Wegen Änderungen am Binärcode gibt es des Weiteren keine Binärkompatibilität der Version 2.8 zu früheren Versionen, was aber die Quellcode-Kompatibilität nicht berührt. Die wichtigsten Neuerungen seien im Folgenden kurz vorgestellt.

Wie einige andere Programmiersprachen unterstützt Scala 2.8 vordefinierte Werte für Methodenparameter. Ein kurzes Code-Fragment veranschaulicht dieses Konzept:

def printHeader(text : String, copyright : String = "(c) 2010 by Heise") {
println(text + " " + copyright)
}

Übergibt der Aufrufer nur das erste Argument, so besetzt Scala das zweite copyright automatisch mit dem vorgegebenen Standardwert. Im Gegensatz dazu erlauben benannte ("named") Argumente auch einen Methodenaufruf mit beliebiger Reihenfolge der Argumente, also etwa printHeader(copyright = "Open Source", text = "iX").

Die Scala-Verantwortlichen haben die Collection-Bibliothek verbessert, sodass die Integration benutzerdefinierter Container-Klassen leichter vonstatten geht. Für den Anwender der Bibliothek ändert sich indes fast gar nichts. Nebst einigen Problembereinigungen bei Packages erlaubt Scala 2.8, mit Paketobjekten existierende Pakete um weitere Deklarationen zu ergänzen. Pakete beschränken sich dadurch nicht mehr auf Dateien in Verzeichnissen. Stattdessen lassen sich mit Paketobjekten zusätzliche Vereinbarungen für ein Paket spezifizieren. Als Anwendungsbeispiel geben die Scala-Entwickler Typ-Aliase an. Das Konzept kommt übrigens auch für die Rückwärtskompatibilität der neuen Collection-Klassen zum Einsatz.

package object scala
type List[+A] = scala.collection.immutable.List[A]
val List = scala.collection.immutable.List
...
}

Scala 2.8 unterstützt jetzt geschachtelte Java-Annotationen. Wie Java nutzt auch Scala Type Erasure, um alle Instanzen eines generischen Typs wie List[T] letztlich auf List[Any] zurückzuführen, sodass der Übersetzer nicht jeweils eine eigene Implementierung für jede Typparameter-Konstellation generieren muss. Das hat jedoch für einfache Datentypen die Nutzung teurer Boxing- und Unboxing-Funktionen zur Folge – schließlich müssen primitive Typen immer erst von und nach ihren Wrapper-Klassen transformiert werden. Daher arbeitet die Scala-Laufzeitumgebung unter der Haube mit den effizienten Java-Primitivtypen. Die Annotation @specialized sorgt nun dafür, dass der Compiler für einzelne oder mehrere primitive Parametertypen optimierte Implementierungen eines generischen Typs erzeugt.

Für den Zugriff auf die Swing-Bibliotheken bietet Version 2.8 bessere Dokumentation und neue Funktionen. Die REPL Shell (Read Evaluate Print Loop) erleichtert Anwendern die Arbeit, etwa durch Kommandovervollständigung. Das in früheren Scala-Versionen bereits verfügbare Combinator-Parsing ergänzt die neue Version um Packrat-Parsing. Durch die Möglichkeit, Parserzustände zu merken, lassen sich Backtracking-basierte Recursive-Decent-Parser mit beliebiger Vorschautiefe, aber linearer Zeitkomplexität realisieren.

Mit einem speziellen Plug-in-Compiler unterstützt Scala 2.8 Continuations, eine Art mächtiges Ablaufkontrollkonstrukt.

reset {
shift { k: (Int=>Int) => k(7) } + 1
}

Das Schlüsselwort reset umfasst den gesamten Bereich der Continuation. Die shift-Anweisung enthält den eigentlichen Code der Continuation, der bei einem Aufruf des Closure k durchlaufen wird. Insgesamt liefert das obige Statement 8 zurück. Continuations sind schwer zu verstehende Gebilde, die aber für Bibliotheksentwickler zur Optimierung interessant sein dürften, da sie Rekursionen auch ohne Stackframes ermöglichen und für diesen Zweck auf einem Ereignismodell aufsetzen.

Es tut sich auch etwas in der Aktor-Implementierung. Neue Reaktoren erlauben leichte, rein ereignisgesteuerte Aktoren. Ebenso lassen sich jetzt Aktoren als Hintergrundprozesse ausführen. Daneben können sich Entwickler an vielen weiteren Verbesserungen erfreuen. Zusätzliche Werkzeuge in Version 2.8 umfassen ScalaDoc 2 zur Erzeugung von besserer Dokumentation, Sbaz 2 für effizienteren Download von Scala-Paketen, den Disassembler scalap sowie ein wesentlich verbessertes Plug-in für Eclipse.

Daneben berichten die Scala-Verantwortlichen auch von vielen internen Verbesserungen. Die Geschwindigkeit des Compilers soll sich teilweise bis auf den Faktor 2 beschleunigen. In der Übersetzer-Infrastruktur sollen Maßnahmen den Bau von Plug-ins und IDEs spürbar erleichtern. Ein neuer Build-Manager macht keinen völligen Rebuild der Quellen mehr, sondern erkennt intelligent, was überhaupt aufgrund von Änderungen neu zu bauen ist. Der Sprung von Version 2.7 auf Version 2.8 bringt also wesentlich mehr Neuerungen, als die Versionszahl vermuten lässt, und belohnt die Fraktion derjenigen, die die neue Version schon lange herbeisehnen.

(ane)