Scala
Upcoming SlideShare
Loading in...5
×
 

Scala

on

  • 180 views

Seminarvortrag über die Programmiersprache Scala

Seminarvortrag über die Programmiersprache Scala

Statistics

Views

Total Views
180
Views on SlideShare
180
Embed Views
0

Actions

Likes
0
Downloads
0
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Scala Scala Presentation Transcript

  • 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