Scala.tex 7.7 KB

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