scala primi passi

Post on 05-Dec-2014

731 Views

Category:

Technology

2 Downloads

Preview:

Click to see full reader

DESCRIPTION

Introduzione a scala

TRANSCRIPT

1

Scala, un linguaggio FOSS

Ugo Landini

Presidente, JUG Roma

Thursday, June 11, 2009

2

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

Thursday, June 11, 2009

3

Introduzione

Thursday, June 11, 2009

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

5

Linguaggi e paradigmi

Thursday, June 11, 2009

6

Thursday, June 11, 2009

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

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

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

10

SCAlable LAnguage

Thursday, June 11, 2009

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

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

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

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

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

16

Un po’ di esempi

(finalmente!)

Thursday, June 11, 2009

17

Hello, scalable world!

println(“Hello, scalable world”)

Notare l’import automatico

Thursday, June 11, 2009

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

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

20

Un semplice esempio, da imperativo a

funzionale

Thursday, June 11, 2009

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

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

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

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

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

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

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

28

Scala è Object

Oriented

Thursday, June 11, 2009

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

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

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

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

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

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

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

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

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

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

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

40

Scala e concorrenza

Thursday, June 11, 2009

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

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

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

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

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

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

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

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

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

50

Scala e DSL

Thursday, June 11, 2009

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

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

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

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

55

Conclusioni

Thursday, June 11, 2009

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

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

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

59

Riferimenti

Thursday, June 11, 2009

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

61

Q&A

Thursday, June 11, 2009

top related