Scala LIGHTNING TALK – 03 Agenda 1.Was ist Scala? 2.Hauptmerkmale von Scala 3.Bewertung 2 | LT 03 - Scala Was ist Scala? Scala: scalable language l Forschungsprojekt zur Komponentenorientierung l Hypothese 1: Programmiersprachen für l 3 | LT 03 - Scala Komponenten müssen skalierbar sein Hypothese 2: Skalierbarkeit wird durch die Verbindung und Vereinheitlichung von funktionalen und objektorientierten Programmierkonzepten erreicht Was ist Scala? Meilensteine in der Entwicklung von Scala 2001 • Beginn der Entwicklung an der EPFL als Forschungsprojekt • Unter der Leitung von Martin Odersky 4 | LT 03 - Scala 2004 • Erste Version für die JVM im Januar • Erste Version für .NET im Juni 2006 • Zweite, überarbeitete Version im März 2009 • Twitter steigt auf Scala um 2011 • EU fördert die Weiterentwicklung von Scala für 5 Jahre • Verdoppelung des Entwicklerteams • Zusammenarbeit mit der Universität Stanford • Gründung von Typesafe Hauptmerkmale von Scala Merkmale l Skalierbar l Funktional und objektorientiert l Statisches Typsystem – Mit Typinferenz val x: HashMap[Int, String] = new HashMap[Int, String]() entspricht val x = new HashMap[Int, String]() l l l – Viel mächtiger als z.B. das Typsystem von Java Läuft auf der JVM und auf der .NET Plattform Volle Interoperabilität mit Java erweiterbarer Sprachkern 5 | LT 03 - Scala Hauptmerkmale von Scala Scala ist objektorientiert l Scala ist eine klassenbasierte objektorientierte Programmiersprache l Scala ist „rein“ objektorientiert, d.h. – Jeder Wert ist ein Objekt – Jede Methode ist ein Nachrichtenversand – Es gibt keine primitiven Datentypen – Es gibt keine statischen Elemente l Unterstützt Vererbung (und Traits als Ersatz für Mehrfachvererbung ) l Operationen sind „normale“ Methoden l Sonderzeichen wie +,-,*,/,%,|,^,&,<,>,=,! und : sind gültige Methodennamen l Damit sind auch Zahlen Objekte und Operatoren normale Methodenaufrufe: 1+1*2/x entspricht also 1.+((1.*(2))./(x)) 6 | LT 03 - Scala Merkmale von Scala Scala ist objektorientiert Beispiel package rational class Rational (z: Int, n: Int) { require (n != 0) val zaehler = z val nenner = n def this (n: Int) = this (n, 1) Definition der Klasse Rational mit Standardkonstruktor Zusätzlicher Konstruktor def * (that: Rational) = new Rational ( zaehler * that.zaehler, Definition der Methode „*“ ) } 7 | LT 03 - Scala nenner * that.nenner override def toString = zaehler + "/" + nenner Überschriebene Methode „toString“ Merkmale von Scala Scala ist funktional l l l l l Jede Funktion ist ein Wert und damit auch ein Objekt Funktionen sind first-class values Scala bietet Funktionen höherer Ordnung In Scala können anonyme Funktionen definiert werden Funktionen können geschachtelt werden l Beispiele: – natürliche Callbacks – Filter-Methoden 8 | LT 03 - Scala Merkmale von Scala Scala ist funktional Beispiel def oncePerSecond(callback: () => Unit) { while (true) { callback(); Thread sleep 1000 } } def timeFlies() { println("time flies like an arrow...") } def main(args: Array[String]) { oncePerSecond(timeFlies) } def oncePerSecond(callback: () => Unit) { while (true) { callback(); Thread sleep 1000 } } def main(args: Array[String]) { oncePerSecond(() => println("time flies like an arrow...")) } 9 | LT 03 - Scala Funktion „timeFlies“ wird als Parameter an die Funktion „oncePerSecond“ übergeben Übergabe einer anonymen Funktion Merkmale von Scala Traits l Ähnlich wie Java Interfaces, können aber Implementierung enthalten l Kapseln Methoden- und Felddefinitionen, die in Klassen l l l l wiederverwendet („mix-in“) werden können Dienen als „sauberer“ Ersatz für die Mehrfachvererbung Definieren Typen (wie Klassen oder Interfaces) Können keine Klassenparameter enthalten super-Aufrufe werden dynamisch gebunden! (Linearisierung) l Anwendungsgebiete: – Stackable Modifications – Thin Interfaces zu Rich Interfaces erweitern Sind das wichtigste Konzepte für Wiederverwendung von Code und Verhalten in Scala 10 | LT 03 - Scala Merkmale von Scala Traits Beispiel abstract class IntQueue { def get(): Int def put(x: Int) } class BasicIntQueue extends IntQueue { private val buf = new ArrayBuffer[Int] def get() = buf.remove(0) def put(x: Int) { buf += x } } Trait Doubling trait Doubling extends IntQueue { abstract override def put(x: Int) { super.put(2 * x) } } trait Incrementing extends IntQueue { abstract override def put(x: Int) { super.put(x + 1) } } trait Incrementing extends IntQueue { abstract override def put(x: Int) { super.put(x + 1) } } Trait Incrementing Trait Filtering Mix-in verschiedener Traits val queue = (new BasicIntQueue with Incrementing with Filtering with Doubling) 11 | LT 03 - Scala Merkmale von Scala Implicit Conversions l Werden dazu verwendet um Bibliotheken und Typen l l l l anzupassen, auf die man keinen Zugriff hat Sind eine Art Adapter Werden vom Compiler automatisch durchgeführt Erlauben es einen Typ in einem Kontext zu verwenden, wo eigentlich ein anderer erwartet wird Views Werden in Scala für Typen wie scala.Int, scala.Float, ... verwendet l Beispiel implicit def intToRational(x: Int)= new Rational(x) 12 | LT 03 - Scala Merkmale von Scala Case Classes und Pattern Matching l Case Classes – Automatische Generierung einer Factory-Methode mit dem selben Namen wie die Klasse (kein new mehr notwendig) – Automatische Generierung von Gettern für die Konstruktorargumente – Case classes erlauben die Konstruktion von Mustern, die sich auf den Konstruktor der case class beziehen l Beispiel 13 | LT 03 - Scala Definition von case classes abstract class Expr case class Number (n: Int) extends Expr case class Sum(e1: Expr, e2: Expr) extends Expr Merkmale von Scala Case Classes und Pattern Matching l Pattern Matching – Verallgemeinerung des switch-Statements – Wird mit match aufgerufen – Pattern werden u.a. aus folgenden Anweisungen zusammengebaut: – l Case class Konstruktoren, deren Argumente wieder Pattern sind l Mustervariablen Auswertung mittels l Dem „Wildcard“ Muster _ Pattern Matching l Literale l Konstanten Beispiel def eval(e: Expr) Int = e match { } 14 | LT 03 - Scala case Number(n) => n case Sum(l, r) => eval(l) + eval (r) Merkmale von Scala Fortgeschrittene Sprachfeatures l l l l l Ko- und Kontravarianz Case Classes und Pattern Matching Parallelität Funktionale Konzepte … 15 | LT 03 - Scala Merkmale von Scala Scala und Komponenten? Anforderung Realisierung in Scala Komponente Klasse Laufzeit Komponente Objekt Interface (angebotene Services) Abstrakte Klasse oder Trait Kontextabhängigkeiten (benötigte Services) Abstrakte Member (oder der explizite Self-Typ) Komposition Mix-in Komposition von Traits 16 | LT 03 - Scala Bewertung l Scala – Ermöglicht kurzen und „eleganten“ Code – Ist „produktionsreif“ (Twitter , LinkedIn, UBS, EDF, – – – – 17 | LT 03 - Scala Siemens) Interoperabilität mit Java hat große Vorteile Ist sehr mächtig, aber auch sehr komplex Nicht wirklich einfach zu lernen… ... macht aber Spaß Zusammenfassung l Scala ist ein Forschungsprojekt um eine Programmiersprache für die komponentenbasierte Programmierung zu entwickeln l Zwei Hypothesen: – Eine entsprechende Programmiersprache muss skalierbar sein – Dies kann erreicht werden, indem funktionale und objektorientierte Programmierkonzepte verbunden werden l Scala stellt umfangreiche Konzepte zur Abstraktion, Dekomposition und Komposition zur Verfügung l Scala hat ein mächtiges statisches Typsystem 18 | LT 03 - Scala Vielen Dank für die Aufmerksamkeit Fragen und Anmerkungen? 19 | LT 03 - Scala Quellen l Jacobson, Ivar: Object-Oriented Software Engineering: A Use Case Driven l l l l l l l Approach. Addison-Wesley Professional, 1992 Odersky, Martin ; Altherr, Philippe ; Cremet, Vincent ; Dragos, Iulian ; Dubochet, Gilles ; Emir, Burak ; McDirmid, Sean ; Micheloud, Stephane ; Mihaylov, Nikolay ; Schinz, Michel ; Stenman, Erik ; Spoon, Lex ; Zenger, Matthias. An Overview of the Scala Programming Language, Second Edition. http://www.scalalang.org/docu/files/ScalaOverview.pdf#.2006 Odersky, Martin. Feitherweight Scala, Week 14 Odersky, Martin: Scala By Example. (2010), Mai Odersky, Martin ; Spoon, Lex ; Venners, Bill: Programming in Scala Artima Press, 2008 Odersky, Martin ; Zenger, Matthias. Scalable Component Abstractions Schinz, Michel ; Haller, Philipp: A Scala Tutorial for Java programmers. (2010), Mai Szyperski, Clemens: Component Software. Beyond Object-Oriented Programming. Addison-Wesley Longman, Amsterdam, 2002 20 | LT 03 - Scala