<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Scala_%28Programmiersprache%29</id>
	<title>Scala (Programmiersprache) - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Scala_%28Programmiersprache%29"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Scala_(Programmiersprache)&amp;action=history"/>
	<updated>2026-05-31T18:47:13Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Wikipedia (Deutsch) – Lokale Kopie</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki-de.moshellshocker.dns64.de/index.php?title=Scala_(Programmiersprache)&amp;diff=246248&amp;oldid=prev</id>
		<title>imported&gt;BrunoBoehmler: /* Literatur */ LIT in Zeilen- statt Tabellenform</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Scala_(Programmiersprache)&amp;diff=246248&amp;oldid=prev"/>
		<updated>2026-04-16T20:21:29Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Literatur: &lt;/span&gt; LIT in Zeilen- statt Tabellenform&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Infobox Programmiersprache&lt;br /&gt;
| Name                          = Scala&lt;br /&gt;
| Logo                          = [[Datei:Scala-full-color.svg|220px]]&lt;br /&gt;
| Beschreibung                  = objektorientierte und funktionale Sprache&lt;br /&gt;
| Paradigma                     = [[Objektorientierte Programmierung|objektorientiert]], [[Funktionale Programmierung|funktional]], [[Imperative Programmierung|imperativ]]&lt;br /&gt;
| Erscheinungsjahr              = &amp;lt;!-- wikidata --&amp;gt;&lt;br /&gt;
| Designer                      = &amp;lt;!-- wikidata --&amp;gt;&lt;br /&gt;
| Entwickler                    = &amp;lt;!-- wikidata --&amp;gt;&lt;br /&gt;
| AktuelleVersion               =  &amp;lt;!-- Wikidata --&amp;gt;&lt;br /&gt;
| AktuelleVersionFreigabeDatum  = &amp;lt;!-- Wikidata --&amp;gt;&lt;br /&gt;
| AktuelleVorabVersion          = &lt;br /&gt;
| AktuelleVorabVersionFreigabeDatum = &lt;br /&gt;
| Typisierung                   = [[Statische Typisierung|statisch typisiert]]&lt;br /&gt;
| Implementierung               = &lt;br /&gt;
| Betriebssystem                = [[Plattformunabhängigkeit|plattformunabhängig]], [[Java Virtual Machine|JVM]], [[JavaScript]]&amp;lt;ref name=&amp;quot;scala-js&amp;quot; /&amp;gt;, [[LLVM]]&amp;lt;ref&amp;gt;{{Internetquelle |url=http://www.scala-native.org/ |titel=Scala Native |sprache=en |abruf=2019-04-24}}&amp;lt;/ref&amp;gt; (experimentell)&lt;br /&gt;
| Dialekte                      = &lt;br /&gt;
| Standardisierungen            = &lt;br /&gt;
| Beeinflusste                  = [[Kotlin (Programmiersprache)|Kotlin]]&lt;br /&gt;
| Beeinflusst_von               = &amp;lt;!-- wikidata --&amp;gt;&lt;br /&gt;
| Lizenz                        = &amp;lt;!-- wikidata --&amp;gt;&lt;br /&gt;
| Website                       = &amp;lt;!-- wikidata --&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Scala&amp;#039;&amp;#039;&amp;#039; ist eine [[Funktionale Programmiersprache|funktionale]] und [[Objektorientierte Programmiersprache|objektorientierte]] [[Programmiersprache]].&lt;br /&gt;
&lt;br /&gt;
== Konzepte ==&lt;br /&gt;
=== Integration mit Java ===&lt;br /&gt;
Scala-Programme können [[Java Archive]] (umgangssprachlich JAR-Datei) ansprechen und Java-Programme können Scala-Dateien ansprechen.&amp;lt;ref&amp;gt;[http://www.scala-lang.org/node/25 Englischsprachige Vorstellung von Scala] auf deren offizieller Internetseite.&amp;lt;/ref&amp;gt; Es können also alle bestehenden Java-[[Programmbibliothek|Bibliotheken]] und -[[Framework]]s in Scala-Projekte eingebunden und dort genutzt werden. Umgekehrt ist das zwar prinzipiell möglich, in der Praxis aber nicht immer problemlos. Ähnliches gilt für die meisten Werkzeuge: [[Integrierte Entwicklungsumgebung|Entwicklungsumgebungen]] wie [[Eclipse (IDE)|Eclipse]], [[NetBeans]] oder [[IntelliJ]] unterstützen Scala ebenfalls.&lt;br /&gt;
&lt;br /&gt;
=== Objektorientierung ===&lt;br /&gt;
Scala ist, anders als Java, eine rein [[objektorientierte Programmiersprache]]. Jeder Wert ist ein Objekt. Das gilt auch für primitive Datentypen, ohne dass es zu [[Rechenleistung|Performance]]-Einbußen kommt, denn der vom [[Compiler]] erzeugte Bytecode verwendet primitive Datentypen.&lt;br /&gt;
&lt;br /&gt;
Interfaces werden über den Mechanismus der &amp;#039;&amp;#039;[[Trait (Programmierung)|Traits]]&amp;#039;&amp;#039; implementiert. Traits bestehen nicht nur aus Definitionen, sie können bereits konkrete Implementierungen von Methoden enthalten. [[Klasse (Objektorientierung)|Klassen]] können einen oder mehrere Traits erweitern (Schlüsselwort &amp;lt;code&amp;gt;extends&amp;lt;/code&amp;gt;).&amp;lt;ref&amp;gt;[http://www.scala-lang.org/node/126 Traits] und [http://www.scala-lang.org/node/117 Mixin Class Composition] (englische Erläuterung auf der Scala-Internetseite)&amp;lt;/ref&amp;gt; Dabei handelt es sich nicht um [[Mehrfachvererbung]], sondern um einen [[Mixin]]-Mechanismus.&lt;br /&gt;
&lt;br /&gt;
Über das Schlüsselwort &amp;lt;code&amp;gt;object&amp;lt;/code&amp;gt; (anstelle von &amp;lt;code&amp;gt;class&amp;lt;/code&amp;gt;) wird eine Implementierung des [[Entwurfsmuster]]s [[Singleton (Entwurfsmuster)|Singleton]] bereitgestellt. Statische Felder oder Methoden fehlen in Scala, sie werden stattdessen in einem &amp;lt;code&amp;gt;object&amp;lt;/code&amp;gt; definiert.&lt;br /&gt;
&lt;br /&gt;
=== Funktionale Sprache ===&lt;br /&gt;
{{Hauptartikel|Funktionale Programmierung}}&lt;br /&gt;
&lt;br /&gt;
Funktionen sind [[First-Class-Objekt]]e. Sie können an allen Stellen verwendet werden, an denen Werte erlaubt sind, z.&amp;amp;nbsp;B. Zuweisung an eine [[Variable (Programmierung)|Variable]] (hier ist nicht das Ergebnis der Funktionsauswertung gemeint, sondern die Funktionen selbst) oder bei der Parameterübergabe. Methoden sind selbst aber keine First-Class-Objekte, können aber jederzeit in Funktionen umgewandelt werden. Auch [[Funktion höherer Ordnung|Funktionen höherer Ordnung]]&amp;lt;ref&amp;gt;[http://www.scala-lang.org/node/134 Funktion höherer Ordnung] (englische Erläuterung auf der Scala-Internetseite)&amp;lt;/ref&amp;gt; sind in Scala realisiert, wodurch beispielsweise [[Currying]] ermöglicht wird.&lt;br /&gt;
&lt;br /&gt;
==== Pattern Matching ====&lt;br /&gt;
Ein wichtiger Aspekt zur Unterstützung der funktionalen Programmierung mit Scala ist [[Pattern Matching]]. Im Gegensatz zu der [[Case-Anweisung#Mehrfache Verzweigung|switch]]-Anweisung, wie sie zum Beispiel in Java implementiert ist, arbeitet Pattern Matching nicht nur auf der Basis von Werten, sondern auch bezogen auf die Struktur bzw. den Typ eines Objektes. Um auf eine Instanz Pattern Matching anwenden zu können, muss es für sie ein Singleton-Objekt geben, das die unapply-Methode&amp;lt;ref&amp;gt;[https://docs.scala-lang.org/tour/extractor-objects.html#inner-main Extractor Objects] (englische Erläuterung auf der Scala-Internetseite)&amp;lt;/ref&amp;gt; implementiert. So kann man Werte aus der Klasse extrahieren, die entsprechend der unapply-Methode von den Feldern der Klasse abgeleitet werden. Da man oft nur die Felder selbst extrahieren muss, gibt es sogenannte Case Classes&amp;lt;ref&amp;gt;[http://www.scala-lang.org/node/107 Case Classes] (englische Erläuterung auf der Scala-Internetseite)&amp;lt;/ref&amp;gt; in Scala. Bei ihnen generiert der Scala-Compiler automatisch und vom Programmierer unbemerkt ein gleichnamiges Singleton-Objekt mit apply- und unapply-Methode.&lt;br /&gt;
&lt;br /&gt;
Der folgende Code implementiert die Suche in einem [[Binärer Suchbaum|binären Suchbaum]] mithilfe von Pattern Matching und Case Classes:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;scala&amp;quot;&amp;gt;&lt;br /&gt;
enum Tree:&lt;br /&gt;
  case Leaf(key: Int)&lt;br /&gt;
  case Branch(key: Int, left: Tree, right: Tree)&lt;br /&gt;
&lt;br /&gt;
import Tree._&lt;br /&gt;
&lt;br /&gt;
def contains(tree: Tree, key: Int): Boolean = tree match&lt;br /&gt;
    case Leaf(i)                        =&amp;gt; i == key&lt;br /&gt;
    case Branch(i, _, _) if i == key    =&amp;gt; true&lt;br /&gt;
    case Branch(i, left, _) if i &amp;gt; key  =&amp;gt; contains(left, key)&lt;br /&gt;
    case Branch(i, _, right)            =&amp;gt; contains(right, key)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispielaufruf:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;scala&amp;quot;&amp;gt;&lt;br /&gt;
val sorted: Tree = Branch(4, Leaf(2), Branch(7, Leaf(6), Leaf(8)))&lt;br /&gt;
&lt;br /&gt;
println(s&amp;quot;contains(sorted, 4) -&amp;gt; ${contains(sorted, 4)}&amp;quot;)&lt;br /&gt;
println(s&amp;quot;contains(sorted, 5) -&amp;gt; ${contains(sorted, 5)}&amp;quot;)&lt;br /&gt;
println(s&amp;quot;contains(sorted, 6) -&amp;gt; ${contains(sorted, 6)}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
// Ausgabe:&lt;br /&gt;
// contains(sorted, 4) -&amp;gt; true&lt;br /&gt;
// contains(sorted, 5) -&amp;gt; false&lt;br /&gt;
// contains(sorted, 6) -&amp;gt; true&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Closures ====&lt;br /&gt;
{{Hauptartikel|Closure (Funktion)}}&lt;br /&gt;
&lt;br /&gt;
Funktionen greifen nicht nur auf ihre Parameter und lokalen Variablen zu, sondern auch auf Variablen ihres Kontextes (Scope), welche zum Auswertungszeitpunkt gültig sind. Dadurch werden aus &amp;#039;&amp;#039;open terms&amp;#039;&amp;#039; die namensgebenden &amp;#039;&amp;#039;closed terms&amp;#039;&amp;#039;. Falls sich bei mehrfacher Verwendung der Funktion der Wert einer Variablen des Kontextes gegenüber einem früheren Auswertungszeitpunkt ändert, kann sich auch der Rückgabewert und das Verhalten der Funktion ändern.&lt;br /&gt;
&lt;br /&gt;
=== Typsystem ===&lt;br /&gt;
Scala ist [[Statische Typisierung|statisch typisiert]].&lt;br /&gt;
Generische Klassen verwenden [[Generischer Typ|Typen]], die zum Entwicklungszeitpunkt noch nicht festgelegt sind, z.&amp;amp;nbsp;B. &amp;lt;code&amp;gt;List[T]&amp;lt;/code&amp;gt;&lt;br /&gt;
Oberklassen können abstrakte Typen&amp;lt;ref&amp;gt;[http://www.scala-lang.org/node/105 Abstrakte Typen] (englische Erläuterung auf der Scala-Internetseite)&amp;lt;/ref&amp;gt; vorgeben, die von deren Unterklassen in Form konkreter Typen spezifiziert werden müssen. Gleiches gilt für Variablen (&amp;lt;code&amp;gt;var&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;val&amp;lt;/code&amp;gt;) sowie Methoden.&lt;br /&gt;
&lt;br /&gt;
==== Kovarianz und Kontravarianz ====&lt;br /&gt;
{{Hauptartikel|Kovarianz und Kontravarianz}}&lt;br /&gt;
&lt;br /&gt;
Typparameter einer generischen Klasse können mit einer Annotation versehen werden, die bestimmt, wie sich Untertyprelationen von Typargumenten auf die Untertyprelation von generischen Instanziierungen der Klasse auswirken. Invarianz, Syntax: &amp;lt;code&amp;gt;K[T]&amp;lt;/code&amp;gt;, bedeutet, dass überhaupt kein Zusammenhang besteht. Kovarianz, Syntax: &amp;lt;code&amp;gt;K[+T]&amp;lt;/code&amp;gt;, bedeutet, dass sich die Relation in gleicher Richtung fortsetzt: Wenn &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt; Untertyp von &amp;lt;code&amp;gt;U&amp;lt;/code&amp;gt; ist, dann ist &amp;lt;code&amp;gt;K[T]&amp;lt;/code&amp;gt; Untertyp von &amp;lt;code&amp;gt;K[U]&amp;lt;/code&amp;gt;. Kontravarianz, Syntax: &amp;lt;code&amp;gt;K[-T]&amp;lt;/code&amp;gt;, bedeutet, dass die Fortsetzung in der Gegenrichtung erfolgt: Wenn &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt; Untertyp von &amp;lt;code&amp;gt;U&amp;lt;/code&amp;gt; ist, dann ist &amp;lt;code&amp;gt;K[U]&amp;lt;/code&amp;gt; Untertyp von &amp;lt;code&amp;gt;K[T]&amp;lt;/code&amp;gt;. Varianzannotationen beeinflussen, an welcher Stelle innerhalb der generischen Klasse der Typparameter benutzt werden darf: Kovariante Typparameter dürfen beispielsweise nicht als Typ von Methodenargumenten verwendet werden, kontravariante nicht als Rückgabetyp.&amp;lt;ref&amp;gt;[http://www.scala-lang.org/node/129 Rückgabetyp] (englische Erläuterung auf der Scala-Internetseite)&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Typinferenz ====&lt;br /&gt;
[[Typinferenz]] ist die Fähigkeit des Compilers, den Typ eines Ausdrucks aus dem Kontext herzuleiten, welche unter [[#Syntax|Syntax]] beispielhaft dargestellt ist.&lt;br /&gt;
&lt;br /&gt;
=== Auswertungsstrategie ===&lt;br /&gt;
Funktionale Ausdrücke werden in Scala [[Auswertung (Informatik)|strikt ausgewertet]]. Allerdings kann durch das Schlüsselwort &amp;lt;code&amp;gt;lazy&amp;lt;/code&amp;gt; die [[Lazy Evaluation|verzögerte Auswertung]] (Lazy-Evaluation) von einzelnen Ausdrücken spezifiziert werden. Auch die Collection-Klassen unterstützen mit den Methoden &amp;lt;code&amp;gt;view&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;force&amp;lt;/code&amp;gt; die Möglichkeit der verzögerten Auswertung. Im Gegensatz hierzu werden in [[Haskell (Programmiersprache)|Haskell]] die Programme standardmäßig lazy ausgewertet und es existieren &amp;#039;&amp;#039;Strictness&amp;#039;&amp;#039;-Annotationen.&lt;br /&gt;
&lt;br /&gt;
=== XML ===&lt;br /&gt;
Scala 2 unterstützt XML mittels Syntax (XML-Literale) und Standardbibliothek. Mit Version&amp;amp;nbsp;2.13 wurde die XML-Unterstützung aus der Standardbibliothek entfernt und in das eigenständige Projekt scala-xml ausgelagert.&amp;lt;ref&amp;gt;{{Internetquelle |url=https://github.com/scala/scala/releases/tag/v2.13.0 |titel=Release Scala 2.13.0 · scala/scala |abruf=2021-05-12 |sprache=en}}&amp;lt;/ref&amp;gt; Mit Scala&amp;amp;nbsp;3 wurde auch die Unterstützung für XML-Literale deprecated&amp;lt;!-- bitte hier ein deutsches Wort --&amp;gt; und wird somit künftig entfernt.&amp;lt;ref&amp;gt;{{Internetquelle |url=http://dotty.epfl.ch/docs/reference/dropped-features/xml.html |titel=Dropped: XML Literals |abruf=2021-05-12}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In der scala-xml-Bibliothek sind grundlegende [[XML]]-Operationen und -Datentypen verfügbar: XML-Konstruktoren, -Serialisierung und -Deserialisierung, XPath-ähnliche Extraktion von Elementen und Attributen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;scala&amp;quot;&amp;gt;&lt;br /&gt;
val liste = &amp;lt;einkaufsliste&amp;gt;&lt;br /&gt;
                &amp;lt;artikel&amp;gt;&amp;lt;name&amp;gt;Brot&amp;lt;/name&amp;gt;&amp;lt;kosten&amp;gt;3.50&amp;lt;/kosten&amp;gt;&amp;lt;/artikel&amp;gt;&lt;br /&gt;
                &amp;lt;artikel&amp;gt;&amp;lt;name&amp;gt;Apfel&amp;lt;/name&amp;gt;&amp;lt;kosten&amp;gt;0.29&amp;lt;/kosten&amp;gt;&amp;lt;/artikel&amp;gt;&lt;br /&gt;
                &amp;lt;artikel&amp;gt;&amp;lt;name&amp;gt;Eier&amp;lt;/name&amp;gt;&amp;lt;kosten&amp;gt;1.19&amp;lt;/kosten&amp;gt;&amp;lt;/artikel&amp;gt;&lt;br /&gt;
            &amp;lt;/einkaufsliste&amp;gt;&lt;br /&gt;
val gesamtkosten = (liste \\ &amp;quot;kosten&amp;quot;).map(_.text.toDouble).sum&lt;br /&gt;
// Ergebnis: 4.98&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Implicits ===&lt;br /&gt;
Methoden können mittels des Modifiers &amp;lt;code&amp;gt;implicit&amp;lt;/code&amp;gt; zu sogenannten &amp;#039;&amp;#039;implicit methods&amp;#039;&amp;#039; werden. Wenn der Compiler ein Objekt eines bestimmten Typs&amp;amp;nbsp;A erwartet, aber ein Objekt des inkompatiblen Typs&amp;amp;nbsp;B vorfindet, sucht er im lexikalischen Scope und im &amp;#039;&amp;#039;companion object&amp;#039;&amp;#039; von A nach einer implicit method, mit der er das B-Objekt in ein A-Objekt konvertieren kann. Mit dieser Technik lassen sich die aus C# bekannten &amp;#039;&amp;#039;[[Erweiterungsmethode|extension methods]]&amp;#039;&amp;#039; nachbilden (das sogenannte &amp;#039;&amp;#039;pimp my library&amp;#039;&amp;#039;-Pattern) und in Grenzen sogar Vererbung.&lt;br /&gt;
&lt;br /&gt;
Die letzte Parameterliste einer Methode kann ebenfalls als &amp;#039;&amp;#039;implicit&amp;#039;&amp;#039; markiert werden. Wenn die Parameterliste beim Aufruf einer Methode fehlt, aber ein als &amp;#039;&amp;#039;implicit&amp;#039;&amp;#039; markierter Wert im lexikalischen Scope zu finden ist, wird er automatisch an die Methode übergeben. Hiermit ist es möglich, die aus Haskell bekannten [[Typklasse (Informatik)|&amp;#039;&amp;#039;type classes&amp;#039;&amp;#039;]] als Entwurfsmuster nachzubilden&amp;lt;ref&amp;gt;[http://ropas.snu.ac.kr/~bruno/papers/TypeClasses.pdf &amp;#039;&amp;#039;Type classes&amp;#039;&amp;#039;] (PDF)&amp;lt;/ref&amp;gt;. Scalaz, eine Library zur pur funktionalen Programmierung in Scala, setzt Typklassen weiträumig ein.&lt;br /&gt;
&lt;br /&gt;
Mit impliziten Konversionen wird in Scala auch Verhalten in Bibliotheken implementiert, das viele Sprachen als &amp;#039;&amp;#039;Spezialfall&amp;#039;&amp;#039; im Compiler abdecken. So zum Beispiel besondere Regeln beim Zusammenfügen von Zeichenketten wie &amp;lt;code style=&amp;quot;white-space:nowrap&amp;quot;&amp;gt;42 + &amp;quot;etwas Text&amp;quot;&amp;lt;/code&amp;gt; oder die Konvertierung von Zahltypen mit kleinerem Wertebereich zu Zahltypen mit größerem Wertebereich, in Java &amp;#039;&amp;#039;String concatenation operator +&amp;#039;&amp;#039;&amp;lt;ref&amp;gt;{{Webarchiv |url=http://docs.oracle.com/javase/specs/jls/se5.0/html/expressions.html#15.18.1 |wayback=20120314071318 |text=Java-Sprach-Spezifikation, Version 3, §15.18.1, String Concatenation Operator +}}&amp;lt;/ref&amp;gt; bzw. &amp;#039;&amp;#039;widening primitive conversions&amp;#039;&amp;#039;&amp;lt;ref&amp;gt;{{Webarchiv |url=http://docs.oracle.com/javase/specs/jls/se5.0/html/conversions.html#5.1.2 |wayback=20120329144916 |text=§5.1.2, &amp;#039;&amp;#039;Widening Primitive Conversion&amp;#039;&amp;#039;}} in der Spezifikation der Java-Sprache&amp;lt;/ref&amp;gt; genannt.&lt;br /&gt;
&lt;br /&gt;
=== Nebenläufigkeit ===&lt;br /&gt;
{{Hauptartikel|Nebenläufigkeit}}&lt;br /&gt;
&lt;br /&gt;
Während Scala [[Thread (Informatik)|Threads]] durch die Java-Klassenbibliothek unterstützt, gibt es in Scalas eigener Bibliothek eine Implementierung von [[Actor Model|Aktoren]]. Diese wurde von der Aktoren-Implementierung, wie sie in [[Erlang (Programmiersprache)|Erlang]] umgesetzt wurde, inspiriert. Seit der Scala-Version 2.11 ist die ursprüngliche Aktoren-Implementierung nicht mehr Bestandteil der Standardbibliothek. Ersetzt wird sie durch die [[Akka (Software)|Akka]]-Implementierung (ab der Version 2.10 verfügbar)&amp;lt;ref&amp;gt;{{Internetquelle |url=http://docs.scala-lang.org/overviews/core/actors-migration-guide.html |titel=The Scala Actors Migration Guide |sprache=en |offline=ja |archiv-url=https://web.archive.org/web/20131205052405/http://docs.scala-lang.org/overviews/core/actors-migration-guide.html |archiv-datum=2013-12-05 |archiv-bot= |abruf=2013-12-03}}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Zusätzlich implementiert die Standard-Library von Scala [[Future (Programmierung)|Futures]] und parallele [[Container (Informatik)|Collections]].&lt;br /&gt;
&lt;br /&gt;
== Syntax ==&lt;br /&gt;
Die [[Syntax]] der Sprache ist an [[Java (Programmiersprache)|Java]] und [[ML (Programmiersprache)|ML]] angelehnt. Von Java wurde vor allem eine Reihe von Schlüsselworten sowie die Blocksyntax übernommen, von ML die Syntax für Typannotationen und Deklarationen.&lt;br /&gt;
&lt;br /&gt;
Im Vergleich zur Java-Syntax kann in den meisten Fällen das Semikolon am Ende einer Zeile entfallen. Die Syntax zur Typdefinition von Variablen und Rückgabewerten lehnt sich an der von ML statt von Java an: Man formuliert nicht &amp;lt;code&amp;gt;Typ variable&amp;lt;/code&amp;gt;, sondern &amp;lt;code&amp;gt;variable: Typ&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Die Deklaration und Definition von Werten, Variablen und Methoden erfolgt mittels der Schlüsselwörter &amp;lt;code&amp;gt;val&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;var&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;def&amp;lt;/code&amp;gt;, gefolgt von Typangaben.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;scala&amp;quot;&amp;gt;&lt;br /&gt;
val wert: Int = 42&lt;br /&gt;
var variable: Double = 3.14&lt;br /&gt;
def methode(parameter1: String, parameter2: Boolean): Unit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Der Compiler leitet den Typ einer Variable aus dem Kontext ab ([[Typinferenz]]). Die beiden Zeilen&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;scala&amp;quot;&amp;gt;&lt;br /&gt;
var x = &amp;quot;Ein Text&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
und&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;scala&amp;quot;&amp;gt;&lt;br /&gt;
var x: String = &amp;quot;Ein Text&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
sind somit gleichwertig.&lt;br /&gt;
&lt;br /&gt;
Klassen- und Methodennamen können einen großen Umfang von Zeichen und Symbolen nutzen. Es sind z.&amp;amp;nbsp;B. Bezeichner wie &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;::&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;\\&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;isEmpty_?&amp;lt;/code&amp;gt; erlaubt.&lt;br /&gt;
&lt;br /&gt;
Methodenaufrufe mit keinem oder einem Parameter können unter Auslassung des Punktes und der öffnenden und schließenden runden Klammern notiert werden (ähnlich wie in [[Smalltalk (Programmiersprache)|Smalltalk]] oder [[Objective-C]]):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;scala&amp;quot;&amp;gt;&lt;br /&gt;
5.0 + 2.0&lt;br /&gt;
&amp;quot;Test&amp;quot; startsWith &amp;quot;T&amp;quot;&lt;br /&gt;
List(1,2,3) isEmpty&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
entspricht&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;scala&amp;quot;&amp;gt;&lt;br /&gt;
5.0.+(2.0)&lt;br /&gt;
&amp;quot;Test&amp;quot;.startsWith(&amp;quot;T&amp;quot;)&lt;br /&gt;
List(1, 2, 3).isEmpty&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit Scala ist es außerdem möglich, den Quelltext im Vergleich zu Java in vielen Fällen kompakter zu schreiben, zum Beispiel auf Grund von Typinferenz, &amp;#039;&amp;#039;for comprehensions&amp;#039;&amp;#039; oder anonymen Funktionen.&lt;br /&gt;
&lt;br /&gt;
=== Operatoren ===&lt;br /&gt;
Für Präfix-Operatoren gibt es eine fest vorgegebene Menge, nämlich &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;,&amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;,&amp;lt;code&amp;gt;~&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;!&amp;lt;/code&amp;gt;. Der Ausdruck &amp;lt;code&amp;gt;-x&amp;lt;/code&amp;gt; bedeutet das gleiche wie &amp;lt;code&amp;gt;x.unary_-&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Postfix-Operator-Ausdrücke sind ebenfalls möglich. Hier gibt es keine Einschränkungen an den Operator, und das Übersetzungsergebnis ist ein Aufruf der (parameterlosen) Methode auf dem Operanden.&lt;br /&gt;
&lt;br /&gt;
Bei Infix-Operatoren entscheidet das erste Zeichen des Operatornamens über [[Operatorrangfolge|Präzedenz]] und [[Operatorassoziativität|Assoziativität]], das den aus der Mathematik üblichen Konventionen folgt. Das Codefragment&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;scala&amp;quot;&amp;gt;&lt;br /&gt;
1 + z * x&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
wird übersetzt zu&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;scala&amp;quot;&amp;gt;&lt;br /&gt;
(1).+(z.*(x))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Auf dem Objekt &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; wird die Methode &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt; aufgerufen und dabei der Parameter &amp;lt;code&amp;gt;z.*(x)&amp;lt;/code&amp;gt;, also das Ergebnis eines weiteren Methodenaufrufes, übergeben.&lt;br /&gt;
&lt;br /&gt;
Endet der Methodenname eines Infixoperators mit einem Doppelpunkt, so vertauscht sich die Reihenfolge von Empfänger und Parameter und der Operator ist rechtsassoziativ:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;scala&amp;quot;&amp;gt;&lt;br /&gt;
a :: b&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
wird übersetzt zu&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;scala&amp;quot;&amp;gt;&lt;br /&gt;
b.::(a)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Schleifen ===&lt;br /&gt;
For-Schleifen wurden zu sogenannten &amp;#039;&amp;#039;for comprehensions&amp;#039;&amp;#039; soweit generalisiert, dass sie nicht nur mehrere verschachtelte Schleifen zusammenfassen, sondern analog zu Haskells Do-Notation beliebige [[Monade (Informatik)|Monaden]] nutzen können.&lt;br /&gt;
&lt;br /&gt;
Dieser Code gibt beispielsweise 27 Zeilen für jeden Wert von a, b und c aus.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;scala&amp;quot;&amp;gt;&lt;br /&gt;
for&lt;br /&gt;
    a &amp;lt;- List(1, 2, 3)&lt;br /&gt;
    b &amp;lt;- List(2, 3, 4)&lt;br /&gt;
    c &amp;lt;- List(5, 6, 7)&lt;br /&gt;
do println(&amp;quot;a=&amp;quot; + a + &amp;quot;, b=&amp;quot; + b + &amp;quot;, c=&amp;quot; + c)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine &amp;#039;&amp;#039;for comprehension&amp;#039;&amp;#039; kann auch genutzt werden, um neue Werte zu berechnen, ähnlich wie mit den von Haskell bekannten &amp;#039;&amp;#039;[[List Comprehension]]s&amp;#039;&amp;#039;. Dieser Code weist &amp;lt;code&amp;gt;combinations&amp;lt;/code&amp;gt; eine Liste von vier Paaren zu, nämlich (1,3), (1,4), (2,3) und (2,4):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;scala&amp;quot;&amp;gt;&lt;br /&gt;
val combinations = for&lt;br /&gt;
    a &amp;lt;- List(1, 2)&lt;br /&gt;
    b &amp;lt;- List(3, 4)&lt;br /&gt;
yield (a, b)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Versionen ==&lt;br /&gt;
=== Scala 2.8 ===&lt;br /&gt;
Wesentliche Neuerungen im Release 2.8&amp;lt;ref&amp;gt;{{Cite web|url=https://www.scala-lang.org/old/node/7009|title=Scala 2.8.0 final &amp;amp;#124; The Scala Programming Language|website=www.scala-lang.org}}&amp;lt;/ref&amp;gt; sind:&lt;br /&gt;
* Überarbeitung der Collection-Library &amp;#039;&amp;#039;(scala.collection)&amp;#039;&amp;#039;&amp;lt;ref&amp;gt;{{Cite web|url=https://www.scala-lang.org/old/sid/3|title=New Collection Classes &amp;amp;#124; The Scala Programming Language|website=www.scala-lang.org}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Überarbeitung der Array-Implementierung&amp;lt;ref&amp;gt;{{Cite web|url=https://www.scala-lang.org/old/sid/7|title=Scala 2.8 Arrays &amp;amp;#124; The Scala Programming Language|website=www.scala-lang.org}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
* benannte Argumente und Defaultwerte für Argumente&amp;lt;ref&amp;gt;{{Cite web|url=https://www.scala-lang.org/old/sid/1|title=Named and Default Arguments &amp;amp;#124; The Scala Programming Language|website=www.scala-lang.org}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Delimited Continuations&lt;br /&gt;
* Erweiterungen für Aktoren-[[Nebenläufigkeit]]&lt;br /&gt;
* Package-Objekte, die Methoden und Werte für ein Package zur Verfügung stellen&lt;br /&gt;
&lt;br /&gt;
=== Scala 2.9 ===&lt;br /&gt;
Wesentliche Neuerung der Version 2.9 ist die Erweiterung der Collection-Bibliothek um Methoden und Klassen, die Operationen parallel ausführen können &amp;#039;&amp;#039;(scala.collection.parallel)&amp;#039;&amp;#039;.&amp;lt;ref&amp;gt;{{Cite web|url=https://www.scala-lang.org/old/node/9483|title=Scala 2.9.0 final &amp;amp;#124; The Scala Programming Language|website=www.scala-lang.org}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
Daneben gibt es zahlreiche weitere Verbesserungen:&lt;br /&gt;
* Verbesserungen an der interaktiven Konsole (REPL&amp;lt;ref name=&amp;quot;REPL&amp;quot;&amp;gt;&amp;#039;&amp;#039;[[:en:Read–eval–print loop|Read–eval–print loop]]&amp;#039;&amp;#039; in der englischsprachigen Wikipedia&amp;lt;/ref&amp;gt; genannt), die nun u.&amp;amp;nbsp;a. schneller startet, mehr Tastenkürzel und bessere Tastaturnavigation beherrscht und Klassen dekompilieren sowie Typen, Ausnahmebedingungen (Exceptions) und verfügbare implizite Konversionen anzeigen kann.&lt;br /&gt;
* Erweiterung von &amp;#039;&amp;#039;scala.sys&amp;#039;&amp;#039; um Möglichkeiten, Anweisungen auf der [[Shell (Betriebssystem)|Shell]] des Betriebssystems auszuführen.&lt;br /&gt;
* Entfernung einiger als veraltet &amp;#039;&amp;#039;(deprecated)&amp;#039;&amp;#039; markierter Klassen und Methoden, wie z.&amp;amp;nbsp;B. in &amp;#039;&amp;#039;scala.Enumeration&amp;#039;&amp;#039; und deutlichere Markierung bereits veralteter aber noch nicht entfernter Funktionalität, wie z.&amp;amp;nbsp;B. &amp;lt;code&amp;gt;case&amp;lt;/code&amp;gt;-Klassen, die von anderen &amp;lt;code&amp;gt;case&amp;lt;/code&amp;gt;-Klassen erben oder der [[Datenbank]]-[[Schnittstelle]] &amp;#039;&amp;#039;scala.dbc&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
=== Scala 2.10 ===&lt;br /&gt;
Wesentliche Neuerungen der Version 2.10.0&amp;lt;ref&amp;gt;{{Cite web|url=https://www.scala-lang.org/download/changelog.html|title=Changelog|website=www.scala-lang.org}}&amp;lt;/ref&amp;gt;:&lt;br /&gt;
* neue Implementierung für Pattern Matching&lt;br /&gt;
* Akka-Aktoren als Standardimplementierung&lt;br /&gt;
* Value- und Implicit-Klassen&lt;br /&gt;
* String Interpolation&lt;br /&gt;
* Reflection (experimentell)&lt;br /&gt;
* Makros (experimentell)&lt;br /&gt;
&lt;br /&gt;
=== Scala 2.11 ===&lt;br /&gt;
Die Version 2.11.0 wurde am 17.&amp;amp;nbsp;April 2014 veröffentlicht und ist gegenüber den Vorgängern stärker modularisiert, wodurch die Kern-Standardbibliothek kleiner wird. Zudem wurden Detailverbesserungen im Bereich der Geschwindigkeit gemacht und die nach wie vor experimentellen Bereiche von Makros und Reflection verbessert.&amp;lt;ref&amp;gt;[https://github.com/scala/scala/releases/v2.11.0 Scala 2.11.0 final release!]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Scala 2.12 ===&lt;br /&gt;
Die Version 2.12.0 wurde am 3.&amp;amp;nbsp;November 2016 veröffentlicht.&amp;lt;ref&amp;gt;{{Cite web|url=https://www.scala-lang.org/news/2.12.0/|title=Scala 2.12.0 is now available!|website=www.scala-lang.org}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Scala 3.0 ===&lt;br /&gt;
Die Version 3.0.0 wurde am 14. Mai 2021 veröffentlicht. Nennenswerte Änderungen umfassen:&amp;lt;ref&amp;gt;{{Internetquelle |url=https://docs.scala-lang.org/scala3/new-in-scala3.html |titel=New in Scala 3 |abruf=2021-05-21}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* ein neues System zur Metaprogrammierung auf Basis von Quotes, Splices und dem Schlüsselwort &amp;lt;code&amp;gt;inline&amp;lt;/code&amp;gt;. Dies funktioniert sowohl zur Compilezeit (Macros) wie auch zur Laufzeit&lt;br /&gt;
* eine neue einrückungsbasierte Syntax als Alternative zu geschweiften Klammern&lt;br /&gt;
* das Schlüsselwort &amp;lt;code&amp;gt;enum&amp;lt;/code&amp;gt; zur Deklaration [[algebraischer Datentyp]]en&lt;br /&gt;
* Konstruktorparameter für Trait-Typen&lt;br /&gt;
* extension methods&lt;br /&gt;
* Opake Typaliase&lt;br /&gt;
* Das Schlüsselwort &amp;lt;code&amp;gt;implicit&amp;lt;/code&amp;gt; wurde als veraltet markiert und durch die Schlüsselwörter &amp;lt;code&amp;gt;given&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;using&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;extension&amp;lt;/code&amp;gt; und die Typklasse &amp;lt;code&amp;gt;Conversion&amp;lt;/code&amp;gt; ersetzt&lt;br /&gt;
* Scala-2-Macros werden nicht mehr unterstützt (diese waren in Scala 2 stets als experimentell markiert)&lt;br /&gt;
&lt;br /&gt;
== Bibliotheken und Frameworks ==&lt;br /&gt;
Beliebte Frameworks zur Entwicklung von Web-Applikationen sind [[Play Framework|Play]] und [[Lift (Framework)|Lift]]. Daneben gibt es viele weitere, meist eher minimalistische Lösungen wie &amp;#039;&amp;#039;Finatra&amp;#039;&amp;#039; oder &amp;#039;&amp;#039;Scalatra&amp;#039;&amp;#039;.&lt;br /&gt;
Frameworks aus der Java-Welt, wie [[Apache Wicket|Wicket]] oder [[Spring (Framework)|Spring]] können ebenfalls genutzt werden.&lt;br /&gt;
&lt;br /&gt;
Die Interaktion mit Datenbanken wird durch eine Vielzahl von Bibliotheken ermöglicht, darunter &amp;#039;&amp;#039;Slick&amp;#039;&amp;#039;, &amp;#039;&amp;#039;Squeryl&amp;#039;&amp;#039; und &amp;#039;&amp;#039;ScalikeJDBC&amp;#039;&amp;#039;.&lt;br /&gt;
In Java populäre Ansätze, wie die Nutzung von [[Jakarta Persistence API|JPA]] oder [[JOOQ]], sowie die direkte Verwendung von [[JDBC]], sind ebenfalls möglich.&lt;br /&gt;
&lt;br /&gt;
Zur nebenläufigen Programmierung bietet Scalas Standardbibliothek eine &amp;#039;&amp;#039;Futures &amp;amp; Promises&amp;#039;&amp;#039; API.&amp;lt;ref&amp;gt;{{Cite web|url=https://docs.scala-lang.org/overviews/core/futures.html|title=Futures and Promises &amp;amp;#124; Scala Documentation|website=docs.scala-lang.org}}&amp;lt;/ref&amp;gt; Implementierungen des [[Actor Model|Aktormodells]] werden u.&amp;amp;nbsp;a. von Akka&amp;lt;ref&amp;gt;[http://akka.io/ akka.io]&amp;lt;/ref&amp;gt; und Scalaz&amp;lt;ref&amp;gt;[http://code.google.com/p/scalaz/ code.google.com]&amp;lt;/ref&amp;gt; bereitgestellt.&lt;br /&gt;
Darüber hinaus können auch alle Möglichkeiten der Java-Standardbibliothek genutzt werden, z.&amp;amp;nbsp;B. [[Thread (Informatik)|Threads]] oder &amp;lt;code&amp;gt;java.util.concurrent.*&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Scalaz enthält außerdem viele weitere Konstrukte, welche die funktionale Programmierung in Scala erleichtern.&lt;br /&gt;
&lt;br /&gt;
Scala.js ist ein Projekt, das Scala-Code zu [[JavaScript]]-Code kompilieren und Scala somit im [[Webbrowser|Browser]] ausführbar machen kann.&amp;lt;ref name=&amp;quot;scala-js&amp;quot;&amp;gt;{{Internetquelle |url=http://www.scala-js.org/ |titel=Scala.js |sprache=en |abruf=2019-04-24}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== IDE- und Werkzeugunterstützung ==&lt;br /&gt;
Neben dem Compiler &amp;lt;code&amp;gt;scalac&amp;lt;/code&amp;gt; steht eine [[Read-Evaluate-Print-Loop]]&amp;lt;ref name=&amp;quot;REPL&amp;quot; /&amp;gt; (REPL) namens &amp;lt;code&amp;gt;scala&amp;lt;/code&amp;gt; zur Verfügung. Für die IDEs [[Eclipse (IDE)|Eclipse]]&amp;lt;ref&amp;gt;{{Cite web |url=http://scala-ide.org/ |title=Scala IDE for Eclipse |website=scala-ide.org}}&amp;lt;/ref&amp;gt;, [[NetBeans]]&amp;lt;ref&amp;gt;{{Cite web |url=http://wiki.netbeans.org/Scala |title=Scala – NetBeans Wiki |website=wiki.netbeans.org}}&amp;lt;/ref&amp;gt; und [[IntelliJ]]&amp;lt;ref&amp;gt;[http://plugins.intellij.net/plugin/?id=1347 plugins.intellij.net]&amp;lt;/ref&amp;gt; existieren Plugins.&lt;br /&gt;
&lt;br /&gt;
Für den [[Erstellungsprozess]] unterstützt Scala u.&amp;amp;nbsp;a. [[Apache Ant|Ant]] und [[Apache Maven|Maven]], stellt aber auch ein eigenes Werkzeug, &amp;#039;&amp;#039;SBT&amp;#039;&amp;#039; zur Verfügung.&amp;lt;ref&amp;gt;[https://github.com/sbt/sbt/ github.com/sbt/sbt/]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Verwendung ==&lt;br /&gt;
Scala hat mittlerweile Anwendung in der Industrie gefunden. Die sozialen Netzwerke [[Twitter#Technik|Twitter]] und [[LinkedIn]] haben ihre Nachrichten-Warteschlangen in Scala implementiert.&amp;lt;ref&amp;gt;{{Cite web|url=https://www.artima.com/scalazine/articles/twitter_on_scala.html|title=Twitter on Scala|website=www.artima.com}}&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;{{Cite web|url=http://days2010.scala-lang.org/node/138/159/|title=Index of node/138/159|website=days2010.scala-lang.org}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weitere Verwendung findet die Sprache etwa in Unternehmen wie [[Novell]]&amp;lt;ref&amp;gt;[http://vibe.novell.com/ Novell Vibe]&amp;lt;/ref&amp;gt;, [[Siemens]], [[Sony]] oder [[Électricité de France|Électricité de France Trading]].&amp;lt;ref&amp;gt;[http://www.scala-lang.org/node/1658 scala-lang.org]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Namensherkunft ==&lt;br /&gt;
Der Name leitet sich von {{lang|en|„&amp;#039;&amp;#039;sca&amp;#039;&amp;#039;lable &amp;#039;&amp;#039;la&amp;#039;&amp;#039;nguage“}} ab und bringt zum Ausdruck, dass der sehr kompakt gehaltene Sprachkern die Möglichkeit bietet, häufig verwendete Sprachelemente wie z.&amp;amp;nbsp;B. Operatoren oder zusätzliche [[Kontrollstruktur]]en in Benutzerklassen zu implementieren und dadurch den Sprachumfang zu erweitern und eigene [[domänenspezifische Sprache]]n ({{enS|domain-specific language}}, &amp;#039;&amp;#039;DSL&amp;#039;&amp;#039;) zu erstellen.&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
Ein [[Hallo-Welt-Programm|Hello, World!]]-Programm in Scala:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;scala&amp;quot;&amp;gt;&lt;br /&gt;
@main def hello =&lt;br /&gt;
  println(&amp;quot;Hello, world!&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine generische Implementierung des [[Quicksort]]-Algorithmus mit Context Bounds&amp;lt;ref&amp;gt;[https://docs.scala-lang.org/tutorials/FAQ/context-bounds.html Context Bounds] (englische Erläuterung auf der Scala-Internetseite)&amp;lt;/ref&amp;gt;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;scala&amp;quot;&amp;gt;&lt;br /&gt;
import math.Ordering.Implicits.infixOrderingOps&lt;br /&gt;
&lt;br /&gt;
def quickSort[A : Ordering](xs: List[A]): List[A] = xs match&lt;br /&gt;
  case Nil     =&amp;gt; Nil&lt;br /&gt;
  case y :: ys =&amp;gt;&lt;br /&gt;
    val (l1, l2) = ys partition (_ &amp;lt;= y)&lt;br /&gt;
    quickSort(l1) ++ (y :: quickSort(l2))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Geschichte ==&lt;br /&gt;
Scala wird im Labor für Programmiermethoden an der [[École polytechnique fédérale de Lausanne]] in der [[Schweiz]] unter der Leitung von [[Martin Odersky]] entwickelt.&lt;br /&gt;
&lt;br /&gt;
Martin Odersky arbeitete unter [[Niklaus Wirth]] an [[Modula-2]] und [[Oberon (Programmiersprache)|Oberon]]. Von 1995 an entwickelte er zusammen mit [[Philip Wadler]] die inzwischen aufgegebene Programmiersprache &amp;#039;&amp;#039;Pizza&amp;#039;&amp;#039;&amp;lt;ref&amp;gt;https://www.artima.com/articles/the-origins-of-scala&amp;lt;/ref&amp;gt;, die Java um [[Generics]], [[Funktionszeiger]] und [[Pattern Matching]] erweiterte. Später konzentrierten sich Wadler und Odersky mit &amp;#039;&amp;#039;Generic Java&amp;#039;&amp;#039;&amp;lt;ref&amp;gt;&amp;#039;&amp;#039;[[:en:Generic Java|Generic Java]]&amp;#039;&amp;#039; in der englischsprachigen Wikipedia&amp;lt;/ref&amp;gt; (GJ) auf Generics für Java, dieses Projekt führte 2004 zur Einführung von Generics in Java.&amp;lt;ref&amp;gt;[http://jcp.org/en/jsr/detail?id=14 &amp;#039;&amp;#039;Generics in Java&amp;#039;&amp;#039;]&amp;lt;/ref&amp;gt; Ab 1999 arbeitete Martin Odersky an der [[École polytechnique fédérale de Lausanne]], wo er an der Verbindung funktionaler und objektorientierter Programmierung forschte und die minimalistische Hybridsprache &amp;#039;&amp;#039;Funnel&amp;#039;&amp;#039;&amp;lt;ref&amp;gt;{{Cite web|url=http://lampwww.epfl.ch/funnel/|title=Functional Nets|website=lampwww.epfl.ch}}&amp;lt;/ref&amp;gt; entwickelte. Hier begann er 2001 mit der Entwicklung von Scala, die im Gegensatz zu Funnel nicht rein akademischem Interesse dienen sollte, sondern als vollwertige Sprache für reale Anwendungen ausgelegt war. Im Frühjahr 2004 wurde Scala für die Java-Plattform veröffentlicht, im Juni 2004 für das [[.Net-Framework]].&lt;br /&gt;
&lt;br /&gt;
Seit Anfang 2011 wird die Weiterentwicklung der Sprache vom [[European Research Council]] finanziell gefördert. Damit sollen insbesondere die Möglichkeiten der parallelen Programmierung ausgebaut werden.&amp;lt;ref&amp;gt;[https://www.heise.de/newsticker/meldung/EU-foerdert-Open-Source-Sprache-Scala-1170098.html &amp;#039;&amp;#039;EU fördert Open-Source-Sprache Scala&amp;#039;&amp;#039;.] Im [[Heise online|heise newsticker]], 15. Januar 2011, abgerufen am 23. Februar 2011&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Am 12.&amp;amp;nbsp;Mai 2011 gab Martin Odersky den Start von &amp;#039;&amp;#039;Typesafe&amp;#039;&amp;#039; bekannt; ein Unternehmen, das sich dem kommerziellen Support von Scala im Allgemeinen sowie dem Middleware Framework [[Akka (Software)|Akka]] widmet. Zu den Beratern gehören [[James Gosling]] und Doug Lea.&amp;lt;ref&amp;gt;{{Cite web|url=https://www.lightbend.com/about-lightbend|title=About Lightbend &amp;amp;#124; @lightbend|first=Lightbend|last=Inc|website=Lightbend}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Literatur ==&lt;br /&gt;
* {{Literatur |Autor=Martin Odersky, Lex Spoon, Bill Venners |Titel=Programming in Scala |Verlag=Computer Bookshops |Datum=2008 |ISBN=0-9815316-0-1 |Sprache=en}}&lt;br /&gt;
* {{Literatur |Autor=Dean Wampler, Alex Payne |Titel=Programming Scala |Verlag=[[O’Reilly Verlag|O’Reilly]] |Datum=2009 |ISBN=978-0-596-15595-7 |Seiten=448 |Online=[http://programming-scala.labs.oreilly.com/ HTML-Version]}}&lt;br /&gt;
* {{Literatur |Autor=Lothar Piepmeyer |Titel=Grundkurs funktionale Programmierung mit Scala |Verlag=[[Carl Hanser Verlag|Hanser]] |Datum=2010 |ISBN=978-3-446-42092-2 |Seiten=297}}&lt;br /&gt;
* {{Literatur |Autor=Oliver Braun |Titel=Scala: Objektfunktionale Programmierung |Verlag=Hanser |Datum=2010 |ISBN=978-3-446-42399-2 |Seiten=325}}&lt;br /&gt;
* {{Literatur |Autor=Friedrich Esser |Titel=Scala für Umsteiger |Verlag=[[Verlag Walter de Gruyter|Oldenbourg Verlag]] |Datum=2011 |ISBN=978-3-486-59693-9 |Seiten=400}}&lt;br /&gt;
* {{Literatur |Autor=Heiko Seeberger |Titel=Durchstarten mit Scala |Verlag=entwickler.press |Datum=2011 |ISBN=978-3-86802-064-9 |Seiten=250}}&lt;br /&gt;
* {{Literatur |Autor=Thorsten Jolitz |Titel=Objekt-funktionale Programmierung am Beispiel von Scala |Verlag=[[epubli]] |Datum=2013 |ISBN=978-3-8442-4515-8 |Seiten=244}}&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [http://www.scala-lang.org/ Scala Website]&lt;br /&gt;
* [http://www.scala-lang.org/docu/files/ScalaReference.pdf The Scala Language Specification] (PDF; 1,3&amp;amp;nbsp;MB)&lt;br /&gt;
* Audiocast-Interviews mit Martin Odersky: [http://www.se-radio.net/2007/07/episode-62-martin-odersky-on-scala/ Umfassende Einführung, Geschichte und Besprechung der Merkmale von Scala (Juli 2007)] [http://www.se-radio.net/2011/02/episode-171-scala-update-with-martin-odersky/ Neuerungen seit 2007, geplante Entwicklungen und Anwendungsbereiche von Scala (Februar 2011)]&lt;br /&gt;
* [https://www.sigs-datacom.de/uploads/tx_dmjournals/blankenhorn_seeberger_JS_02_10.pdf JavaSPEKTRUM, 2010, Einführung in Scala Teil 1] (PDF; 194&amp;amp;nbsp;kB) [https://www.sigs-datacom.de/uploads/tx_dmjournals/blankenhorn_seeberger_JS_03_10.pdf Teil 2] (PDF; 170&amp;amp;nbsp;kB) [https://www.sigs-datacom.de/uploads/tx_dmjournals/blankenhorn_seeberger_JS_04_10.pdf Teil 3] (PDF; 197&amp;amp;nbsp;kB)&lt;br /&gt;
* [http://scalatutorial.wordpress.com/ Deutsches Scala Tutorial für Umsteiger imperativer Programmiersprachen]&lt;br /&gt;
* [https://scastie.scala-lang.org/ Interaktiver Onlineinterpreter zum Ausprobieren]&lt;br /&gt;
* [https://days2011.scala-lang.org/sites/days2011/files/ws3-1-Hundt.pdf Google vergleicht C++/Java/Go/Scala] (PDF; 318&amp;amp;nbsp;kB)&lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Normdaten|TYP=s|GND=7658965-1|LCCN=sh/2010/13203}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Programmiersprache]]&lt;br /&gt;
[[Kategorie:Funktionale Programmiersprache]]&lt;br /&gt;
[[Kategorie:Objektorientierte Programmiersprache]]&lt;br /&gt;
[[Kategorie:Programmiersprache für die Java Virtual Machine]]&lt;/div&gt;</summary>
		<author><name>imported&gt;BrunoBoehmler</name></author>
	</entry>
</feed>