scala

Als ausgereifte objektorientierte Sprache, portabel durch den Einsatz einer virtuellen Maschine, komfortabel durch den Garbage Collector und mit einer umfangreichen Infrastruktur und vielen Bibliotheken ausgestattet, kommt Java vielen Entwicklern entgegen. Doch die Vorzeichen ändern sich, denn Multi-Core- und Multiprozessor-Systeme stellen neue Anforderungen an die Entwicklung parallel arbeitender Software. Die neuen Sprachen Clojure und Scala auf Basis der Java Virtual Machine versuchen sie zu erfüllen.

Während Clojure den Java-Entwickler durch seine Notation eher verwirren dürfte, zeigt Scala seine Verwandtschaft zu Java viel deutlicher. Scala ist ein Hybrid aus objektorientierter und funktionaler Sprache.

Die elegante, ausdrucksstarke Programmiersprache eignet sich für alle Aufgaben und kann problemlos Java und C# ersetzen. Der Programmcode selbst ist, im Gegensatz zu anderen Programmiersprachen, in der Regel nur halb so lang und setzt sich im Kern aus klaren Konzepten zusammen. Scala eignet sich besonders für parallele Programmierung und erleichtert diese. Scala arbeitet sowohl mit Java- als auch .Net-Plattformen zusammen und greift auch auf Bibliotheken und Frameworks der jeweiligen Plattform zurück. Darüber hinaus besitzt Scala eine große Auswahl eigener Standardbibliotheken und bietet eine Werkzeugpalette mit Compiler, Interpreter, IDE-Plug-ins, sodass ein Einsatz für anspruchsvolle Projekte gegeben ist. Der Unterschied zu Java besteht jedoch darin, dass Scala eine erweiterbare und skalierbare Sprache ist. Über die Kommandozeile könnt ihr Programme kompilieren oder starten. Der Interpreter hilft, einzelne Befehle interaktiv auszuprobieren. Der Quelltext für die Programmierung landet in einer Datei mit der Endung .scala.

Ich werde an dieser Stelle eine Einführung in Scala geben.

Procedere as usual: ich installiere mir den Scala-Compiler mittels apt-get oder Synaptic auf mein Debian basierendes System.

linux% scala

Welcome to Scala version 2.7.5final (Java HotSpot(TM) Server VM, Java 1.6.0_20).

Type in expressions to have them evaluated.

Type :help for more information.

scala> 1+2 // Ich benutze Scala als Taschenrechner

res0: Int = 3

genscala> res0*3

res1: Int = 9 // usw. usw.

scala> println("Hello Linux-User!") // printline oder einfach nur print

Hello Linux-User!

scala>

Ich verlasse den Interpreter mit :q oder strg+d

Definition von Variablen:

Scala differenziert zwischen vals, Variable die, einmal deklariert, nicht geändert werden können, es sei denn man deklariert sie neu, und vars die innerhalb der Laufzeit wechselbar sind.
Einige Beispiele:

scala> val bsp = "Good morning"
bsp: java.lang.String=Good morning

bsp wird hier als Name für den Wert "Good morning" eingeführt. Der Type des Wertes ist java.lang.String da jeder Scala String auch ein Java String ist. ( Jede Java Klasse ist auch in Scala verfügbar.)

scala> println (bsp)
Good morning

Wenn ich nun versuche bsp einen neuen Wert zu übergeben erhalte ich eine Fehlermeldung.

scala> bsp = "Good night"
<console>:5: error: reassignment to val
       bsp = "Good night"
           ^

scala>

Ganz anders bei var.

scala> var ssp = "Welcome"
ssp: java.lang.String = Welcome

scala> println (ssp)'
Welcome

scala> ssp = "Goodbye"
ssp: java.lang.String = Goodbye

scala> println (ssp)
Goodbye

Definition von Methoden:

Anders als bei Variablen werden Methoden mit "def" gestartet. Danach geben wir den Methodennamen ein, gefolgt von einer Liste von Parametern. Bei Deklaration von Parametern muss man immer den Typ mit angeben.

scala> def max(x:Int, y:Int):Int = if ( x < y) y else x

max: (Int,Int)Int

scala>
max (7,19)
res1: Int = 19

Ansonsten erhalte ich folgende Fehlermeldung:

scala> def max(x, y) = if ( x < y) y else x
<console>:1: error: ':' expected but ',' found.
       def max(x, y) = if ( x < y) y else x
                ^

Gebe ich keine Parameter an kann ich auch auf die Typ-Deklaration verzichten.

scala> def immerdasgleiche() = println("Hello World!")
immerdasgleiche: ()Unit

scala> immerdasgleiche
Hello World!

scala>

Anmerkung:

Wie ich oben beschrieben habe ist der Code von Scala wirklich nur halb so lang wie vergleichbare Programme in Java oder C#.
Doch wenn ich mir nun andere, funktionale, Sprachen anschaue erscheint mir der Scala-Code noch viel zu umfangreich.

Das gleiche Programm in Haskell:

ghci > let max x y  = if x < y then y else x

Oder OCaml:

# let max x y = if x < y then y else x;;
val max : 'a -> 'a -> 'a = <fun>

Und ich kann, anders als in Scala, alle Arten von Typen aufrufen ohne das Programm umschreiben zu müssen!
Sowohl in Haskell als auch in OCaml.

# max 3 5;;
- : int = 5

# max 3.0 5.5;;
- : float = 5.5

# max "a" "b";;
- : string = "b"

In Haskell kann ich sogar, anders als bei F# oder OCaml, die Typen mischen:

ghci> max 3.0 5
5.0

D.h. ich gebe einen "Float"-Wert und einen "Integer"-Wert ein und erhalte als Ergebnis ein "Float" und nicht wie bei den Anderen eine Fehlermeldung.Lachend

Das Schreiben von Scala-Scripten

Da Scala dafür prädestiniert ist in grossen Projekten Anwendung zu finden, eignet es sich hervoragend dazu in Skripten ausgeführt zu werden. Ich öffne dazu einen Texteditor meiner Wahl und gebe folgende Zeile ein:

println ("Hallo, dies kommt von einem Skript!")

und speichere dies als "hello.scala"

In der shell rufen wir das Skript auf:

linux% scala hello.scala

und es erscheint:

Hallo, dies kommt von einem Skript!

Unter Linux können wir ein Scala script auch als ein shell script ausführen lassen, in dem wir im Kopf ein "pound bang" deklarieren. Wir öffnen in der shell den Texteditor vi ( vi benutzen ist cool!)

linux% vi helloarg

Der Editor öffnet sich und wir drücken "i" um eine Eingabe vor zu nehmen und geben folgenden Code ein. ( Ich werde vi noch an anderer Stelle ein wenig ausführlicher vorstellen.)

Um vi wieder zu verlassen und unseren Text zu speichern geben wir :wq ein.

Wir sind wieder in der shell und ändern die execute-Rechte für die Datei 'helloarg'

linux% chmod +x helloarg

Wenn wir nun unsere Datei aufrufen

linux% ./helloarg Horst

erscheint:

Hello, Horst!

Der Ausdruck args(0) besagt hier, dass bei Aufruf der Datei der erste Ausdruck der dem Dateinamen folgt ausgeliefert wird.
Wie üblich fängt man auch hier bei 0 an zu zählen. D.h. 0 = erste Variable; 1 = zweite Variable; usw.

Im Allgemeinen gehört es zum guten Ton Programmier-Tutorials in englischer Sprache zu veröffentlichen. Vermutlich damit man weltmännischer wirkt.
Ich habe vor kurzem ein F# Tutorial auf YouTube gesehen welches von einem Deutschen auf Englisch gesprochen wurde.
Wirkte ein wenig peinlich, da der Gute dabei ziemlich viele Fehler machte. Darum freue ich mich umso mehr, dass ich euch hier ein
Scala-Tutorial auf Deutsch vorstellen kann.