1)

2)

Seminar 1908
Objektorientierte
Programmiersprachen and
Friends
Montag, 11. Februar 13

Martin Klinke
Matrikelnr. 8...
Inhalt
• Einleitung
• Programmiermodell
• Sprachelemente
• Weitere Konzepte
• Zusammenfassung und Bewertung

Montag, 11. F...
Inhalt
• Einleitung
• Programmiermodell
• Sprachelemente
• Weitere Konzepte
• Zusammenfassung und Bewertung

Montag, 11. F...
Einleitung
• Scala vereint objektorientierte und funktionale Konzepte
• Scala überzeugt durch kompakte Syntax, geringe Red...
Inhalt
• Einleitung
• Programmiermodell
• Sprachelemente
• Weitere Konzepte
• Zusammenfassung und Bewertung

Montag, 11. F...
Programmiermodell
• Scala-Programme laufen in der
JVM (auch unter .NET)

3)

4)

• Quellcode in Textdateien
• Java-Konvent...
6)

7)

8)
9)

Programmiermodell - Tools

Montag, 11. Februar 13

7
Programmiermodell - HelloWorld
object HelloWorldMain {
def main(args: Array[String]) {
println("Hello World!")
}
}

object...
Inhalt
• Einleitung
• Programmiermodell
• Sprachelemente
• Weitere Konzepte
• Zusammenfassung und Bewertung

Montag, 11. F...
Klassen
class Square(var length: Int) {
def printInfo() {
println("Square with length " + length)
}
def area() = length * ...
Objekte
• Objekte als Instanzen von
Klassen

val s = new Square(2)
s.printInfo
println(s.length)
object Figure {
var count...
Anweisungen
• Zwei Formen für
Methodenaufrufe
• Arithmetische Operatoren sind
als Methoden implementiert
• Präzedenz anhan...
Kontrollstrukturen
• imperativ (Rückgabetyp Unit)
• while

def whileLoop() {
var count = 0
while (count < 10) {
println(co...
Konstrollstrukturen - if-else

def divisors(n: Long, testDivisor: Long): List[Long] = {
if (testDivisor * testDivisor > n)...
Kontrollstrukturen - for

for (
i <- 1 to 50 if i % 2 == 0;
k <- divisors(i, 2) if k % 2 != 0;
l = -k
) {
println("Odd div...
Lambda-Ausdrücke, Funktionen höherer Ordnung

println((1 to 5).filter(x => x % 2 == 0))
//-> Vector(2, 4)

Montag, 11. Feb...
Immutable vs. Mutable
Immutable:
import scala.collection.immutable.Map
object ImmutableDemo {
val x = Map[Int, String]()
x...
Typsystem
• Strenges Typsystem
• Typen werden durch Klassen und Traits definiert
• Implizite Typumwandlung
object ImplicitD...
Typsystem
Montag, 11. Februar 13

Scala-Typhierarchie

19
Parametrischer Polymorphismus
class
class
class
class
class

UpperBound[T <: AnyRef]
LowerBound[T >: String]
NonVariant[T]...
Dynamische Komponente
def instanceOfVersion(someObject: Any): String = {
(if (someObject.isInstanceOf[String])
someObject....
Überladen von Methoden
• Überladen erfolgt durch Definitionen mit demselben Methodennamen
und unterschiedlichen Parameterli...
Überschreiben, dynamisches Binden von
Methoden
• Überschreiben erfolgt durch
Schlüsselwort override
• Dynamisches Binden e...
Inhalt
• Einleitung
• Programmiermodell
• Sprachelemente
• Weitere Konzepte
• Zusammenfassung und Bewertung

Montag, 11. F...
Multi-Threading
object ActorDemo extends App {

val client = actor {
loop {
react {
case Start =>
server ! Request
case Re...
Metaprogrammierung
• Angabe von Annotations durch @-Zeichen auf Klassen, Methoden, Feldern,
Parametern
• Annotation => Kon...
Traits
• Mächtiger als Java-Interfaces
• Ermöglichen die Wiederverwendung von Funktionalität ohne
Vererbungszwang
• Mehrfa...
Traits - Beispiel
class Logger { def log(string: String) { println(string) } }
trait InfoPrefix extends Logger {
abstract ...
Traits - Linearisierung
• Beispiel aus dem Buch von
Martin Odersky zeigt das
Prinzip zur Vermeidung der
Mehrdeutigkeit ver...
apply()-Methode

class Formula(f: (Int => Int)) {
def apply(x: Int) = f(x)
}
object Formula {
def apply(f: (Int => Int)) =...
Inhalt
• Einleitung
• Programmiermodell
• Sprachelemente
• Weitere Konzepte
• Zusammenfassung und Bewertung

Montag, 11. F...
Zusammenfassung
• Typ-/Semikolon-Inferenz
• implizite Typ-Umwandlungen
• Mixins durch Traits
• funktionale Konzepte
• Lamb...
Bewertung
• kompakter als Java
• Lösungen sehen häufig aus, als
wären sie Bestandteil des
Sprachumfangs, dabei "nur"
Biblio...
Grafikquellen - 1
• 1) Scala-Logo: http://www.scala-lang.org/sites/default/files/
newsflash_logo.png
• 2) Titelbild: http://w...
Grafikquellen - 2
• 6) Scala-IDE for Eclipse: http://scala-ide.org/resources/images/logo.png
• 7) Netbeans-Logo: http://net...
Literaturverzeichnis
[Gar12] Garcia, Miguel: Scala.Net Compiler. http://lampwww.epfl.ch/~magarcia/
ScalaNET/. Version: Marc...
Vielen Dank für die Aufmerksamkeit!

Montag, 11. Februar 13

37
Upcoming SlideShare
Loading in...5
×

Scala

238

Published on

Seminarvortrag über die Programmiersprache Scala

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
238
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
1
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Scala

  1. 1. 1) 2) Seminar 1908 Objektorientierte Programmiersprachen and Friends Montag, 11. Februar 13 Martin Klinke Matrikelnr. 8033978 FernUniversität Hagen Lehrgebiet Programmiersysteme betreut von Dr. Daniela Keller Studiengang M. Sc. Prakt. Inf. 1
  2. 2. Inhalt • Einleitung • Programmiermodell • Sprachelemente • Weitere Konzepte • Zusammenfassung und Bewertung Montag, 11. Februar 13 2
  3. 3. Inhalt • Einleitung • Programmiermodell • Sprachelemente • Weitere Konzepte • Zusammenfassung und Bewertung Montag, 11. Februar 13 3
  4. 4. Einleitung • 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 Montag, 11. Februar 13 4
  5. 5. Inhalt • Einleitung • Programmiermodell • Sprachelemente • Weitere Konzepte • Zusammenfassung und Bewertung Montag, 11. Februar 13 5
  6. 6. Programmiermodell • Scala-Programme laufen in der JVM (auch unter .NET) 3) 4) • Quellcode in Textdateien • Java-Konventionen empfohlen, aber kein Muss • Klassen in gleichnamigen Dateien • Paketstruktur entspricht Verzeichnisstruktur • zahlreiche Bibliotheken Montag, 11. Februar 13 5) 6
  7. 7. 6) 7) 8) 9) Programmiermodell - Tools Montag, 11. Februar 13 7
  8. 8. Programmiermodell - HelloWorld object HelloWorldMain { def main(args: Array[String]) { println("Hello World!") } } object HelloWorldAppWithArgs extends App { println("Hello World! args: " + (args mkString " ")) } Montag, 11. Februar 13 8
  9. 9. Inhalt • Einleitung • Programmiermodell • Sprachelemente • Weitere Konzepte • Zusammenfassung und Bewertung Montag, 11. Februar 13 9
  10. 10. Klassen class Square(var length: Int) { def printInfo() { println("Square with length " + length) } def area() = length * length def calc3DVolume(height: Int) : Int = { area * height } } Montag, 11. Februar 13 10
  11. 11. Objekte • Objekte als Instanzen von Klassen val s = new Square(2) s.printInfo println(s.length) object Figure { var count: Int = 0 • Objekte als Singleton-/ Companion-Objekte, vgl. static-Deklaration in Java def printFiguresInfo() { println("Number of figures: " + count) } } class Figure(name: String) { Figure.count += 1 println("New figure: " + name) } Montag, 11. Februar 13 11
  12. 12. Anweisungen • Zwei Formen für Methodenaufrufe • Arithmetische Operatoren sind als Methoden implementiert • Präzedenz anhand des ersten Zeichens des Methodennamens, Tabelle val val val val a b c d = = = = 1 2 a.+(b) a + c val x = this.test(c, d) val y = this test (a, b) def test(a: Int, b: Int): Boolean = a > b • Ausname: Methodenname endet mit = (z.B. +=, <=, >= etc.) Montag, 11. Februar 13 12
  13. 13. Kontrollstrukturen • imperativ (Rückgabetyp Unit) • while def whileLoop() { var count = 0 while (count < 10) { println(count) count += 1 } } • do-while def doWhileLoop() { • funktional (Rückgabetyp nutzbar) • if-else • for • try-catch-finally • match-case var count = 0 do { println(count) count += 1 } while (count < 10) } Montag, 11. Februar 13 13
  14. 14. 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) } Montag, 11. Februar 13 14
  15. 15. 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 + ")") } Montag, 11. Februar 13 15
  16. 16. Lambda-Ausdrücke, Funktionen höherer Ordnung println((1 to 5).filter(x => x % 2 == 0)) //-> Vector(2, 4) Montag, 11. Februar 13 16
  17. 17. Immutable vs. Mutable 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 } Mutable: import scala.collection.mutable.Map class MutableDemo { val x = Map[Int, String]() x += (3 -> "three") //works! var i = 3 i = 4 //works! } Montag, 11. Februar 13 17
  18. 18. 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) } Montag, 11. Februar 13 18
  19. 19. Typsystem Montag, 11. Februar 13 Scala-Typhierarchie 19
  20. 20. Parametrischer Polymorphismus class class class class class UpperBound[T <: AnyRef] LowerBound[T >: String] NonVariant[T] Covariant[+T] 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] } Montag, 11. Februar 13 20
  21. 21. 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)" } Montag, 11. Februar 13 21
  22. 22. Überladen von Methoden • Überladen erfolgt durch Definitionen mit demselben Methodennamen und unterschiedlichen Parameterlisten def getAsString(value: Double, maxDigits: Int) = { ... } def getAsString(value: Int) = { ... } Montag, 11. Februar 13 22
  23. 23. Ü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 Montag, 11. Februar 13 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 } 23
  24. 24. Inhalt • Einleitung • Programmiermodell • Sprachelemente • Weitere Konzepte • Zusammenfassung und Bewertung Montag, 11. Februar 13 24
  25. 25. Multi-Threading object ActorDemo extends App { val client = actor { loop { react { case Start => server ! Request case Response => println( "clnt: Resp received") exit() } } } client.start server.start case object Start case object Request case object Response val server = actor { loop { react { case Request => println( "srv: Req received") sender ! Response exit() } } } Montag, 11. Februar 13 client ! Start } 25
  26. 26. 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 Montag, 11. Februar 13 26
  27. 27. Traits • Mächtiger als Java-Interfaces • Ermöglichen die Wiederverwendung von Funktionalität ohne Vererbungszwang • Mehrfachvererbung ohne die bekannten Nachteile 10) Montag, 11. Februar 13 27
  28. 28. 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 } Montag, 11. Februar 13 28
  29. 29. 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 trait trait trait class Montag, 11. Februar 13 11) Animal Furry extends Animal HasLegs extends Animal FourLegged extends HasLegs Cat extends Animal with Furry with FourLegged 29
  30. 30. 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)) Montag, 11. Februar 13 30
  31. 31. Inhalt • Einleitung • Programmiermodell • Sprachelemente • Weitere Konzepte • Zusammenfassung und Bewertung Montag, 11. Februar 13 31
  32. 32. Zusammenfassung • Typ-/Semikolon-Inferenz • implizite Typ-Umwandlungen • Mixins durch Traits • funktionale Konzepte • Lambda-Ausdrücke • Pattern Matching Montag, 11. Februar 13 32
  33. 33. 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 Montag, 11. Februar 13 • leicht zu erlernen, wenn objektorientierte und funktionale Grundkonzepte bekannt sind • sehr angenehme Sprache Bewertung: 1(Tool-Unterstützung noch nicht auf dem Niveau von Java) 33
  34. 34. 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 Montag, 11. Februar 13 34
  35. 35. 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 Montag, 11. Februar 13 35
  36. 36. 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: August 2008, 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. Second Edition. 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 Montag, 11. Februar 13 36
  37. 37. Vielen Dank für die Aufmerksamkeit! Montag, 11. Februar 13 37
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×