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

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 vereintobjektorientierte 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 laufenin 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
  • 7.
  • 8.
    Programmiermodell - HelloWorld objectHelloWorldMain { 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 alsInstanzen 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 Formenfü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ückgabetypUnit) • 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 defdivisors(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öhererOrdnung println((1 to 5).filter(x => x % 2 == 0)) //-> Vector(2, 4) Montag, 11. Februar 13 16
  • 17.
    Immutable vs. Mutable Immutable: importscala.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. Februar13 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 Bindenvon 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 extendsApp { 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 vonAnnotations 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 alsJava-Interfaces • Ermöglichen die Wiederverwendung von Funktionalität ohne Vererbungszwang • Mehrfachvererbung ohne die bekannten Nachteile 10) Montag, 11. Februar 13 27
  • 28.
    Traits - Beispiel classLogger { 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 • impliziteTyp-Umwandlungen • Mixins durch Traits • funktionale Konzepte • Lambda-Ausdrücke • Pattern Matching Montag, 11. Februar 13 32
  • 33.
    Bewertung • kompakter alsJava • 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ürdie Aufmerksamkeit! Montag, 11. Februar 13 37