PDF herunterladen

Werbung
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
Herunterladen