Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download

📚 The CoCalc Library - books, templates and other resources

132928 views
License: OTHER
1
%!TEX root = Programmierparadigmen.tex
2
\chapter{Scala}
3
\index{Scala|(}
4
5
Scala ist eine objektorientierte und funktionale Programmiersprache, die auf der JVM aufbaut und in Java Bytecode kompiliert wird. Scala bedeutet \underline{sca}lable
6
\underline{la}nguage.
7
8
Mit sog. \enquote{actors} bietet Scala eine Unterstützung für die Entwicklung
9
prallel ausführender Programme.
10
11
Weitere Materialien sind unter \url{http://www.scala-lang.org/} und
12
\url{http://www.simplyscala.com/} zu finden.
13
14
\section{Erste Schritte}
15
Scala kann auf Debian-basierten Systemen durch das Paket \texttt{scala} installiert
16
werden. Für andere Systeme stehen auf \url{http://www.scala-lang.org/download/}
17
verschiedene Binärdateien bereit.
18
19
\subsection{Hello World}
20
\subsubsection{Interaktiv}
21
\inputminted[numbersep=5pt, tabsize=4]{bash}{scripts/scala/scala-test.scala}
22
Es kann mit \texttt{./scala-test.scala Scala funktioniert} ausgeführt werden.
23
24
\subsubsection{Kompiliert}
25
\inputminted[linenos, numbersep=5pt, tabsize=4, frame=lines, label=hello-world.scala]{scala}{scripts/scala/hello-world.scala}
26
27
Dieses Beispiel kann mit \texttt{scalac hello-world.scala} kompiliert und mit
28
\texttt{scala HelloWorld} ausgeführt werden.
29
30
\section{Vergleich mit Java}
31
Scala und Java haben einige Gemeinsamkeiten, wie den Java Bytecode, aber auch
32
einige Unterschiede.
33
34
\noindent\parbox[t]{2.4in}{\raggedright%
35
\textbf{\textit{Gemeinsamkeiten}}
36
\begin{itemize}[topsep=0pt,itemsep=-2pt,leftmargin=13pt]
37
\item Java Bytecode
38
\item Keine Mehrfachvererbung
39
\item Statische Typisierung
40
\item Scopes
41
\end{itemize}
42
}%
43
\parbox[t]{2.4in}{\raggedright%
44
\textbf{\textit{Unterschiede}}
45
\begin{itemize}[topsep=0pt,itemsep=-2pt,leftmargin=13pt]
46
\item Java hat Interfaces, Scala hat traits.
47
\item Java hat primitive Typen, Scala ausschließlich Objekte.
48
\item Scala benötigt kein \texttt{;} am Ende von Anweisungen.
49
\item Scala ist kompakter.
50
\item Java hat \texttt{static}, Scala hat \texttt{object} (Singleton)
51
\end{itemize}
52
}
53
54
Weitere Informationen hat Graham Lea unter \url{http://tinyurl.com/scala-hello-world} zur Verfügung gestellt.
55
56
\section{Syntax}
57
In Scala gibt es sog. \textit{values}, die durch das Schlüsselwort \texttt{val}\xindex{val (Scala)@\texttt{val} (Scala)}
58
angezeigt werden. Diese sind Konstanten. Die Syntax ist der UML-Syntax ähnlich.
59
60
\inputminted[numbersep=5pt, tabsize=4]{scala}{scripts/scala/val-syntax.scala}
61
62
Variablen werden durch das Schlüsselwort \texttt{var}\xindex{var (Scala)@\texttt{var} (Scala)} angezeigt:
63
64
\inputminted[numbersep=5pt, tabsize=4]{scala}{scripts/scala/var-syntax.scala}
65
66
Methoden werden mit dem Schlüsselwort \texttt{def}\xindex{def (def)@\texttt{def} (Scala)} erzeugt:
67
68
\inputminted[numbersep=5pt, tabsize=4]{scala}{scripts/scala/method-syntax.scala}
69
70
Klassen werden wie folgt erstellt:
71
\inputminted[numbersep=5pt, tabsize=4]{scala}{scripts/scala/simple-class-example.scala}
72
73
und so instanziiert:
74
\inputminted[numbersep=5pt, tabsize=4]{scala}{scripts/scala/simple-class-instanciation.scala}
75
76
\subsection{Schleifen}\xindex{for (Scala)@\texttt{for} (Scala)}
77
Eine einfache \texttt{for}-Schleife sieht wie folgt aus:
78
79
\inputminted[numbersep=5pt, tabsize=4]{scala}{scripts/scala/extended-for.scala}
80
81
Listen können erstellt und durchgegangen werden:
82
83
\inputminted[numbersep=5pt, tabsize=4]{scala}{scripts/scala/extended-for.scala}
84
85
\subsection{Logische Operatoren}
86
\begin{table}[H]
87
\centering
88
\begin{tabular}{CCCC}
89
UND & ODER & Wahr & Falsch \\ \hline\hline
90
\&\& & || & true & false \\[4ex]
91
GLEICH & UNGLEICH & NICHT & ~ \\ \hline\hline
92
== & != & ! & ~ \\
93
\end{tabular}
94
\caption{Logische Operatoren in Scala}\xindex{Logische Operatoren!Scala}
95
\end{table}
96
97
\section{Datenstrukturen}
98
\subsection{Listen}
99
100
\begin{itemize}
101
\item Erstellt man mit \verb+var myList = List();+
102
\item Zugriff auf das \verb+i+-te Element mit \verb+myList(i)+
103
\end{itemize}
104
105
\subsection{Tupel}
106
107
\begin{itemize}
108
\item Erstellt man mit \verb+var myTuple = (el1, el2, el3)+
109
\item Zugriff auf das \verb+i+-te Element mit \verb+myTuple._i+
110
\end{itemize}
111
112
\section{Companion Object}\xindex{Companion Object}
113
Ein Companion Object ist ein Objekt mit dem Namen einer Klasse oder eines Traits.
114
Im Gegensatz zu anderen Objekten / Traits hat das Companion Object zugriff auf
115
die Klasse.
116
117
\section{actor}
118
\begin{definition}[Aktor]\xindex{Aktor}\index{actor|see{Aktor}}%
119
Ein \textit{Aktor} ist ein Prozess, der nebenläufig zu anderen Aktoren
120
läuft. Er kommuniziert mit anderen Aktoren, indem er Nachrichten austauscht.
121
\end{definition}
122
123
Das folgende Wetter-Beispiel zeigt, wie man Aktoren benutzen kann.
124
125
\subsection{Message Passing}\xindex{"! (Scala)}%
126
Prozesse können nach dem Schema \texttt{adresse ! Nachricht} Nachrichten austauschen.
127
Dieses Schema ist asynchron.
128
129
Prozesse können mit \texttt{receive{case x => print(x)}} Nachrichten empfangen,
130
wobei in diesem Beispiel \texttt{x} alles matcht. Wenn eine gesendete Nachricht
131
vom Empfänger nicht gematcht wird, bleibt sie dennoch gespeichert.
132
133
\section{Weiteres}
134
\texttt{def awaitAll(timeout: Long, fts: Future[Any]*):}\\
135
\-\hspace{1.8cm}\texttt{List[Option[Any]]}\xindex{awaitAll}\\
136
\-\hspace{0.8cm}$\leftharpoonup$ \texttt{scala.actors.Futures.\_}
137
138
Waits until either all futures are resolved or a given time span has passed. Results are collected in a list of options. The result of a future that resolved during the time span is its value wrapped in Some. The result of a future that did not resolve during the time span is None.
139
140
Note that some of the futures might already have been awaited, in which case their value is returned wrapped in Some. Passing a timeout of 0 causes awaitAll to return immediately.
141
142
143
\section{Beispiele}
144
\subsection{Wetter}
145
Das folgende Script sendet parallel Anfragen über verschiedene ZIP-Codes an
146
die Yahoo-Server, parst das XML und extrahiert die Stadt sowie die Temperatur:
147
148
\inputminted[linenos, numbersep=5pt, tabsize=4, frame=lines, label=weather.scala]{scala}{scripts/scala/weather.scala}
149
150
\subsection{High Product}
151
Das folgende Skript berechnet folgendes: Wenn man aus den Ziffern 0 - 9 zwei
152
Zahlen $a$, $b$ bilden darf, welche Zahlen muss man dann bilden um das größte Produkt
153
$a \cdot b$ zu erhalten?
154
155
\inputminted[linenos, numbersep=5pt, tabsize=4, frame=lines, label=main.scala]{scala}{scripts/scala/HighProduct.scala}
156
157
\subsection{Potenzierung}
158
Will man Zweierpotenzen bilden, so kann man die Berechnung beschleunigen, in dem
159
man immer wieder Quadriert:
160
161
\inputminted[linenos, numbersep=5pt, tabsize=4, frame=lines, label=power-futures.scala]{scala}{scripts/scala/power-futures.scala}
162
163
\subsection{Coffeetime 01: Two Bases}
164
Find three digits $X$, $Y$ and $Z$ such that $XYZ$ in base 10 is equal to $ZYX$
165
in base 9.
166
167
\inputminted[linenos, numbersep=5pt, tabsize=2, frame=lines, label=01-TwoBases.scala]{scala}{scripts/scala/01-TwoBases.scala}
168
169
\subsection{Coffeetime 04: Exactly a third}
170
Arrange the numerals 1-9 into a single fraction that equals exactly
171
$\frac{1}{3}$.
172
173
No other math symbols wanted; just concatenation some digits for the
174
numerator, and some to make a denominator.
175
176
\inputminted[linenos, numbersep=5pt, tabsize=4, frame=lines, label=04-ExactlyAThird.scala]{scala}{scripts/scala/04-ExactlyAThird.scala}
177
178
\subsection{Coffeetime 05: Three Dice}\xindex{yield (Scala)@\texttt{yield} (Scala)}
179
I roll three dice, and multiply the three numbers together.
180
181
What is the probability the total will be odd?
182
183
\inputminted[linenos, numbersep=5pt, tabsize=4, frame=lines, label=05-ThreeDice.scala]{scala}{scripts/scala/05-ThreeDice.scala}
184
185
\section{Weitere Informationen}
186
\begin{itemize}
187
\item \url{http://www.scala-lang.org/api}
188
\item \url{http://docs.scala-lang.org/style/naming-conventions.html}
189
\end{itemize}
190
191
\index{Scala|)}
192