scala

37
Seminar 1908 Objektorientierte Programmiersprachen and Friends Martin Klinke Matrikelnr. 8033978 FernUniversität Hagen Lehrgebiet Programmiersysteme betreut von Dr. Daniela Keller Studiengang M. Sc. Prakt. Inf. 1) 2) 1 Montag, 11. Februar 13

Upload: martin-klinke

Post on 09-Jul-2015

209 views

Category:

Technology


2 download

DESCRIPTION

Seminarvortrag über die Programmiersprache Scala

TRANSCRIPT

Page 1: Scala

Seminar 1908Objektorientierte

Programmiersprachen and Friends

Martin KlinkeMatrikelnr. 8033978FernUniversität HagenLehrgebiet Programmiersystemebetreut von Dr. Daniela KellerStudiengang M. Sc. Prakt. Inf.

1)

2)

1Montag, 11. Februar 13

Page 2: Scala

Inhalt

• Einleitung

• Programmiermodell

• Sprachelemente

• Weitere Konzepte

• Zusammenfassung und Bewertung

2Montag, 11. Februar 13

Page 3: Scala

Inhalt

• Einleitung

• Programmiermodell

• Sprachelemente

• Weitere Konzepte

• Zusammenfassung und Bewertung

3Montag, 11. Februar 13

Page 4: Scala

• 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

Einleitung

4Montag, 11. Februar 13

Page 5: Scala

Inhalt

• Einleitung

• Programmiermodell

• Sprachelemente

• Weitere Konzepte

• Zusammenfassung und Bewertung

5Montag, 11. Februar 13

Page 6: Scala

Programmiermodell

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

• Quellcode in Textdateien

• Java-Konventionen empfohlen, aber kein Muss

• Klassen in gleichnamigen Dateien

• Paketstruktur entspricht Verzeichnisstruktur

• zahlreiche Bibliotheken

3)

4)

5)

6Montag, 11. Februar 13

Page 7: Scala

Programmiermodell - Tools

6)

7) 8)9)

7Montag, 11. Februar 13

Page 8: Scala

Programmiermodell - HelloWorld

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

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

8Montag, 11. Februar 13

Page 9: Scala

Inhalt

• Einleitung

• Programmiermodell

• Sprachelemente

• Weitere Konzepte

• Zusammenfassung und Bewertung

9Montag, 11. Februar 13

Page 10: Scala

Klassen

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

10Montag, 11. Februar 13

Page 11: Scala

Objekte

• Objekte als Instanzen von Klassen

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

val s = new Square(2)s.printInfoprintln(s.length)

object Figure { var count: Int = 0

def printFiguresInfo() { println("Number of figures: " + count) }}

class Figure(name: String) { Figure.count += 1 println("New figure: " + name)}

11Montag, 11. Februar 13

Page 12: Scala

Anweisungen

• Zwei Formen für Methodenaufrufe

• Arithmetische Operatoren sind als Methoden implementiert

• Präzedenz anhand des ersten Zeichens des Methodennamens, Tabelle

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

val a = 1val b = 2val c = a.+(b)val d = a + c

val x = this.test(c, d)val y = this test (a, b)

def test(a: Int, b: Int): Boolean = a > b

12Montag, 11. Februar 13

Page 13: Scala

Kontrollstrukturen

• imperativ (Rückgabetyp Unit)

• while

• do-while

• funktional (Rückgabetyp nutzbar)

• if-else

• for

• try-catch-finally

• match-case

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

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

13Montag, 11. Februar 13

Page 14: Scala

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)}

14Montag, 11. Februar 13

Page 15: Scala

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 + ")")}

15Montag, 11. Februar 13

Page 16: Scala

Lambda-Ausdrücke, Funktionen höherer Ordnung

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

16Montag, 11. Februar 13

Page 17: Scala

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}

Immutable vs. Mutable

Mutable:import scala.collection.mutable.Map

class MutableDemo { val x = Map[Int, String]() x += (3 -> "three") //works! var i = 3 i = 4 //works!}

17Montag, 11. Februar 13

Page 18: Scala

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)}

18Montag, 11. Februar 13

Page 19: Scala

Typsystem Scala-Typhierarchie

19Montag, 11. Februar 13

Page 20: Scala

Parametrischer Polymorphismus

class UpperBound[T <: AnyRef]class LowerBound[T >: String]class NonVariant[T]class Covariant[+T]class 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]}

20Montag, 11. Februar 13

Page 21: Scala

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)"}

21Montag, 11. Februar 13

Page 22: Scala

Überladen von Methoden

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

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

def getAsString(value: Int) = { ... }

22Montag, 11. Februar 13

Page 23: Scala

Ü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

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}

23Montag, 11. Februar 13

Page 24: Scala

Inhalt

• Einleitung

• Programmiermodell

• Sprachelemente

• Weitere Konzepte

• Zusammenfassung und Bewertung

24Montag, 11. Februar 13

Page 25: Scala

Multi-Threadingobject ActorDemo extends App {

case object Start case object Request case object Response

val server = actor { loop { react { case Request => println( "srv: Req received") sender ! Response exit() } } }

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

client ! Start}

25Montag, 11. Februar 13

Page 26: Scala

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

26Montag, 11. Februar 13

Page 27: Scala

Traits

• Mächtiger als Java-Interfaces

• Ermöglichen die Wiederverwendung von Funktionalität ohne Vererbungszwang

• Mehrfachvererbung ohne die bekannten Nachteile

10)

27Montag, 11. Februar 13

Page 28: Scala

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}

28Montag, 11. Februar 13

Page 29: Scala

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 Animal trait Furry extends Animaltrait HasLegs extends Animaltrait FourLegged extends HasLegsclass Cat extends Animal with Furry with FourLegged

11)

29Montag, 11. Februar 13

Page 30: Scala

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))

30Montag, 11. Februar 13

Page 31: Scala

Inhalt

• Einleitung

• Programmiermodell

• Sprachelemente

• Weitere Konzepte

• Zusammenfassung und Bewertung

31Montag, 11. Februar 13

Page 32: Scala

Zusammenfassung

• Typ-/Semikolon-Inferenz

• implizite Typ-Umwandlungen

• Mixins durch Traits

• funktionale Konzepte

• Lambda-Ausdrücke

• Pattern Matching

32Montag, 11. Februar 13

Page 33: Scala

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

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

• sehr angenehme Sprache

Bewertung:1-

(Tool-Unterstützung noch nichtauf dem Niveau von Java)

33Montag, 11. Februar 13

Page 35: Scala

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

35Montag, 11. Februar 13

Page 36: Scala

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: August2008, 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. SecondEdition. 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

36Montag, 11. Februar 13

Page 37: Scala

Vielen Dank für die Aufmerksamkeit!

37Montag, 11. Februar 13