Veranstaltungsnummer: 18.163 Dozent: Prof. Dr. Heinz Züllighoven Sommersemester 2008 Betreuer: Dr. Axel Schmolitzky Die Programmiersprache Scala Simon Gerlach, Johannes Kuhlmann 03.06.2008 Ausgewählte Themen der Softwaretechnik 1 Übersicht Historisches Status, Rechtfertigung Eigenschaften Interaktion mit Java Typsystem Syntax 03.06.2008 Ausgewählte Themen der Softwaretechnik 2 1 Historisches Entwickelt an der École Polytechnique Fédérale de Lausanne (EPFL), Schweiz Forschungsprojekt Schlüsselfigur: Prof. Martin Odersky Verlauf in Entwicklung seit 2001 erstes Release im Januar 2004 Version 2 im März 2006 aktuell ist Version 2.7.1 vom 5.5.2008 03.06.2008 Ausgewählte Themen der Softwaretechnik 3 Historisches: Martin Odersky 1989 Doktor an der ETH Zürich Ab 1989 am IBM T. J. Watson Research Center Ab 1991 an der Yale University Ab 1993 Professor an der Uni Karlsruhe und ab 1997 an der University of South Australia Seit 1999 Professor an der EPFL Frühere Arbeiten: Pizza: erweitert Java um Generics, Funktionspointer, Pattern Matching GJ: erweitert Java um Generics, kaum verändert in Java 5 eingegangen 03.06.2008 Ausgewählte Themen der Softwaretechnik 4 2 Status Stabilität: „quite stable and generates stable byte-code that will run successfully on most JREs“ zahlreiche Paper, sehr ausführliche Dokumentation, viele Blog-Einträge aktive Mailing-Listen, aktive Entwicklung ein bisher 636 Seiten starkes Buch in Arbeit 3 aktuelle Jobangebote im Scala-Wiki Lizenz: BSD-Style 03.06.2008 Ausgewählte Themen der Softwaretechnik 5 Oderskys Rechtfertigung Aufstieg von Webservices und verteilter Software vergleichbar zur Ablösung der Command-Lines durch GUIs was OO-Sprachen förderte Webservices nutzen verschiedene Sprachen Scala vereint diese Ansätze: Funktional: XML-Verarbeitung Objektorientiert: Geschäftslogik Nebenläufigkeit Statische Typisierung 03.06.2008 Ausgewählte Themen der Softwaretechnik 6 3 Eigenschaften (1) „Scala“ hat zwei Bedeutungen: italienisch für „Treppe“ für „scalable language“ Die Sprache ist: skalierbar: gleiche Konzepte für kleine und große Teile objektorientiert und funktional 03.06.2008 Ausgewählte Themen der Softwaretechnik 7 Eigenschaften (2) Jeder Wert ist ein Objekt Jede Operation ist eine Methode Da Zahlen Objekte, sind haben sie Methoden: 1 + 2 * 3 / x kann geschrieben werden als 1.+((2.*(3))./(x)) Gültige Bezeichner können aus Sonderzeichen bestehen, z. B.: |^&<>=!:+*/% Funktionen können in Variablen gespeichert und als Argument an Methoden übergeben werden. 03.06.2008 Ausgewählte Themen der Softwaretechnik 8 4 Interaktion mit Java Scala läuft auf der JVM Volle Interoperabilität Alle Java-Library-Klassen können importiert werden. java.lang wird automatisch importiert Scala-Klassen können Java-Klassen erweitern. Java Interfaces können implementiert werden. 03.06.2008 Ausgewählte Themen der Softwaretechnik 9 Typsystem Statisch (Typprüfung zur Übersetzungszeit) Bietet Typinferenz zur Ableitung von Typen ohne explizite Typangabe: var wahr1: Boolean = true var wahr2 = true Subtyp-Polymorphie und Implementationsmehrfachvererbung möglich 03.06.2008 Ausgewählte Themen der Softwaretechnik 10 5 Typsystem: Überblick Ausgewählte Themen der Softwaretechnik 03.06.2008 11 Syntax Basiert stark auf Java und C#, aber: kein Semikolon nach Anweisungen nötig Deklarationen haben die Form name: typ void ist in Scala Unit Methoden mit nur einem Argument können als Infix-Notation geschrieben werden: arg.startsWith("-") entspricht arg startsWith "-" keine static-Member 03.06.2008 werden nur als Singletons umgesetzt Ausgewählte Themen der Softwaretechnik 12 6 Syntax: „Hello, world!“ Definiert ein Singleton Deklarationen haben die Form name: typ object HelloWorld { def main(args: Array[String]) { println("Hello, world!") } } Ruft Java auf: System.out.println(...) GermanDate 03.06.2008 Ausgewählte Themen der Softwaretechnik 13 Syntax: Ausdrücke (1) Simple Berechnungen, die ein Ergebnis und einen Typ besitzen 87 + 145 => Int: 232 "hello" + " world!" => java.lang.String: "hello world!“ Können benannt werden: Schlüsselwort def def radius = 10 => radius: Int Auswertung der rechten Seite erst bei Benutzung des Namens 03.06.2008 Ausgewählte Themen der Softwaretechnik 14 7 Syntax: Ausdrücke (2) Sofortige Auswertung mit Schlüsselwort val Ablauf einer Auswertung: val x = 12 * 15 Linksseitigste Operation auswählen Ihre Operanden auswerten Den Operator auf die Operanden anwenden Ende, wenn ein Wert erreicht ist Beispiel einer Auswertung: (2 * pi) * radius (2 * 3.141592653589793) * radius 6.283185307179586 * radius ... => => 03.06.2008 Ausgewählte Themen der Softwaretechnik 15 Syntax: Funktionen und Parameter Mittels def lassen sich auch Funktionen mit oder ohne Parameter definieren Parameter stehen in Klammern und haben die übliche Form name: typ Hat eine Funktion keine Parameter, können die Klammern weggelassen werden Aber: ein leeres Klammerpaar muss beim Aufruf jedoch immer angegeben werden 03.06.2008 Ausgewählte Themen der Softwaretechnik 16 8 Syntax: Auswertung von Funktionen (1) Auswertung erfolgt standardmäßig über call-by-value: def sumOfSquares(x: Double, y: Double) = square(x) + square(y) => => => => => => => 03.06.2008 sumOfSquares(3, 2+2) sumOfSquares(3, 4) square(3) + square(4) 3 * 3 + square(4) 9 + square(4) 9 + 4 * 4 9 + 16 25 Ausgewählte Themen der Softwaretechnik 17 Syntax: Auswertung von Funktionen (2) Steht einem Parameter-Typ ein => voran, wird jedoch für diesen Parameter call-by-name angewendet: def sumOfSquares(x: Double, y: => Double) = square(x) + square(y) => => => => => => sumOfSquares(3, 2+2) square(3) + square(2+2) 3 * 3 + square(2+2) 9 + square(2+2) 9 + (2+2) * (2+2) 9 + 4 * (2+2) … Vorteil: Die Auswertung wird verzögert, bis sie benötigt wird. Ein nicht benötigter Parameter wird auch nicht ausgewertet. 03.06.2008 Ausgewählte Themen der Softwaretechnik 18 9 Syntax: Fallunterscheidungen if-else-Konstrukt Syntax wie in Java Unterschied: Java erlaubt nur die Auswahl zwischen zwei Anweisungen Scala erlaubt auch die Auswahl zwischen zwei Ausdrücken if-else in Scala also auch wie ... ? ... : ... in Java Beispiel: def abs(x: Double) = if (x >= 0) x else -x 03.06.2008 19 Ausgewählte Themen der Softwaretechnik Syntax: Blöcke Werden mit geschwungenen Klammern umschlossen: { ... } Gelten als Ausdruck und haben einen Wert. Der Wert wird durch den letzten Ausdruck im Block definiert (kein explizites return nötig). Newton 03.06.2008 Ausgewählte Themen der Softwaretechnik 20 10 Syntax: Funktionen höherer Ordnung Nehmen eine andere Funktion als Parameter oder geben eine Funktion als Ergebnis zurück. Beispiel: def sum(f: Int => Int, a: Int, b: Int): Int = if (a > b) 0 else f(a) + sum(f, a + 1, b) 03.06.2008 21 Ausgewählte Themen der Softwaretechnik Syntax: Anonyme Funktionen Ausdruck, der zu einer Funktion ausgewertet wird Werden ohne Namen definiert: (x: Int) => x * x Können immer auch durch „normale“ Funktionsdefinitionen ersetzt werden => nur „syntaktischer Zucker“ HighOrder 03.06.2008 Ausgewählte Themen der Softwaretechnik 22 11 Syntax: Klassendefinition Schlüsselwort class Primärer Konstruktor wird im Kopf der Klasse angegeben Member der Klasse können auf private gesetzt werden Erzeugen eines Exemplars mit Schlüsselwort new 03.06.2008 23 Ausgewählte Themen der Softwaretechnik Syntax: Vererbung implizite Superklasse: scala.ScalaObject Die Unterklasse erbt alle Member der Oberklasse Überschreiben explizit mit Schlüsselwort override Wenn Klasse A Klasse B erweitert, können Exemplare von Klasse A überall verwendet werden, wo Exemplare von Klasse B erwartet werden. Rational 03.06.2008 Ausgewählte Themen der Softwaretechnik 24 12 Syntax: Abstrakte Klassen Analog zu Java: Schlüsselwort abstract Können abstrakte Member enthalten Es können keine Exemplare erzeugt werden. 03.06.2008 25 Ausgewählte Themen der Softwaretechnik Syntax: Mixins Ähnlich den Interfaces in Java Dürfen aber Code enthalten Erlauben das „Beimischen“ von Funktionalität zu einer Klasse und Implementationsmehrfachvererbung. Date 03.06.2008 Ausgewählte Themen der Softwaretechnik 26 13 Syntax: Case Classes Schlüsselwort case wird class vorangestellt Case classes haben einige Besonderheiten: Implizite Konstruktorfunktion mit demselben Namen wie die Klasse (kein new mehr nötig beim Aufruf) Automatische Generierung von toString, equals und hashCode Automatische Generierung von Gettern für Konstruktorargumente Case classes erlauben die Konstruktion von Mustern (engl.: pattern), die sich auf den Konstruktor der case class beziehen. 1. 2. 3. 4. 03.06.2008 27 Ausgewählte Themen der Softwaretechnik Syntax: Pattern matching Ähnlich einer switch-Anweisung in Java Wird mittels der Methode match aufgerufen Allgemein: Pattern werden aus folgenden Anweisungen zusammengebaut: Case class Konstruktoren, deren Argumente wieder Pattern sind. Pattern Variablen Dem „Wildcard“ Pattern _ Literale: true, “abc“ Konstanten 03.06.2008 Expr (target) Ausgewählte Themen der Softwaretechnik 28 14 Weitere Sprachbestandteile XML: Bestandteil der Sprache Actors und Messages: ähnlich Erlang Unterstützung von Nebenläufigkeit Tupel und Listen For-Comprehensions implicit Funktionen und Parameter Refinements und vieles mehr... 03.06.2008 Ausgewählte Themen der Softwaretechnik 29 Ende Vielen Dank für die Aufmerksamkeit! Kontaktdaten: Simon Gerlach Johannes Kuhlmann 03.06.2008 [email protected] [email protected] Ausgewählte Themen der Softwaretechnik 30 15 Quellen Odersky, Martin: A Brief History of Scala, http://www.artima.com/weblogs/viewpost.jsp?thread=163733 (abgerufen 30.5.2008), 9.6.2006. Odersky, Martin: Pimp my Library, http://www.artima.com/weblogs/viewpost.jsp?thread=179766 (abgerufen 30.5.2008), 9.10.2006. Odersky, Martin: The Scala Experiment, Google Tech Talk, http://lampwww.epfl.ch/~odersky/talks/google06.pdf (abgerufen 30.5.2008), 2006. Odersky, Martin: Scala Rationale, http://www.scala-lang.org/docu/files/ScalaRationale.pdf (abgerufen 30.5.2008), 13.6.2007. Odersky, Martin: The Scala Language Specification, Version 2.7 (Draft), 2008. Odersky, Martin, Phillipe Altherr et al.: An Overview of the Scala Programminig Language, 2006. Scala Wiki, http://scala.sygneca.com/ (abgerufen 30.5.2008), 2008. Schinz Michel und Philipp Haller: A Scala Tutorial for Java programmers, Version 1.2, http://www.scalalang.org/docu/files/ScalaTutorial.pdf (abgerufen 30.5.2008), 2008. Odersky, Martin: Scala By Example, Draft, http://www.scala-lang.org/docu/files/ScalaByExample.pdf (abgerufen am 19.05.2008), 05.05.2008 The Scala Programming Language, http://www.scala-lang.org/ (abgerufen 30.5.2008), 2008. Upadhya, Revati: Steps (Titelbild), http://www.sxc.hu/photo/857689 (abgerufen 30.5.2008), 2007. Venners, Bill, Martin Odersky und Lex Spoon: First Steps to Scala, http://www.artima.com/scalazine/articles/steps.html (abgerufen 30.5.2008), 9.5.2007. 03.06.2008 Ausgewählte Themen der Softwaretechnik 31 16