SlideShare ist ein Scribd-Unternehmen logo
1 von 37
Downloaden Sie, um offline zu lesen
1)

2)

Seminar 1908
Objektorientierte
Programmiersprachen and
Friends
Montag, 11. Februar 13

Martin Klinke
Matrikelnr. 8033978
FernUniversität Hagen
Lehrgebiet Programmiersysteme
betreut von Dr. Daniela Keller
Studiengang M. Sc. Prakt. Inf.
1
Inhalt
• Einleitung
• Programmiermodell
• Sprachelemente
• Weitere Konzepte
• Zusammenfassung und Bewertung

Montag, 11. Februar 13

2
Inhalt
• Einleitung
• Programmiermodell
• Sprachelemente
• Weitere Konzepte
• Zusammenfassung und Bewertung

Montag, 11. Februar 13

3
Einleitung
• Scala vereint objektorientierte und funktionale Konzepte
• Scala überzeugt durch kompakte Syntax, geringe Redundanz, hohe
Ausdrucksstärke
• Stichwort Inferenz: Typinferenz, Semikoloninferenz
• Entwickelt von Martin Odersky und seinem Team seit 2001 an der EPFL in der
Schweiz
• War Doktorand von Niklaus Wirth, dem Erfinder von Pascal

Montag, 11. Februar 13

4
Inhalt
• Einleitung
• Programmiermodell
• Sprachelemente
• Weitere Konzepte
• Zusammenfassung und Bewertung

Montag, 11. Februar 13

5
Programmiermodell
• Scala-Programme laufen in der
JVM (auch unter .NET)

3)

4)

• Quellcode in Textdateien
• Java-Konventionen empfohlen,
aber kein Muss
• Klassen in gleichnamigen
Dateien
• Paketstruktur entspricht
Verzeichnisstruktur
• zahlreiche Bibliotheken
Montag, 11. Februar 13

5)

6
6)

7)

8)
9)

Programmiermodell - Tools

Montag, 11. Februar 13

7
Programmiermodell - HelloWorld
object HelloWorldMain {
def main(args: Array[String]) {
println("Hello World!")
}
}

object HelloWorldAppWithArgs extends App {
println("Hello World! args: " + (args mkString " "))
}

Montag, 11. Februar 13

8
Inhalt
• Einleitung
• Programmiermodell
• Sprachelemente
• Weitere Konzepte
• Zusammenfassung und Bewertung

Montag, 11. Februar 13

9
Klassen
class Square(var length: Int) {
def printInfo() {
println("Square with length " + length)
}
def area() = length * length
def calc3DVolume(height: Int) : Int = {
area * height
}
}

Montag, 11. Februar 13

10
Objekte
• Objekte als Instanzen von
Klassen

val s = new Square(2)
s.printInfo
println(s.length)
object Figure {
var count: Int = 0

• Objekte als Singleton-/
Companion-Objekte, vgl.
static-Deklaration in Java

def printFiguresInfo() {
println("Number of figures: "
+ count)
}
}
class Figure(name: String) {
Figure.count += 1
println("New figure: " + name)
}

Montag, 11. Februar 13

11
Anweisungen
• Zwei Formen für
Methodenaufrufe
• Arithmetische Operatoren sind
als Methoden implementiert
• Präzedenz anhand des ersten
Zeichens des
Methodennamens, Tabelle

val
val
val
val

a
b
c
d

=
=
=
=

1
2
a.+(b)
a + c

val x = this.test(c, d)
val y = this test (a, b)
def test(a: Int, b: Int): Boolean =
a > b

• Ausname: Methodenname
endet mit =
(z.B. +=, <=, >= etc.)

Montag, 11. Februar 13

12
Kontrollstrukturen
• imperativ (Rückgabetyp Unit)
• while

def whileLoop() {
var count = 0
while (count < 10) {
println(count)
count += 1
}
}

• do-while def doWhileLoop() {

• funktional (Rückgabetyp nutzbar)
• if-else
• for
• try-catch-finally
• match-case

var count = 0
do {
println(count)
count += 1
} while (count < 10)
}
Montag, 11. Februar 13

13
Konstrollstrukturen - if-else

def divisors(n: Long, testDivisor: Long): List[Long] = {
if (testDivisor * testDivisor > n)
List(n)
else if (n % testDivisor == 0)
testDivisor :: divisors(n, testDivisor + 1)
else
divisors(n, testDivisor + 1)
}

Montag, 11. Februar 13

14
Kontrollstrukturen - for

for (
i <- 1 to 50 if i % 2 == 0;
k <- divisors(i, 2) if k % 2 != 0;
l = -k
) {
println("Odd divisor of even " + i + ": " + k +
" (negative: " + l + ")")
}

Montag, 11. Februar 13

15
Lambda-Ausdrücke, Funktionen höherer Ordnung

println((1 to 5).filter(x => x % 2 == 0))
//-> Vector(2, 4)

Montag, 11. Februar 13

16
Immutable vs. Mutable
Immutable:
import scala.collection.immutable.Map
object ImmutableDemo {
val x = Map[Int, String]()
x += (3 -> "three") //does not compile
val i = 3
i = 4 //does not compile
}
Mutable:
import scala.collection.mutable.Map
class MutableDemo {
val x = Map[Int, String]()
x += (3 -> "three") //works!
var i = 3
i = 4 //works!
}
Montag, 11. Februar 13

17
Typsystem
• Strenges Typsystem
• Typen werden durch Klassen und Traits definiert
• Implizite Typumwandlung
object ImplicitDemo extends App {
implicit def string2mystring(string: String): MyString =
new MyString(string)
class MyString(string: String) {
def insertBlanks(): String = string.toList.mkString(" ")
}
println("ABCDEFG".insertBlanks)
//println(string2mystring("ABCDEFG").insertBlanks)
}
Montag, 11. Februar 13

18
Typsystem
Montag, 11. Februar 13

Scala-Typhierarchie

19
Parametrischer Polymorphismus
class
class
class
class
class

UpperBound[T <: AnyRef]
LowerBound[T >: String]
NonVariant[T]
Covariant[+T]
ContraVariant[-T]

object ParametricPolymorphismDemo extends App {
val upperBound = new UpperBound[String]
val lowerBound = new LowerBound[AnyRef]
val nonVar = new NonVariant[String]
val coVar: Covariant[Object] = new Covariant[String]
val contraVar: ContraVariant[String] = new ContraVariant[Object]
}

Montag, 11. Februar 13

20
Dynamische Komponente
def instanceOfVersion(someObject: Any): String = {
(if (someObject.isInstanceOf[String])
someObject.asInstanceOf[String]
else
"no string") + " (instanceOf)"
}
def matchVersion(someObject: Any): String = {
(someObject match {
case s: String => s
case _: Any => "no string"
}) + " (match)"
}

Montag, 11. Februar 13

21
Überladen von Methoden
• Überladen erfolgt durch Definitionen mit demselben Methodennamen
und unterschiedlichen Parameterlisten

def getAsString(value: Double, maxDigits: Int) = { ... }
def getAsString(value: Int) = { ... }

Montag, 11. Februar 13

22
Überschreiben, dynamisches Binden von
Methoden
• Überschreiben erfolgt durch
Schlüsselwort override
• Dynamisches Binden erfolgt
beim Aufruf der Methode
printLevel() auf dem Alias x vom
Typ BaseClass, der auf eine
Instanz vom Typ SubClass1
zeigt
• Ausgeführt wird die in
SubClass1 definierte Methode,
welche die Methode in
BaseClass überschreibt

Montag, 11. Februar 13

abstract class BaseClass {
def printLevel() {
println("Base")
}
}
class SubClass1 extends BaseClass {
override def printLevel() {
println("Sub")
}
}
object OverrideDemo extends App {
val x: BaseClass = new SubClass1
x.printLevel //-> Sub
}

23
Inhalt
• Einleitung
• Programmiermodell
• Sprachelemente
• Weitere Konzepte
• Zusammenfassung und Bewertung

Montag, 11. Februar 13

24
Multi-Threading
object ActorDemo extends App {

val client = actor {
loop {
react {
case Start =>
server ! Request
case Response =>
println(
"clnt: Resp received")
exit()
}
}
}
client.start
server.start

case object Start
case object Request
case object Response
val server = actor {
loop {
react {
case Request =>
println(
"srv: Req received")
sender ! Response
exit()
}
}
}
Montag, 11. Februar 13

client ! Start
}
25
Metaprogrammierung
• Angabe von Annotations durch @-Zeichen auf Klassen, Methoden, Feldern,
Parametern
• Annotation => Konstruktoraufruf, ermöglicht Angabe von Parametern aus
dem aktuellen Gültigkeitsbereich
• Beispiele: @serializable, @unchecked
• Reflection-API von Java muss zur Auswertung und Implementierung eigener
Annotations genutzt werden

Montag, 11. Februar 13

26
Traits
• Mächtiger als Java-Interfaces
• Ermöglichen die Wiederverwendung von Funktionalität ohne
Vererbungszwang
• Mehrfachvererbung ohne die bekannten Nachteile

10)

Montag, 11. Februar 13

27
Traits - Beispiel
class Logger { def log(string: String) { println(string) } }
trait InfoPrefix extends Logger {
abstract override def log(string: String) {
super.log("[Info] " + string)
}
}
object TraitDemo extends App {
val infoLogger = new Logger with InfoPrefix
infoLogger.log("This is info")
//-> [Info] This is info
}

Montag, 11. Februar 13

28
Traits - Linearisierung
• Beispiel aus dem Buch von
Martin Odersky zeigt das
Prinzip zur Vermeidung der
Mehrdeutigkeit vererbter
Methoden („Diamond Problem“)
• super-Aufrufe werden
dynamisch gebunden, statt
statisch wie bei „normaler“
Vererbung
class
trait
trait
trait
class
Montag, 11. Februar 13

11)

Animal
Furry extends Animal
HasLegs extends Animal
FourLegged extends HasLegs
Cat extends Animal with Furry with FourLegged
29
apply()-Methode

class Formula(f: (Int => Int)) {
def apply(x: Int) = f(x)
}
object Formula {
def apply(f: (Int => Int)) = new Formula(f)
}
val formula = Formula(x => x * x)
println(formula(2))

Montag, 11. Februar 13

30
Inhalt
• Einleitung
• Programmiermodell
• Sprachelemente
• Weitere Konzepte
• Zusammenfassung und Bewertung

Montag, 11. Februar 13

31
Zusammenfassung
• Typ-/Semikolon-Inferenz
• implizite Typ-Umwandlungen
• Mixins durch Traits
• funktionale Konzepte
• Lambda-Ausdrücke
• Pattern Matching

Montag, 11. Februar 13

32
Bewertung
• kompakter als Java
• Lösungen sehen häufig aus, als
wären sie Bestandteil des
Sprachumfangs, dabei "nur"
Bibliotheken
• saubere Programme durch
"immutable" Konzept, Parallelität
möglich
• Konsistenz des Sprachentwurfs

Montag, 11. Februar 13

• leicht zu erlernen, wenn
objektorientierte und funktionale
Grundkonzepte bekannt sind
• sehr angenehme Sprache

Bewertung:

1(Tool-Unterstützung noch nicht
auf dem Niveau von Java)

33
Grafikquellen - 1
• 1) Scala-Logo: http://www.scala-lang.org/sites/default/files/
newsflash_logo.png
• 2) Titelbild: http://www.scala-lang.org/sites/default/files/slideshow/
1158741_87567140_t.jpg
• 3) Java-Logo: http://en.wikipedia.org/wiki/File:Java_logo.svg
• 4) Microsoft .NET-Logo: http://i.microsoft.com/net/images/chrome/
net_logo.jpg
• 5) Java Duke: http://duke.kenai.com/wave/Wave.png

Montag, 11. Februar 13

34
Grafikquellen - 2
• 6) Scala-IDE for Eclipse: http://scala-ide.org/resources/images/logo.png
• 7) Netbeans-Logo: http://netbeans.org/
• 8) IntelliJIDEA-Logo: http://www.jetbrains.com/idea/
• 9) Scala-Typhierarchie: http://www.scala-lang.org/node/71?size=_original#
• 10) Diamond Inheritance: http://en.wikipedia.org/wiki/
File:Diamond_inheritance.svg
• 11) Trait Linearization: http://www.artima.com/pins1ed/images/
linearization.jpg

Montag, 11. Februar 13

35
Literaturverzeichnis
[Gar12] Garcia, Miguel: Scala.Net Compiler. http://lampwww.epfl.ch/~magarcia/
ScalaNET/. Version: March 2012, Abruf: 25.12.2012
[IDE12] IDE and Editor plugins. http://www.scala-lang.org/node/91.
Version: April 2012, Abruf: 25.12.2012
[Mar08] Martin Odersky. http://www.scala-lang.org/node/241. Version: August
2008, Abruf: 16.12.2012
[Ode08] Odersky, Martin: Scala’s Prehistory. http://www.scala-lang.org/node/
239. Version: August 2008, Abruf: 16.12.2012
[OSV10] Odersky, Martin ; Spoon, Lex ; Venners, Bill: Programming in Scala. Second
Edition. Artima Press, 2010
[Sca12a] Frequently Asked Questions - Deployment. http://www.scala-lang.org/faq/
2. Version: 2012, Abruf: 26.12.2012
[Sca12b] Scala 2.10.0 RC5. http://www.scala-lang.org/node/25942.
Version: December 2012, Abruf: 01.01.2013

Montag, 11. Februar 13

36
Vielen Dank für die Aufmerksamkeit!

Montag, 11. Februar 13

37

Weitere ähnliche Inhalte

Andere mochten auch

A kc architectuur u bouw def selectie kort 20120622
A kc architectuur u bouw def selectie kort 20120622A kc architectuur u bouw def selectie kort 20120622
A kc architectuur u bouw def selectie kort 20120622reinaldbosman
 
Compliance hot topics acuia 3 13 13 v4
Compliance hot topics acuia 3 13 13 v4Compliance hot topics acuia 3 13 13 v4
Compliance hot topics acuia 3 13 13 v4Taryne Brown
 
Inglés profesional para atención al cliente en comercio. Día 3 de 4.
Inglés profesional para atención al cliente en comercio. Día 3 de 4.Inglés profesional para atención al cliente en comercio. Día 3 de 4.
Inglés profesional para atención al cliente en comercio. Día 3 de 4.Begoña Martínez
 
3 years ago I lost my photos. Now I can find the photographer who took it...
3 years ago I lost my photos. Now I can find the photographer who took it...3 years ago I lost my photos. Now I can find the photographer who took it...
3 years ago I lost my photos. Now I can find the photographer who took it...Yishay Saban
 
An assingment fish recipe
An assingment fish recipeAn assingment fish recipe
An assingment fish recipemakwanasuresh
 
Planaritätsalgorithmus nach Demoucron, Malgrange und Pertuiset
Planaritätsalgorithmus nach Demoucron, Malgrange und PertuisetPlanaritätsalgorithmus nach Demoucron, Malgrange und Pertuiset
Planaritätsalgorithmus nach Demoucron, Malgrange und PertuisetMartin Klinke
 

Andere mochten auch (8)

A kc architectuur u bouw def selectie kort 20120622
A kc architectuur u bouw def selectie kort 20120622A kc architectuur u bouw def selectie kort 20120622
A kc architectuur u bouw def selectie kort 20120622
 
Le persan chinchilla
Le persan chinchillaLe persan chinchilla
Le persan chinchilla
 
Compliance hot topics acuia 3 13 13 v4
Compliance hot topics acuia 3 13 13 v4Compliance hot topics acuia 3 13 13 v4
Compliance hot topics acuia 3 13 13 v4
 
Inglés profesional para atención al cliente en comercio. Día 3 de 4.
Inglés profesional para atención al cliente en comercio. Día 3 de 4.Inglés profesional para atención al cliente en comercio. Día 3 de 4.
Inglés profesional para atención al cliente en comercio. Día 3 de 4.
 
Prep evaluation test
Prep evaluation test  Prep evaluation test
Prep evaluation test
 
3 years ago I lost my photos. Now I can find the photographer who took it...
3 years ago I lost my photos. Now I can find the photographer who took it...3 years ago I lost my photos. Now I can find the photographer who took it...
3 years ago I lost my photos. Now I can find the photographer who took it...
 
An assingment fish recipe
An assingment fish recipeAn assingment fish recipe
An assingment fish recipe
 
Planaritätsalgorithmus nach Demoucron, Malgrange und Pertuiset
Planaritätsalgorithmus nach Demoucron, Malgrange und PertuisetPlanaritätsalgorithmus nach Demoucron, Malgrange und Pertuiset
Planaritätsalgorithmus nach Demoucron, Malgrange und Pertuiset
 

Ähnlich wie Scala

Funktionale Programmierung und mehr mit Scala
Funktionale Programmierung und mehr mit ScalaFunktionale Programmierung und mehr mit Scala
Funktionale Programmierung und mehr mit Scalathoherr
 
Tech-Talk: Python vs. Ruby
Tech-Talk: Python vs. RubyTech-Talk: Python vs. Ruby
Tech-Talk: Python vs. Rubyschlauch
 
Go - Googles Sprache für skalierbare Systeme
Go - Googles Sprache für skalierbare SystemeGo - Googles Sprache für skalierbare Systeme
Go - Googles Sprache für skalierbare SystemeFrank Müller
 
Nigh Session Scala
Nigh Session ScalaNigh Session Scala
Nigh Session Scalaadesso AG
 
Dart (Teil I der Tour de Dart)
Dart (Teil I der Tour de Dart)Dart (Teil I der Tour de Dart)
Dart (Teil I der Tour de Dart)Nane Kratzke
 
Python crash-kurs
Python crash-kursPython crash-kurs
Python crash-kursklausbremer
 
Workshop zu Hibernate 3.2.2 GA
Workshop zu Hibernate 3.2.2 GAWorkshop zu Hibernate 3.2.2 GA
Workshop zu Hibernate 3.2.2 GAOliver Belikan
 
SCALA: ein kurzer Überblick
SCALA: ein kurzer ÜberblickSCALA: ein kurzer Überblick
SCALA: ein kurzer ÜberblickRoland Ewald
 
Ruby und Rails für .NET Entwickler
Ruby und Rails für .NET EntwicklerRuby und Rails für .NET Entwickler
Ruby und Rails für .NET EntwicklerNETUserGroupBern
 
Feige sein! Testen im Java-EE-Umfeld
Feige sein! Testen im Java-EE-UmfeldFeige sein! Testen im Java-EE-Umfeld
Feige sein! Testen im Java-EE-Umfeldgedoplan
 
Ruby is Magic - Episode #7: Closures
Ruby is Magic - Episode #7: ClosuresRuby is Magic - Episode #7: Closures
Ruby is Magic - Episode #7: ClosuresDirk Breuer
 
Einführung in die funktionale Programmierung mit Clojure
Einführung in die funktionale Programmierung mit ClojureEinführung in die funktionale Programmierung mit Clojure
Einführung in die funktionale Programmierung mit ClojureSascha Koch
 
Besseren Java Code mit Type Annotations
Besseren Java Code mit Type AnnotationsBesseren Java Code mit Type Annotations
Besseren Java Code mit Type Annotationsdzuvic
 
Battle of the Languages: Java und Python im Wettstreit beim Lösen von Program...
Battle of the Languages: Java und Python im Wettstreit beim Lösen von Program...Battle of the Languages: Java und Python im Wettstreit beim Lösen von Program...
Battle of the Languages: Java und Python im Wettstreit beim Lösen von Program...gedoplan
 
Scalaz introduction for Java programmers
Scalaz introduction for Java programmersScalaz introduction for Java programmers
Scalaz introduction for Java programmersBernhard Huemer
 
Kennst du ein Unternehmen, dass erfolgreich die QS outtasked hat?“
Kennst du einUnternehmen, dass erfolgreichdie QS outtasked hat?“Kennst du einUnternehmen, dass erfolgreichdie QS outtasked hat?“
Kennst du ein Unternehmen, dass erfolgreich die QS outtasked hat?“hpaustria
 
Einführung in Scala im Vergleich mit Java
Einführung in Scala im Vergleich mit JavaEinführung in Scala im Vergleich mit Java
Einführung in Scala im Vergleich mit JavaMarcel Rehfeld
 

Ähnlich wie Scala (20)

Funktionale Programmierung und mehr mit Scala
Funktionale Programmierung und mehr mit ScalaFunktionale Programmierung und mehr mit Scala
Funktionale Programmierung und mehr mit Scala
 
Tech-Talk: Python vs. Ruby
Tech-Talk: Python vs. RubyTech-Talk: Python vs. Ruby
Tech-Talk: Python vs. Ruby
 
Go - Googles Sprache für skalierbare Systeme
Go - Googles Sprache für skalierbare SystemeGo - Googles Sprache für skalierbare Systeme
Go - Googles Sprache für skalierbare Systeme
 
Nigh Session Scala
Nigh Session ScalaNigh Session Scala
Nigh Session Scala
 
Dart (Teil I der Tour de Dart)
Dart (Teil I der Tour de Dart)Dart (Teil I der Tour de Dart)
Dart (Teil I der Tour de Dart)
 
Scala Workshop
Scala WorkshopScala Workshop
Scala Workshop
 
Python crash-kurs
Python crash-kursPython crash-kurs
Python crash-kurs
 
Workshop zu Hibernate 3.2.2 GA
Workshop zu Hibernate 3.2.2 GAWorkshop zu Hibernate 3.2.2 GA
Workshop zu Hibernate 3.2.2 GA
 
SCALA: ein kurzer Überblick
SCALA: ein kurzer ÜberblickSCALA: ein kurzer Überblick
SCALA: ein kurzer Überblick
 
Ruby und Rails für .NET Entwickler
Ruby und Rails für .NET EntwicklerRuby und Rails für .NET Entwickler
Ruby und Rails für .NET Entwickler
 
Feige sein! Testen im Java-EE-Umfeld
Feige sein! Testen im Java-EE-UmfeldFeige sein! Testen im Java-EE-Umfeld
Feige sein! Testen im Java-EE-Umfeld
 
Ruby is Magic - Episode #7: Closures
Ruby is Magic - Episode #7: ClosuresRuby is Magic - Episode #7: Closures
Ruby is Magic - Episode #7: Closures
 
Einführung in die funktionale Programmierung mit Clojure
Einführung in die funktionale Programmierung mit ClojureEinführung in die funktionale Programmierung mit Clojure
Einführung in die funktionale Programmierung mit Clojure
 
Besseren Java Code mit Type Annotations
Besseren Java Code mit Type AnnotationsBesseren Java Code mit Type Annotations
Besseren Java Code mit Type Annotations
 
Battle of the Languages: Java und Python im Wettstreit beim Lösen von Program...
Battle of the Languages: Java und Python im Wettstreit beim Lösen von Program...Battle of the Languages: Java und Python im Wettstreit beim Lösen von Program...
Battle of the Languages: Java und Python im Wettstreit beim Lösen von Program...
 
Scala und Lift
Scala und LiftScala und Lift
Scala und Lift
 
Wir sind aber nicht Twitter
Wir sind aber nicht TwitterWir sind aber nicht Twitter
Wir sind aber nicht Twitter
 
Scalaz introduction for Java programmers
Scalaz introduction for Java programmersScalaz introduction for Java programmers
Scalaz introduction for Java programmers
 
Kennst du ein Unternehmen, dass erfolgreich die QS outtasked hat?“
Kennst du einUnternehmen, dass erfolgreichdie QS outtasked hat?“Kennst du einUnternehmen, dass erfolgreichdie QS outtasked hat?“
Kennst du ein Unternehmen, dass erfolgreich die QS outtasked hat?“
 
Einführung in Scala im Vergleich mit Java
Einführung in Scala im Vergleich mit JavaEinführung in Scala im Vergleich mit Java
Einführung in Scala im Vergleich mit Java
 

Scala

  • 1. 1) 2) Seminar 1908 Objektorientierte Programmiersprachen and Friends Montag, 11. Februar 13 Martin Klinke Matrikelnr. 8033978 FernUniversität Hagen Lehrgebiet Programmiersysteme betreut von Dr. Daniela Keller Studiengang M. Sc. Prakt. Inf. 1
  • 2. Inhalt • Einleitung • Programmiermodell • Sprachelemente • Weitere Konzepte • Zusammenfassung und Bewertung Montag, 11. Februar 13 2
  • 3. Inhalt • Einleitung • Programmiermodell • Sprachelemente • Weitere Konzepte • Zusammenfassung und Bewertung Montag, 11. Februar 13 3
  • 4. Einleitung • Scala vereint objektorientierte und funktionale Konzepte • Scala überzeugt durch kompakte Syntax, geringe Redundanz, hohe Ausdrucksstärke • Stichwort Inferenz: Typinferenz, Semikoloninferenz • Entwickelt von Martin Odersky und seinem Team seit 2001 an der EPFL in der Schweiz • War Doktorand von Niklaus Wirth, dem Erfinder von Pascal Montag, 11. Februar 13 4
  • 5. Inhalt • Einleitung • Programmiermodell • Sprachelemente • Weitere Konzepte • Zusammenfassung und Bewertung Montag, 11. Februar 13 5
  • 6. Programmiermodell • Scala-Programme laufen in der JVM (auch unter .NET) 3) 4) • Quellcode in Textdateien • Java-Konventionen empfohlen, aber kein Muss • Klassen in gleichnamigen Dateien • Paketstruktur entspricht Verzeichnisstruktur • zahlreiche Bibliotheken Montag, 11. Februar 13 5) 6
  • 8. Programmiermodell - HelloWorld object HelloWorldMain { def main(args: Array[String]) { println("Hello World!") } } object HelloWorldAppWithArgs extends App { println("Hello World! args: " + (args mkString " ")) } Montag, 11. Februar 13 8
  • 9. Inhalt • Einleitung • Programmiermodell • Sprachelemente • Weitere Konzepte • Zusammenfassung und Bewertung Montag, 11. Februar 13 9
  • 10. Klassen class Square(var length: Int) { def printInfo() { println("Square with length " + length) } def area() = length * length def calc3DVolume(height: Int) : Int = { area * height } } Montag, 11. Februar 13 10
  • 11. Objekte • Objekte als Instanzen von Klassen val s = new Square(2) s.printInfo println(s.length) object Figure { var count: Int = 0 • Objekte als Singleton-/ Companion-Objekte, vgl. static-Deklaration in Java def printFiguresInfo() { println("Number of figures: " + count) } } class Figure(name: String) { Figure.count += 1 println("New figure: " + name) } Montag, 11. Februar 13 11
  • 12. Anweisungen • Zwei Formen für Methodenaufrufe • Arithmetische Operatoren sind als Methoden implementiert • Präzedenz anhand des ersten Zeichens des Methodennamens, Tabelle val val val val a b c d = = = = 1 2 a.+(b) a + c val x = this.test(c, d) val y = this test (a, b) def test(a: Int, b: Int): Boolean = a > b • Ausname: Methodenname endet mit = (z.B. +=, <=, >= etc.) Montag, 11. Februar 13 12
  • 13. Kontrollstrukturen • imperativ (Rückgabetyp Unit) • while def whileLoop() { var count = 0 while (count < 10) { println(count) count += 1 } } • do-while def doWhileLoop() { • funktional (Rückgabetyp nutzbar) • if-else • for • try-catch-finally • match-case var count = 0 do { println(count) count += 1 } while (count < 10) } Montag, 11. Februar 13 13
  • 14. Konstrollstrukturen - if-else def divisors(n: Long, testDivisor: Long): List[Long] = { if (testDivisor * testDivisor > n) List(n) else if (n % testDivisor == 0) testDivisor :: divisors(n, testDivisor + 1) else divisors(n, testDivisor + 1) } Montag, 11. Februar 13 14
  • 15. Kontrollstrukturen - for for ( i <- 1 to 50 if i % 2 == 0; k <- divisors(i, 2) if k % 2 != 0; l = -k ) { println("Odd divisor of even " + i + ": " + k + " (negative: " + l + ")") } Montag, 11. Februar 13 15
  • 16. Lambda-Ausdrücke, Funktionen höherer Ordnung println((1 to 5).filter(x => x % 2 == 0)) //-> Vector(2, 4) Montag, 11. Februar 13 16
  • 17. Immutable vs. Mutable Immutable: import scala.collection.immutable.Map object ImmutableDemo { val x = Map[Int, String]() x += (3 -> "three") //does not compile val i = 3 i = 4 //does not compile } Mutable: import scala.collection.mutable.Map class MutableDemo { val x = Map[Int, String]() x += (3 -> "three") //works! var i = 3 i = 4 //works! } Montag, 11. Februar 13 17
  • 18. Typsystem • Strenges Typsystem • Typen werden durch Klassen und Traits definiert • Implizite Typumwandlung object ImplicitDemo extends App { implicit def string2mystring(string: String): MyString = new MyString(string) class MyString(string: String) { def insertBlanks(): String = string.toList.mkString(" ") } println("ABCDEFG".insertBlanks) //println(string2mystring("ABCDEFG").insertBlanks) } Montag, 11. Februar 13 18
  • 19. Typsystem Montag, 11. Februar 13 Scala-Typhierarchie 19
  • 20. Parametrischer Polymorphismus class class class class class UpperBound[T <: AnyRef] LowerBound[T >: String] NonVariant[T] Covariant[+T] ContraVariant[-T] object ParametricPolymorphismDemo extends App { val upperBound = new UpperBound[String] val lowerBound = new LowerBound[AnyRef] val nonVar = new NonVariant[String] val coVar: Covariant[Object] = new Covariant[String] val contraVar: ContraVariant[String] = new ContraVariant[Object] } Montag, 11. Februar 13 20
  • 21. Dynamische Komponente def instanceOfVersion(someObject: Any): String = { (if (someObject.isInstanceOf[String]) someObject.asInstanceOf[String] else "no string") + " (instanceOf)" } def matchVersion(someObject: Any): String = { (someObject match { case s: String => s case _: Any => "no string" }) + " (match)" } Montag, 11. Februar 13 21
  • 22. Überladen von Methoden • Überladen erfolgt durch Definitionen mit demselben Methodennamen und unterschiedlichen Parameterlisten def getAsString(value: Double, maxDigits: Int) = { ... } def getAsString(value: Int) = { ... } Montag, 11. Februar 13 22
  • 23. Überschreiben, dynamisches Binden von Methoden • Überschreiben erfolgt durch Schlüsselwort override • Dynamisches Binden erfolgt beim Aufruf der Methode printLevel() auf dem Alias x vom Typ BaseClass, der auf eine Instanz vom Typ SubClass1 zeigt • Ausgeführt wird die in SubClass1 definierte Methode, welche die Methode in BaseClass überschreibt Montag, 11. Februar 13 abstract class BaseClass { def printLevel() { println("Base") } } class SubClass1 extends BaseClass { override def printLevel() { println("Sub") } } object OverrideDemo extends App { val x: BaseClass = new SubClass1 x.printLevel //-> Sub } 23
  • 24. Inhalt • Einleitung • Programmiermodell • Sprachelemente • Weitere Konzepte • Zusammenfassung und Bewertung Montag, 11. Februar 13 24
  • 25. Multi-Threading object ActorDemo extends App { val client = actor { loop { react { case Start => server ! Request case Response => println( "clnt: Resp received") exit() } } } client.start server.start case object Start case object Request case object Response val server = actor { loop { react { case Request => println( "srv: Req received") sender ! Response exit() } } } Montag, 11. Februar 13 client ! Start } 25
  • 26. Metaprogrammierung • Angabe von Annotations durch @-Zeichen auf Klassen, Methoden, Feldern, Parametern • Annotation => Konstruktoraufruf, ermöglicht Angabe von Parametern aus dem aktuellen Gültigkeitsbereich • Beispiele: @serializable, @unchecked • Reflection-API von Java muss zur Auswertung und Implementierung eigener Annotations genutzt werden Montag, 11. Februar 13 26
  • 27. Traits • Mächtiger als Java-Interfaces • Ermöglichen die Wiederverwendung von Funktionalität ohne Vererbungszwang • Mehrfachvererbung ohne die bekannten Nachteile 10) Montag, 11. Februar 13 27
  • 28. Traits - Beispiel class Logger { def log(string: String) { println(string) } } trait InfoPrefix extends Logger { abstract override def log(string: String) { super.log("[Info] " + string) } } object TraitDemo extends App { val infoLogger = new Logger with InfoPrefix infoLogger.log("This is info") //-> [Info] This is info } Montag, 11. Februar 13 28
  • 29. Traits - Linearisierung • Beispiel aus dem Buch von Martin Odersky zeigt das Prinzip zur Vermeidung der Mehrdeutigkeit vererbter Methoden („Diamond Problem“) • super-Aufrufe werden dynamisch gebunden, statt statisch wie bei „normaler“ Vererbung class trait trait trait class Montag, 11. Februar 13 11) Animal Furry extends Animal HasLegs extends Animal FourLegged extends HasLegs Cat extends Animal with Furry with FourLegged 29
  • 30. apply()-Methode class Formula(f: (Int => Int)) { def apply(x: Int) = f(x) } object Formula { def apply(f: (Int => Int)) = new Formula(f) } val formula = Formula(x => x * x) println(formula(2)) Montag, 11. Februar 13 30
  • 31. Inhalt • Einleitung • Programmiermodell • Sprachelemente • Weitere Konzepte • Zusammenfassung und Bewertung Montag, 11. Februar 13 31
  • 32. Zusammenfassung • Typ-/Semikolon-Inferenz • implizite Typ-Umwandlungen • Mixins durch Traits • funktionale Konzepte • Lambda-Ausdrücke • Pattern Matching Montag, 11. Februar 13 32
  • 33. Bewertung • kompakter als Java • Lösungen sehen häufig aus, als wären sie Bestandteil des Sprachumfangs, dabei "nur" Bibliotheken • saubere Programme durch "immutable" Konzept, Parallelität möglich • Konsistenz des Sprachentwurfs Montag, 11. Februar 13 • leicht zu erlernen, wenn objektorientierte und funktionale Grundkonzepte bekannt sind • sehr angenehme Sprache Bewertung: 1(Tool-Unterstützung noch nicht auf dem Niveau von Java) 33
  • 34. Grafikquellen - 1 • 1) Scala-Logo: http://www.scala-lang.org/sites/default/files/ newsflash_logo.png • 2) Titelbild: http://www.scala-lang.org/sites/default/files/slideshow/ 1158741_87567140_t.jpg • 3) Java-Logo: http://en.wikipedia.org/wiki/File:Java_logo.svg • 4) Microsoft .NET-Logo: http://i.microsoft.com/net/images/chrome/ net_logo.jpg • 5) Java Duke: http://duke.kenai.com/wave/Wave.png Montag, 11. Februar 13 34
  • 35. Grafikquellen - 2 • 6) Scala-IDE for Eclipse: http://scala-ide.org/resources/images/logo.png • 7) Netbeans-Logo: http://netbeans.org/ • 8) IntelliJIDEA-Logo: http://www.jetbrains.com/idea/ • 9) Scala-Typhierarchie: http://www.scala-lang.org/node/71?size=_original# • 10) Diamond Inheritance: http://en.wikipedia.org/wiki/ File:Diamond_inheritance.svg • 11) Trait Linearization: http://www.artima.com/pins1ed/images/ linearization.jpg Montag, 11. Februar 13 35
  • 36. Literaturverzeichnis [Gar12] Garcia, Miguel: Scala.Net Compiler. http://lampwww.epfl.ch/~magarcia/ ScalaNET/. Version: March 2012, Abruf: 25.12.2012 [IDE12] IDE and Editor plugins. http://www.scala-lang.org/node/91. Version: April 2012, Abruf: 25.12.2012 [Mar08] Martin Odersky. http://www.scala-lang.org/node/241. Version: August 2008, Abruf: 16.12.2012 [Ode08] Odersky, Martin: Scala’s Prehistory. http://www.scala-lang.org/node/ 239. Version: August 2008, Abruf: 16.12.2012 [OSV10] Odersky, Martin ; Spoon, Lex ; Venners, Bill: Programming in Scala. Second Edition. Artima Press, 2010 [Sca12a] Frequently Asked Questions - Deployment. http://www.scala-lang.org/faq/ 2. Version: 2012, Abruf: 26.12.2012 [Sca12b] Scala 2.10.0 RC5. http://www.scala-lang.org/node/25942. Version: December 2012, Abruf: 01.01.2013 Montag, 11. Februar 13 36
  • 37. Vielen Dank für die Aufmerksamkeit! Montag, 11. Februar 13 37