[[Vorlage(Getestet, jammy)]] {{{#!vorlage Wissen [:Pakete_installieren: Installation von Programmen] [:Terminal: Ein Terminal öffnen] [:Editor: Einen Editor öffnen] }}} [[Inhaltsverzeichnis(2)]] [[Bild(scala-logo.png, align=left)]] [http://www.scala-lang.org/ Scala] {en} ist eine Programmiersprache, die mit dem Ziel entwickelt wird, gängige Programmiermethoden präzise, elegant und typsicher auszudrücken. Sie unterstützt funktionale und objektorientierte Programmierung. Der integrierte Compiler übersetzt den Quellcode in Java-Bytecode, der mittels [:Java:] ausgeführt werden kann. Java-Bibliotheken können aus Scala heraus bruchlos aufgerufen werden, so dass Javaprogrammierer eine Menge APIs, beispielsweise zu Swing, JDBC und Netzwerk weiterverwenden können. Umgekehrt lässt sich Scalacode aus Java nutzen. Hat man die selbe Funktionalität sowohl in Scala als auch in Java programmiert, fällt auf, dass der Java-Quellcode doppelt bis dreifach so lang ist. Als Alternative zu [:Shell:]-Scripts können Scalascripte geschrieben werden. Beim ersten Start eines Scalascripts wird dieses erst kompiliert und hat daher eine längere Laufzeit. Scala wird seit 2001 am Labor für Programmiermethoden an der [wikipedia:%C3%89cole_polytechnique_f%C3%A9d%C3%A9rale_de_Lausanne:École polytechnique fédérale de Lausanne] unter der Leitung von [http://lamp.epfl.ch/~odersky/ Martin Odersky] {en} entwickelt. = Installation = Folgende Pakete werden empfohlen [1]: {{{#!vorlage Paketinstallation scala, universe scala-doc, universe }}} In der LTS-Ubuntuversion 22.04 wird dann Scala in der Version 2.11 installiert. = Interaktive Konsole (REPL) = Die Arbeitsweise einer Konsole [2] ist ähnlich der [:Shell:] für Linux. Sie ist vor allem für Einsteiger und zum Testen von kleineren Abschnitten des Quelltextes nützlich, da die eingegebenen Befehle sofort ausgeführt werden. REPL steht dabei für read-eval-print-loop. Die interaktive Konsole wird gestartet durch [2] {{{#!vorlage Befehl scala }}} = Skripte = Skripte sind meist kleinere Programme, die von Scala direkt ausgeführt werden können, ohne vorher in Java-Bytecode übersetzt zu werden. Ein Skript wird mit einem Editor [3] erstellt und in einer Datei mit der Endung '''.scala ''' gespeichert. Im Beispiel werden die übergebenen Argumente in einer foreach-Schleife der Reihe nach verarbeitet. Bei fehlenden Parametern tut ''''foreach'''' nichts. Das Folgende als Datei '''scala-test.scala''' anlegen. {{{#!code scala def promptprint (s: String) = {println ("> " + s)} println ("Hallo ") args foreach promptprint }}} Gestartet wird das Script via {{{#!code bash scala -nc scala-test.scala }}} Der Schalter `-nc` schaltet den fsc-offline-Compiler aus. = Ausführbare Objekte = Häufiger als Scripte werden in Scala Objekte oder Klassen deklariert, die vor der Ausführung kompiliert werden. {{{#!code scala object Otest { def main (args: Array[String]) : Unit = { args.foreach (println) } } }}} Hier beispielsweise ein Objekt ''Otest'', das mit dem Compiler `scalac Otest.scala` kompiliert wird, um dann mit `scala Otest` aufgerufen zu werden. = Codebeispiele = == Definition einer Methode == {{{#!code scala def max (x: Int, y: Int) = if (x > y) x else y }}} Der letzte Ausdruck einer Methode ist ihr Rückgabewert, hier also je nach Wert x oder y. Ein explizites Returnstatement benutzt man nur, um eine Methode vorzeitig zu verlassen. Prozeduren, bzw. Methoden ohne Rückgabe, die nur Seiteneffekte auslösen, werden ohne `=` eingeleitet. {{{#!code scala def greet (name: String) { println ("Hallo " + name + "!") } }}} == Listen und Maps == Definition und Ausgabe einer Liste. Klassisch: {{{#!code scala val list = List ("hello", "world") for (s <- list) println (s) }}} oder funktional: {{{#!code scala val list = List ("hello", "world") list foreach println }}} oder so: {{{#!code scala val list = List ("hello", "world") list.map (println) }}} Definition einer Map und Ausgabe eines Eintrags: {{{#!code scala var capital = Map ("US" -> "Washington", "France" -> "Paris") capital += ("Japan" -> "Tokyo") println (capital ("France")) }}} Ausgabe aller Dateien mit der Endung .scala: {{{#!code scala (new java.io.File (".")).listFiles.filter (f => f.getName.endsWith (".scala")).foreach (println) }}} = Projekte, die Scala verwenden = Der bekannteste Einsatz von Scala ist wohl [http://www.scala-lang.org/node/1008 Twitter] {en}. Viele weitere Projekte gibt es bei [http://sourceforge.net/search/index.php?words=scala Sourceforge] {en} und [http://github.com/search?type=Repositories&language=&q=scala&repo=&langOverride=&x=19&y=11&start_value=1 GitHub] {en}. = IDE Vergleich = * IntelliJ IDEA Community Edition (kostenlos und OpenSource) + Scala plugin gilt als die Entwicklungsumgebung, die Scala am besten unterstützt. Information zu Datentypen per [[Vorlage(Tasten, ctrl+q)]] * Das Eclipse-Plugin hat Schwächen bei Code-Completion, Debugging, Maven-Unterstützung (m2eclipse). Information zu Datentypen per mouseover. * Das NetBeans Scala-Plugin "Scala For NetBeans" wurde seit 2008 nicht mehr aktualisiert. * Emacs + ENSIME + SBT gilt als besonders schnell. = Links = * [wikipedia:Scala_(Programmiersprache): Wikipedia] Eintrag zu Scala * [http://scala-forum.org Scala Forum] {en} {de} * [https://wiki.scala-lang.org Scala-Wiki] {en} * [http://stackoverflow.com/questions/2668153/how-to-use-scala-in-intellij-idea-or-why-is-it-so-difficult-to-get-a-working-id Entwicklungsumgebungen für Java] {en} * [http://www.freiesmagazin.de/mobil/freiesMagazin-2011-05-bilder.html#11_05_scala Parallelisierung mit Scala] {de} - Artikel in FreiesMagazin Mai 2011 * [http://scalatutorial.wordpress.com/ Deutsches Scala Tutorial für Umsteiger imperativer Programmiersprachen] * [http://stackoverflow.com/questions/2952732/samples-of-scala-and-java-code-where-scala-code-looks-simpler-has-fewer-lines/2984991#2984991 Vergleich der Codelänge] {en} von Scala gegenüber Java * [:Programmierung:] - Übersichtsseite zum Thema Programmierung #tag: Programmierung, Java