Ein Artikel kann natürlich nicht die komplette Sprache erklären, ja eigentlich nicht einmal ein Grundlagen-Tutorial sein – dafür ist hier einfach nicht genug Platz. Aber ich kann zeigen, was mir an Scala gefällt, und die Grundkonzepte vorstellen. Detaillierte Informationen gibt es auf der Scala-Homepage, insbesondere in der Sprachspezifikation. Für die Vertiefung sei das exzellente Buch "Programming in Scala" empfohlen.
Überblick
Scala hat eine Menge mit Java gemeinsam, was nicht weiter verwundert – schließlich läuft es auf der Java VM. Es hat dieselben primitiven Typen, und Dinge wie Annotationen, Exceptions oder Generics sind fast identisch. Der Hauptunterschied zu Java ist, dass Scala eine erweiterbare, skalierbare Sprache ist. In Java gibt es für viele Problemstellungen Bibliotheken – das funktioniert, ist aber in der Syntax oft etwas umständlich. Bei Skriptsprachen dagegen sind viele Features wie reguläre Ausdrücke oder Collection-Literale Teil des Sprachkerns und haben eine entsprechend einfache Syntax. So nützlich solch syntaktischer Zucker bei Skriptsprachen ist, erstreckt er sich jeweils nur auf die begrenzte Menge an Features, die direkter Bestandteil der Sprache sind. Aber was ist, wenn man Vektorarithmetik haben will? Oder Aktor-basierte Parallelverarbeitung?
Scala geht einen dritten Weg. Es hat einen relativ schlanken Sprachkern, bietet aber die Möglichkeit, Bibliotheken zu schreiben, die sich nahtlos in die Sprache einfügen und die kaum von eingebauten Sprachfeatures zu unterscheiden sind. Scala ist eine funktionale Sprache, d. h. Funktionen sind vollwertige Sprachelemente. Es gibt natürlich auch Closures als Sonderfall von Funktionen und man kann Funktionen teilweise evaluieren. Damit man möglichst viele Vorteile aus der funktionalen Programmierung ziehen kann, unterstützt Scala seiteneffektfreies Programmieren. Neben Variablen gibt es Konstanten, Pattern Matching, seiteneffektfreie Collection-Klassen, und Scala optimiert rekursive Funktionen (Tail Recursion). Die Sprache erzwingt aber nicht einen „reinen“ funktionalen Stil, sondern bietet ihn pragmatisch als eine Option von mehreren an. Außerdem ist Scala konsequent objektorientiert. Auch Zahlen sind Objekte, und die Unterscheidung zwischen int und java.lang.Integer entfällt. Es gibt auch kein static, weder für Felder noch für Methoden, stattdessen kann man neben Klassen auch benannte Objekte definieren. Darüber hinaus bietet Scala eine Vielzahl von ausdrucksstarken Sprachmitteln, mit denen man Bibliotheken schreiben kann, die sich wie eingebaute Sprachfeatures anfühlen. Und auf Basis dieser Features bringt Scala eine Reihe extrem eleganter und nützlicher Bibliotheken mit, z.B. eine Concurrency-Bibliothek auf Basis von Aktoren im Stile von Erlang.
Hallo Welt!
Doch genug der Vorrede – die Ärmel hochgekrempelt und auf zu einem ersten Programm. Man kann Scala auf der Kommandozeile kompilieren oder starten, aber mit einer IDE macht das Arbeiten besonders am Anfang natürlich mehr Spaß. Die Scala-Distribution enthält einen Interpreter, mit dem man interaktiv einzelne Befehle ausprobieren kann. Es gibt aber auch Plug-ins für die gängigen IDEs. Der erste Schritt besteht im Anlegen eines Scala-Projekts (Eclipse-Terminologie). In diesem Projekt legen wir die Datei HelloWorld.scala an, deren Endung .scala sie als Scala-Quelltext auszeichnet. In dieser Datei landet der Quelltext, der unser erstes Scala-Programm darstellt. Wenn wir dieses Programm starten (STRG+F11 in Eclipse), dann gibt es erwartungsgemäß Grüße aus:
object HelloWorld extends Application {println ("Hallo Arno...")println ("... und hallo Welt")}
Scala kennt neben Klassen auch Objekte als direkte Sprachkonstrukte – Singletons, die unter ihrem Namen überall verfügbar sind und mit dem Schlüsselwort object definiert werden. Sie haben in etwa die Rolle, die static in Java hat. Hier interessiert uns zunächst nur, dass ein Objekt, das von Application erbt, direkt Scala-Code enthalten kann, den man dann als Programm starten kann. Semikolons sind in Scala optional, zumindest am Ende einer Zeile.




