Scala
description
Transcript of Scala
![Page 1: Scala](https://reader035.fdocument.pub/reader035/viewer/2022062314/56813aa4550346895da29fa4/html5/thumbnails/1.jpg)
Scala
Vortrag im Rahmen des Seminars „Programmiersprachen“
David Ullrich
![Page 2: Scala](https://reader035.fdocument.pub/reader035/viewer/2022062314/56813aa4550346895da29fa4/html5/thumbnails/2.jpg)
In diesem Vortrag erwartet Sie:
Einführung Besonderheiten der Sprache Beispiel-Anwendung: QuickSort Zusammenfassung
![Page 3: Scala](https://reader035.fdocument.pub/reader035/viewer/2022062314/56813aa4550346895da29fa4/html5/thumbnails/3.jpg)
Einführung
Der Ursprung Gründe für eine neue Sprache Zielsetzung beim Entwurf
![Page 4: Scala](https://reader035.fdocument.pub/reader035/viewer/2022062314/56813aa4550346895da29fa4/html5/thumbnails/4.jpg)
Der Ursprung
Prof. Martin Odersky (Pizza, GJ) Programming Methods Laboratory - LAMP Seit 2002 in der Entwicklung Erste Veröffentlichung Januar 2004
![Page 5: Scala](https://reader035.fdocument.pub/reader035/viewer/2022062314/56813aa4550346895da29fa4/html5/thumbnails/5.jpg)
Gründe für eine neue Sprache(nach Odersky)
Zunehmende Verbreitung vonWeb-Services stellt einen Paradigmen-Wechsel dar
Bedarf nach Unterstützung durch Programmiersprachen entsteht
![Page 6: Scala](https://reader035.fdocument.pub/reader035/viewer/2022062314/56813aa4550346895da29fa4/html5/thumbnails/6.jpg)
Ziele beim Entwurf
Verknüpfung von funktionaler und Objekt-Orientierter Programmierung
Kein Flickwerk Synergie Nahtlose Zusammenarbeit mit anderen
Objekt-Orientierten Sprachen Pattern-Matching als Grundlage für
XML-Bearbeitung
![Page 7: Scala](https://reader035.fdocument.pub/reader035/viewer/2022062314/56813aa4550346895da29fa4/html5/thumbnails/7.jpg)
Besonderheiten der Sprache
Das Typsystem Klassen und Vererbung Funktionen Framework-Integration Fortgeschrittene Konzepte
![Page 8: Scala](https://reader035.fdocument.pub/reader035/viewer/2022062314/56813aa4550346895da29fa4/html5/thumbnails/8.jpg)
Das Typsystem
„Alles ist ein Objekt“ klassische Objekte aus der OOP Funktionen Werte Objekte
object ObjektDemo { def main(args: Array[String]): unit = System.out.println(main.toString());}
![Page 9: Scala](https://reader035.fdocument.pub/reader035/viewer/2022062314/56813aa4550346895da29fa4/html5/thumbnails/9.jpg)
Objekthierarchie in Scala (Auswahl)
scala.AnyVal
scala.Any
scala.AnyRef
(java.lang.Object)
scala.Int
scala.Char
scala.Object java.lang.String
![Page 10: Scala](https://reader035.fdocument.pub/reader035/viewer/2022062314/56813aa4550346895da29fa4/html5/thumbnails/10.jpg)
Benutzerdefinierte Typumwandlung
Werttypen besitzen bereits verschiedene coerce-Methoden (Byte Short Int)
coerce-Methoden werden implizit aufgerufen
def coerce: String = { [...]}
![Page 11: Scala](https://reader035.fdocument.pub/reader035/viewer/2022062314/56813aa4550346895da29fa4/html5/thumbnails/11.jpg)
Klassen und Vererbung
Singleton-Objekte Klasseninstanzen Vererbung mixin-composition generische Klassen type-bounds
![Page 12: Scala](https://reader035.fdocument.pub/reader035/viewer/2022062314/56813aa4550346895da29fa4/html5/thumbnails/12.jpg)
Singleton-Objekte
Schlüsselwort object Referenzierung über den Objektnamen main-Methode bildet Startpunkt
object HelloWorld { def main(args: Array[String]): unit = System.out.println(“Hello World!“);}
object HelloWorld with Application { System.out.println(“Hello World!“);}
![Page 13: Scala](https://reader035.fdocument.pub/reader035/viewer/2022062314/56813aa4550346895da29fa4/html5/thumbnails/13.jpg)
Klasseninstanzen
Schlüsselwort class zur Definition Schlüsselwort new zur Instanziierung keine Konstruktoren stattdessen Parameterliste
class Klassendemo(a:int) { val x = a;}
![Page 14: Scala](https://reader035.fdocument.pub/reader035/viewer/2022062314/56813aa4550346895da29fa4/html5/thumbnails/14.jpg)
Vererbung
Einfachvererbung mit Schlüsselwort extends
Schnittstellen-Definition über trait abstract Klassen nur Oberklassen sealed Klassen nie Oberklassen Überladen mit override Signatur bei Überladen änderbar
![Page 15: Scala](https://reader035.fdocument.pub/reader035/viewer/2022062314/56813aa4550346895da29fa4/html5/thumbnails/15.jpg)
Schnittstellendefinition
Schnittstellen haben keinen Zustand Parameter deshalb nicht erlaubt enthält Methodensignaturen können Methoden implementieren können andere Schnittstellen erweitern
trait TraitDemo { def abstractMethod(x: any): unit; def concreteMethod(x: any): String = x.toString();}
![Page 16: Scala](https://reader035.fdocument.pub/reader035/viewer/2022062314/56813aa4550346895da29fa4/html5/thumbnails/16.jpg)
mixin-composition
Unter geeigneten Umständen kann eine Klasse auch die nur die neuen Methoden erben
Die Klasse mit den neuen Methoden heißt mixin
Funktioniert nur, wenn die Oberklasse des mixins eine Oberklasse der Oberklasse der zu erweiternden Klasse ist
![Page 17: Scala](https://reader035.fdocument.pub/reader035/viewer/2022062314/56813aa4550346895da29fa4/html5/thumbnails/17.jpg)
mixin-Beispielclass Point(xc: int) { val x = xc; override def toString() = “x= “ + x;}class ColoredPoint(u: int, c: String) extends Point(u) { var color = c; override def toString() = super.toString() + “, c= “ + c;}class Point2D(xc:int, yc: int) extends Point(xc) { val y = yc; override def toString() = super.toString() + “, y= “ + y; }
class ColoredPoint2D(xc: int, yc: int, c: String) extends Point2D(xc, yc) with ColoredPoint(xc, c);}
![Page 18: Scala](https://reader035.fdocument.pub/reader035/viewer/2022062314/56813aa4550346895da29fa4/html5/thumbnails/18.jpg)
generische Klassen
Objekttyp wird als Parameter in eckigen Klammern übergeben
Parametername kann nun wie ein Typbezeichner verwendet werden
class generischesBeispiel[a](xc: a) { val x: a = xc;}
[...] (args: Array[String]) [...]
![Page 19: Scala](https://reader035.fdocument.pub/reader035/viewer/2022062314/56813aa4550346895da29fa4/html5/thumbnails/19.jpg)
type-bounds
können Typ-Parameter einschränken lower-type-bound: Typ-Parameter T muss
Oberklasse eines anderen Typs A seinT >: A
upper-type-bound: Typ-Parameter T muss eine definierte Oberklasse A haben
T <: A
![Page 20: Scala](https://reader035.fdocument.pub/reader035/viewer/2022062314/56813aa4550346895da29fa4/html5/thumbnails/20.jpg)
Funktionen
Parameter polymorphe Funktionen Currying anonyme Funktionen Operatoren
![Page 21: Scala](https://reader035.fdocument.pub/reader035/viewer/2022062314/56813aa4550346895da29fa4/html5/thumbnails/21.jpg)
Parameter
Übergabe erfolgt in Parameterlisten Typangabe nach Typbezeichner Anzahl der Parameterlisten beliebig Funktionen selbst als Parameter möglich
„Funktionen höherer Ordnung“
def fktBsp(a: int, b: String): unit = { [...]}
def fktBsp2(f: int => String, v: int): String = { f(v);}
![Page 22: Scala](https://reader035.fdocument.pub/reader035/viewer/2022062314/56813aa4550346895da29fa4/html5/thumbnails/22.jpg)
Polymorphe Funktionen
sind generische Methoden lassen sich mit Typ-Parameter versehen lassen sich mit type-bounds einschränken kein Bruch zwischen Klassen und
Funktionen
def polyBsp[T](x: T, n: Int): List[T] = { [...]}
![Page 23: Scala](https://reader035.fdocument.pub/reader035/viewer/2022062314/56813aa4550346895da29fa4/html5/thumbnails/23.jpg)
Currying
Angabe mehrerer Parameterlisten erlaubt allgemeinere Methoden
Aufruf übergibt Parameterlisten und liefert eine Referenz auf eine „konfigurierte“ Methode
def modN(n: Int)(x: Int): Boolean = { ((x % n) == 0);}
modN(2)
def modN(x: Int): Boolean = { ((x % 2) == 0);}
![Page 24: Scala](https://reader035.fdocument.pub/reader035/viewer/2022062314/56813aa4550346895da29fa4/html5/thumbnails/24.jpg)
Anonyme Funktionen
ermöglichen Methodendefinition ohne Bezeichner
Sinnvoll bei Aufruf an einer Stelle im Code implizite Definition erfolgt durch Compiler Parameter-Rumpf-Trennung durch =>
(x: int, y: int) => x * y
![Page 25: Scala](https://reader035.fdocument.pub/reader035/viewer/2022062314/56813aa4550346895da29fa4/html5/thumbnails/25.jpg)
Operatoren
Operatoren sind ebenfalls Objekte Genauer: eine abkürzende Schreibweise Formaler: Methoden, die einen Parameter
erwarten, in einer Infix-Notation
b = a + 3; b = a.+(3);
![Page 26: Scala](https://reader035.fdocument.pub/reader035/viewer/2022062314/56813aa4550346895da29fa4/html5/thumbnails/26.jpg)
Framework-Integration
Nahtlose Interaktion mit der JRE oder der CLR war ein Entwicklungsziel
Scala derzeit ein Wrapper für JVM und Java Compiler
java.lang.* ist bereits importiert Compile-Ergebnis ist Bytecode
![Page 27: Scala](https://reader035.fdocument.pub/reader035/viewer/2022062314/56813aa4550346895da29fa4/html5/thumbnails/27.jpg)
Fortgeschrittene Konzepte
Local Type Inference Pattern-Matching Regular Expression Patterns Case-Classes native XML-Unterstützung Sequence Comprehensionsfor (val i: int <- Iterator.region(0, 23)) { [...]}
for (val i: int <- Iterator.region(0, 23); i % 2 == 0) { [...]}
![Page 28: Scala](https://reader035.fdocument.pub/reader035/viewer/2022062314/56813aa4550346895da29fa4/html5/thumbnails/28.jpg)
Beispiel-Anwendung: QuickSort
Scala-Implementierung OO und funktional Funktionale Implementierung vertauscht
nicht, sondern filtertdef sort(a: List[int]): List[int] = { if (a.length < 2) { a } else { val pivot = a(a.length / 2); sort(a.filter(x => x < pivot)) ::: a.filter(x => x == pivot) ::: sort(a.filter(x => x > pivot)); }}
![Page 29: Scala](https://reader035.fdocument.pub/reader035/viewer/2022062314/56813aa4550346895da29fa4/html5/thumbnails/29.jpg)
QuickSort in Java
Java-Code im Wesentlichen durch„Schlüsselwort-Transformation“
def swap(i: int, j: int): unit = { val t = a(i); a(i) = a(j); a(j) = t;}
private static void swap(int i, int j) { int t = a[i]; a[i] = a[j]; a[j] = t;}
![Page 30: Scala](https://reader035.fdocument.pub/reader035/viewer/2022062314/56813aa4550346895da29fa4/html5/thumbnails/30.jpg)
Benchmark-Ergebnisse
0
1
2
3
4
5
6
100.000 1.000.000 10.000.000 100.000.000
Java Scala OO Scala Fkt
![Page 31: Scala](https://reader035.fdocument.pub/reader035/viewer/2022062314/56813aa4550346895da29fa4/html5/thumbnails/31.jpg)
Zusammenfassung
Einige Interessante Möglichkeiten Mainstream-Features der nahen Zukunft Gute Integration Schnell genug für den täglichen Einsatz Scala ist noch nicht fertig
![Page 32: Scala](https://reader035.fdocument.pub/reader035/viewer/2022062314/56813aa4550346895da29fa4/html5/thumbnails/32.jpg)
Abschließend ...
Scala (ital. Treppe) ist vielleicht nicht DER nächste Schritt, aber ein Schritt in die
richtige Richtung
![Page 33: Scala](https://reader035.fdocument.pub/reader035/viewer/2022062314/56813aa4550346895da29fa4/html5/thumbnails/33.jpg)
Vielen Dank für Ihre Aufmerksamkeit.