scala primi passi

61
1 Scala, un linguaggio FOSS Ugo Landini Presidente, JUG Roma Thursday, June 11, 2009

Upload: ugo-landini

Post on 05-Dec-2014

731 views

Category:

Technology


2 download

DESCRIPTION

Introduzione a scala

TRANSCRIPT

Page 1: Scala Primi Passi

1

Scala, un linguaggio FOSS

Ugo Landini

Presidente, JUG Roma

Thursday, June 11, 2009

Page 2: Scala Primi Passi

2

Summary Introduzione Paradigmi e linguaggi Scala, una introduzione light Conclusioni Riferimenti Q&A

Thursday, June 11, 2009

Page 3: Scala Primi Passi

3

Introduzione

Thursday, June 11, 2009

Page 4: Scala Primi Passi

4

Chi è il JUG Roma http://www.jugroma.it Una community con:

tre anni di storia più di 750 membri

Organizzazione dei Javaday a Roma

Thursday, June 11, 2009

Page 5: Scala Primi Passi

5

Linguaggi e paradigmi

Thursday, June 11, 2009

Page 6: Scala Primi Passi

6

Thursday, June 11, 2009

Page 7: Scala Primi Passi

7

Paradigmi Il paradigma è semplicemente un modo

di classificare la conoscenza due grandi classi: linguaggi dichiarativi

ed imperativi i linguaggi funzionali sono dichiarativi:

cosa deve fare il programma I linguaggi Object Oriented sono

imperativi: come deve farlo

Thursday, June 11, 2009

Page 8: Scala Primi Passi

8

Imperativo vs Funzionale Imperativo

da Cobol a Java lavora essenzialmente modificando

variabili, i.e. locazioni di memoria Funzionale

da Lisp a Scala (Erlang e Clojure, ma anche ANTlr, sono esempi recenti) lavorano con espressioni che definiscono

valori

Thursday, June 11, 2009

Page 9: Scala Primi Passi

9

Statico vs Dinamico Un altro modo di catalogare i linguaggi è

la classe “statica” e “dinamica” Linguaggio statico

Sistema di tipi gestito a compile time Tipi associati a variabili

Linguaggio dinamico Sistema di tipi gestito a runtime Tipi associati a valori

Thursday, June 11, 2009

Page 10: Scala Primi Passi

10

SCAlable LAnguage

Thursday, June 11, 2009

Page 11: Scala Primi Passi

11

Storia di Scala Martin Odersky

versione originale di javac per conto di Sun Pizza GJ (Generic Java)

Java Generics progetta Scala nel 2001, all’EPFL, dove

insegna primi tentativi di ibridazione OO/

Funzionale con Funnel

Thursday, June 11, 2009

Page 12: Scala Primi Passi

12

Scala: un ibrido Odersky sostiene che i due paradigmi

OO e funzionale sono complementari Scala è più OO di Java, ma è anche

funzionale invoglia ad usare il paradigma funzionale

ove possibile, ma non vi vincola i due paradigmi convivono in maniera

naturale: in Scala tutto è un oggetto, comprese le funzioni

Thursday, June 11, 2009

Page 13: Scala Primi Passi

13

Scala: perchè Creare un linguaggio che scali. La

scalabilità qui è intesa soprattutto come ambito di utilizzo

Scala è applicabile (con efficacia) a piccoli problemi di scripting o grandi problemi di concorrenza

Non reinventare la ruota Utilizzare Virtual machine esistenti: con

JVM e CLR oggi ha poco senso sviluppare una VM in proprio (LLVM permettendo!)

Thursday, June 11, 2009

Page 14: Scala Primi Passi

14

Scala: perchè Sfruttare al massimo le capacità delle

moderne architetture multi-core Libreria di concorrenza Actor-based

simile ad Erlang Diminuire il codice da scrivere,

massimizzando la concisione Snello come un linguaggio dinamico, ma

veloce come uno statico (type inference) Sviluppare con semplicità DSL interni

DSL (Domain Specific Languages)

Thursday, June 11, 2009

Page 15: Scala Primi Passi

15

Scala: come provarlo Si installa molto facilmente

http://www.scala-lang.org/ Da riga di comando: scala, scalac, fsc

ricalca i tool esistenti in Java Interpretato, da shell: scala

modalità più simile a linguaggi dinamici utile per testare funzionalità del linguaggio

velocemente Il supporto negli IDE più diffusi sta

nascendo oraThursday, June 11, 2009

Page 16: Scala Primi Passi

16

Un po’ di esempi

(finalmente!)

Thursday, June 11, 2009

Page 17: Scala Primi Passi

17

Hello, scalable world!

println(“Hello, scalable world”)

Notare l’import automatico

Thursday, June 11, 2009

Page 18: Scala Primi Passi

18

Hello, scalable world!

object HelloWorld extends Application {val s = “Si, i ; non ci piacciono”println(“Hello, scalable world”)println(s)

}

Application ci evita di dichiarare il main. Application è un trait

Scrivere direttamente codice nel body è un idioma comune in scala

Non ci sono ; Val è un valore non modificabile. Notare la type inference in azione.

Thursday, June 11, 2009

Page 19: Scala Primi Passi

19

Fattoriale

def factorial(x: BigInt): BigInt =

if (x == 0) 1 else x * factorial(x-1)

Inizio definizione funzioneLista parametri

Tipo di ritorno

Assegnamento implicito al tipo di ritorno

Non ci sono graffe, è una funzione di una sola riga

Thursday, June 11, 2009

Page 20: Scala Primi Passi

20

Un semplice esempio, da imperativo a

funzionale

Thursday, June 11, 2009

Page 21: Scala Primi Passi

21

Stampa argomenti, Java style

object Args { def main(args: Array[String]) { var i = 0 while (i < args.length) { print(args(i)) print(" ") i += 1 } println }}

Scala, ma Java imperative style

un Var è un valore modificabile. Un var indica di solito la presenza di codice imperativo

Thursday, June 11, 2009

Page 22: Scala Primi Passi

22

Stampa argomenti, 2a versione

object ArgsFor { def main(args: Array[String]) { for (arg <- args) { print(arg) print(" ") } println }}

Ancora imperativo, ma un po’ meno

Notare la type inference

Thursday, June 11, 2009

Page 23: Scala Primi Passi

23

Stampa argomenti, 3a versione

object ArgsFor { def main(args: Array[String]) { args.foreach(arg => print(arg + " ")) println }}

Un iteratore interno a cui viene passato un function literal. La funzione è di fatto un valore, che può essere assegnato ad un val e riutilizzato.

Thursday, June 11, 2009

Page 24: Scala Primi Passi

24

Concisione di Scala L’ultima versione è molto più concisa ed

elegante (quando si comincia ad apprezzarne la sintassi)

val increase = (x: Int) => x+1increase(100)

la funzione increase in questo esempio è un val. Le funzioni sono first class objects in Scala: questo è un aspetto dell’integrazione OO/Funzionale tanto cara a Odersky

Thursday, June 11, 2009

Page 25: Scala Primi Passi

25

Concisione di Scalaobject ListMax { def main(args: Array[String]) {

val numeri = List(-1,2,0,-3,5) numeri.foreach(print) val positivi = numeri.filter((x:Int) => x>0) val negativi = numeri.filter(x => x<0) positivi.foreach(print)

}}

Le Collections hanno moltissime funzioni applicabili: è semplice crearne di nuove. Nell’esempio vediamo anche la short form della funzione (target typing)

Thursday, June 11, 2009

Page 26: Scala Primi Passi

26

Concisione di Scalaobject ListMax { def main(args: Array[String]) {

val numeri = List(-1,2,0,-3,5) numeri.foreach(print) val positivi = numeri.filter( _ > 0) val negativi = numeri.filter( _ < 0) positivi.foreach(print)

}} Lo stesso esempio con la versione

superconcisa (placeholder syntax)

Thursday, June 11, 2009

Page 27: Scala Primi Passi

27

Closure Quando un function literal contiene variabili

non bound (il cui valore è definito al di fuori del function literal stesso), si chiama closure

var more = 10val addMore = (x => x + more)

more è definito all’esterno del function literal e dunque va chiuso prima della valutazione

Thursday, June 11, 2009

Page 28: Scala Primi Passi

28

Scala è Object

Oriented

Thursday, June 11, 2009

Page 29: Scala Primi Passi

29

Tutto è un oggetto

val x = 1.+(2)

Equivalente a 1 + 2i . e le () possono essere omessi in molti casi

+ è un metodo

Thursday, June 11, 2009

Page 30: Scala Primi Passi

30

E tutto è ridefinibile Da grandi poteri, derivano grandi responsabilità

class CrazyInt(n:Int) { val x = n def + (that:CrazyInt):CrazyInt =

new CrazyInt( x - that.x) override def toString = x.toString }

val x = new CrazyInt(43)val y = new CrazyInt(1)println(x + y) // fa 42!

Thursday, June 11, 2009

Page 31: Scala Primi Passi

31

Traits I traits sono una caratteristica molto

interessante di Scala, che amplia notevolmente le possibilità di design

Permettono di combinare (mix-in) diverse funzionalità in una classe in maniera più snella dell’ereditarietà classica

Un Trait è simile ad un’interfaccia Java, ma con metodi concreti e attributi!

Il trucco è che super è bounded a runtime!

Thursday, June 11, 2009

Page 32: Scala Primi Passi

32

Traits Come una classe, ma la parola chiave è trait

trait Mangia { def eat() { println("Munch munch munch...") }}

trait Beve { def drink() { println("lap lap...") }}

trait invece di class

Thursday, June 11, 2009

Page 33: Scala Primi Passi

33

Traits Questo utilizzo dei traits è chiamato “widening

thin interfaces” da Oderskyval mucca = new Mucca with Mangia with Cammina

mucca eat()mucca walk()

val vitello = new Vitello with Mangia with Beve

vitello eat()vitello drink()

equivalente di implements

Thursday, June 11, 2009

Page 34: Scala Primi Passi

34

Traits e Stackable modifications I traits possono anche modificare i metodi di

una classe, e non solo aggiungere Queste modifiche possono essere impilate, in

modo da ottenere delle “stackable modifications”

Il fatto che super sia bounded a runtime è in questo caso fondamentale

I prossimi esempi sono tratti direttamente dal libro di Odersky

Thursday, June 11, 2009

Page 35: Scala Primi Passi

35

Traits e Stackable modificationsabstract 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 }}

Thursday, June 11, 2009

Page 36: Scala Primi Passi

36

Traits e Stackable modificationstrait Doubling extends IntQueue {abstract override def put(x: Int)

{ super.put(2 * x) }}

Stiamo ridefinendo un metodo di IntQueue. Che è abstract! Questo si può fare solo per i trait e non per le normali classi

Chi è super? Dipende dall’ordine in cui dichiareremo i with

Thursday, June 11, 2009

Page 37: Scala Primi Passi

37

Traits e Stackable modificationstrait Incrementing extends IntQueue {abstract override def put(x: Int)

{ super.put(x + 1) }}

val queue1 = new BasicIntQueue with Doubling with Incrementing

val queue2 = new BasicIntQueue with Incrementing with Doubling

Thursday, June 11, 2009

Page 38: Scala Primi Passi

38

Traits e Stackable modifications

queue1.put(10)queue1.get() // torna 22

queue2.put(10)queue2.get() // torna 21

L’ordine è significativo, viene eseguito prima il trait più a destra.

Thursday, June 11, 2009

Page 39: Scala Primi Passi

39

Traits e Stackable modifications Le dichiarazioni dei traits vengono linearizzate

secondo alcune regole (approssimativamente, da dx a sx)

E’ quindi possibile aggiungere comportamento con una sintassi molto concisa: in Java avremmo dovuto implementare un Decorator per ottenere qualcosa di simile

Un trait si può chiamare mixin una volta che è stato combinato (ossia super -> bounded)

Thursday, June 11, 2009

Page 40: Scala Primi Passi

40

Scala e concorrenza

Thursday, June 11, 2009

Page 41: Scala Primi Passi

41

Scala: la concorrenza Martin Odersky ultimamente ha affermato che

vuole fare di Scala il miglior linguaggio possibile per la concorrenza, in ambedue le accezioni possibili

Programmazione multithread tradizionalmente difficile con le primitive di Java

Programmazione parallela split di task “grandi”

Thursday, June 11, 2009

Page 42: Scala Primi Passi

42

Scala: la concorrenza Con Scala è molto semplice creare degli

“attori”, ossia classi che agiscono indipendentemente (ie, nel proprio thread)

object myActor extends Actor { def act() { for (i <- 1 to 10) { println("Task inutile") Thread.sleep(1000) } }}

Thursday, June 11, 2009

Page 43: Scala Primi Passi

43

Scala: la concorrenza Oppure - la regola in scala è che c’è sempre

una maniera più concisa - in questo modo

val myActor = actor { for (i <- 1 to 10) { println("Task inutile") Thread.sleep(1000) }

Thursday, June 11, 2009

Page 44: Scala Primi Passi

44

Scala: message passing Gli attori possono comunicare fra loro, senza

usare memoria condivisa o lock

myActor ! “ciao”

Il ! è l’operatore di invio messaggio

Thursday, June 11, 2009

Page 45: Scala Primi Passi

45

Scala: message receiving I messaggi vengono ignorati, a meno che non

ci sia una receive con un match corrispondente

val echoActor = actor { while (true) { receive { case msg => println("Ricevuto: "+ msg) } }

pattern matching in action

Thursday, June 11, 2009

Page 46: Scala Primi Passi

46

Scala: la concorrenza Inviare un messaggio non è blocking per

l’attore Ricevere un messaggio non vuol dire

interrompere i messaggi ricevuti risiedono in una sorta di

casella postale dell’oggetto quando viene chiamato receive i messaggi

vengono scodati ogni attore gestisce uno o più thread nativi per

poter funzionare

Thursday, June 11, 2009

Page 47: Scala Primi Passi

47

Scala: thread reuse Come alternativa è anche possibile utilizzare

il metodo react invece di receive thread reuse: strategia per conservare i thread,

che sono comunque oggetti costosi react non torna dopo il match, per cui è

necessario rientrare nel loop in qualche modo con tutti react al posto dei receive, è idealmente

possibile usare un solo thread

Thursday, June 11, 2009

Page 48: Scala Primi Passi

48

Scala: thread reusedef act() { react { case (name: String, actor: Actor) => actor ! getIp(name) act() case "EXIT" => println("Exit") case msg => println("Ricevuto: " + msg) act() } }

Thursday, June 11, 2009

Page 49: Scala Primi Passi

49

Scala: thread reuse

def act() { loop { case (name: String, actor: Actor) => actor ! getIp(name) case msg => println("Ricevuto: " + msg) } }

In maniera più concisa (questo attore non reagisce però al comando EXIT

Thursday, June 11, 2009

Page 50: Scala Primi Passi

50

Scala e DSL

Thursday, June 11, 2009

Page 51: Scala Primi Passi

51

DSL Domain Specific Languages

in sostanza, un linguaggio ad hoc che risolve un problema in maniera specifica E’ un ottimo strumento, se usato al

momento giusto http://www.martinfowler.com/bliki/

DomainSpecificLanguage.html Le caratteristiche di Scala lo rendono

perfetto per lo sviluppo di piccoli DSL case class pattern matching

Thursday, June 11, 2009

Page 52: Scala Primi Passi

52

DSL Un esempio di interprete Basic

supersemplice in circa 20 righe! Le 20 righe sono piuttosto dense di

concetti Scala... creato da Szymon Jachim

http://www.scala-lang.org/node/1403

Thursday, June 11, 2009

Page 53: Scala Primi Passi

53

class BasicClass { abstract sealed class BasicLine case class PrintLine(num: Int, s: String) extends BasicLine case class GotoLine(num: Int, to: Int) extends BasicLine

val lines = new scala.collection.mutable.HashMap[Int, BasicLine]

case class linebuilder(num: Int) { def GOTO(to: Int) = lines(num) = GotoLine(num, to) def PRINT(s: String) = lines(num) = PrintLine(num, s) }

private def gotoLine(line: Int) { lines(line) match { case PrintLine(_, s) => println(s); gotoLine(line + 10) case GotoLine(_, to) => gotoLine(to) } }

def RUN { gotoLine(lines.keys.toList.first) } implicit def int2linebuilder(i: Int) = linebuilder(i)}

Thursday, June 11, 2009

Page 54: Scala Primi Passi

54

object Main extends BasicClass {

def main(args:Array[String]) = { 10 PRINT "Scala Rulez!" 20 GOTO 10 RUN }

}

Data la classe precedente, è ora possibile scrivere del semplice codice simil BASIC all’interno di un metodo Scala:

Thursday, June 11, 2009

Page 55: Scala Primi Passi

55

Conclusioni

Thursday, June 11, 2009

Page 56: Scala Primi Passi

56

Scala Potrebbe essere il nuovo NBL (Next Big

Language) dopo Java ma anche no

Investimento rischioso? E’ Open Source (licenza Scala, simil BSD) e

gira sulla JVM: si ha accesso a tutto quello a cui si ha accesso con Java Non è semplice da imparare, soprattutto per

chi non è già addentro il paradigma funzionale

Thursday, June 11, 2009

Page 57: Scala Primi Passi

57

Integrazione con Java Usare Java da Scala è semplicissimo e

straightforward Usare Scala da Java sarà invece più comune

per i progetti che adotteranno scala pian piano (DSL, Actors, ecc.) ma non al 100%

E’ relativamente semplice utilizzare classi e traits Scala da Java, il mapping è diretto nella maggior parte dei casi David Pollack (autore di Lift) dice: Scala in

fondo non è altro che un’altra libreria di Java!

Thursday, June 11, 2009

Page 58: Scala Primi Passi

58

Una scommessa NBL potrebbe non essere ancora nato, ma è

molto probabile che somiglierà più a Scala che a Java

La comunità di Scala è in fermento: molti Alpha geek lo stanno valutando/utilizzando

Twitter, per esempio diversi libri già pubblicati o in beta/roughcut

(nella top ten del JavaOne, ben 3 libri sono su Scala!) Lift (framework web, simil Rails) nuovi framework in uscita

Thursday, June 11, 2009

Page 59: Scala Primi Passi

59

Riferimenti

Thursday, June 11, 2009

Page 60: Scala Primi Passi

60

Link e riferimenti Specifiche

Odersky, Martin. “The Scala Language Specification”, EPFL. http://www.scala-lang.org/docu/files/ScalaReference.pdf

Libri Odersky, Martin. “The Scala Programming Language”.

http://www.artima.com/shop/programming_in_scala Wampler, Dean. “Programming Scala”. http://

programming-scala.labs.oreilly.com/ Landini, Ugo. “Programmare in Scala”. http://

scala.ugolandini.com/

Thursday, June 11, 2009

Page 61: Scala Primi Passi

61

Q&A

Thursday, June 11, 2009