scala
DESCRIPTION
Seminarvortrag über die Programmiersprache ScalaTRANSCRIPT
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
Inhalt
• Einleitung
• Programmiermodell
• Sprachelemente
• Weitere Konzepte
• Zusammenfassung und Bewertung
2Montag, 11. Februar 13
Inhalt
• Einleitung
• Programmiermodell
• Sprachelemente
• Weitere Konzepte
• Zusammenfassung und Bewertung
3Montag, 11. Februar 13
• 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
Inhalt
• Einleitung
• Programmiermodell
• Sprachelemente
• Weitere Konzepte
• Zusammenfassung und Bewertung
5Montag, 11. Februar 13
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
Programmiermodell - Tools
6)
7) 8)9)
7Montag, 11. Februar 13
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
Inhalt
• Einleitung
• Programmiermodell
• Sprachelemente
• Weitere Konzepte
• Zusammenfassung und Bewertung
9Montag, 11. Februar 13
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
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
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
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
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
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
Lambda-Ausdrücke, Funktionen höherer Ordnung
println((1 to 5).filter(x => x % 2 == 0))//-> Vector(2, 4)
16Montag, 11. Februar 13
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
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
Typsystem Scala-Typhierarchie
19Montag, 11. Februar 13
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
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
Ü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
Ü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
Inhalt
• Einleitung
• Programmiermodell
• Sprachelemente
• Weitere Konzepte
• Zusammenfassung und Bewertung
24Montag, 11. Februar 13
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
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
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
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
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
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
Inhalt
• Einleitung
• Programmiermodell
• Sprachelemente
• Weitere Konzepte
• Zusammenfassung und Bewertung
31Montag, 11. Februar 13
Zusammenfassung
• Typ-/Semikolon-Inferenz
• implizite Typ-Umwandlungen
• Mixins durch Traits
• funktionale Konzepte
• Lambda-Ausdrücke
• Pattern Matching
32Montag, 11. Februar 13
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
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
34Montag, 11. Februar 13
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
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
Vielen Dank für die Aufmerksamkeit!
37Montag, 11. Februar 13