Aspe= Avanza@ dei Linguaggi di Programmazionecrafa/la/Scala1.pdf · • Integra la programmazione...

7
S.Crafa UniPd AA18/19 comunità molto dinamica: even$, formazione, blog, social Aspe= Avanza@ dei Linguaggi di Programmazione hDp://www.scala-lang.org/ M.Odersky, L.Spoon, B.Venners Programming in Scala Ar@ma ed. hDp://www.meetup.com/it/Scala-by-the-Lagoon S.Crafa UniPd AA18/19 S.Crafa UniPd AA18/19 Scala: da dove viene? 1996-1999 : Pizza 1998 – 2000: GJ, Java generics, javac (“make Java be)er) 2003 – 2006: The Scala “Experiment” 2006 – 2009: An industrial strength programming language (“make a be)er Java) inizia il distacco dai linguaggi staticamente tipati S.Crafa UniPd AA18/19 3.0 closures e comprehensions Scala Java Smalltalk Eiffel Ruby C # ML Haskell OCaml, OHaskell PLT-Scheme sintassi , aspetti di base, librerie codice conciso FP FP+OOP Uniform object model Uniform access principle Erlang costrutti di concorrenza Java8 X10

Transcript of Aspe= Avanza@ dei Linguaggi di Programmazionecrafa/la/Scala1.pdf · • Integra la programmazione...

Page 1: Aspe= Avanza@ dei Linguaggi di Programmazionecrafa/la/Scala1.pdf · • Integra la programmazione funzionale e object-oriented – un modello ad ogge= uniforme – funzioni higher-order

S.CrafaUniPdAA18/19

comunitàmoltodinamica:

even$,formazione,blog,social

Aspe=Avanza@deiLinguaggidiProgrammazione

hDp://www.scala-lang.org/M.Odersky,L.Spoon,B.VennersProgramminginScalaAr@maed.

hDp://www.meetup.com/it/Scala-by-the-LagoonS.CrafaUniPdAA18/19

S.CrafaUniPdAA18/19

Scala:dadoveviene?

1996-1999:Pizza1998–2000:GJ,Javagenerics,javac

(“makeJavabe)er”)

2003–2006:TheScala“Experiment”2006–2009:Anindustrialstrengthprogramminglanguage

(“makeabe)erJava”)

inizia il distacco dai linguaggi staticamente tipati

S.CrafaUniPdAA18/19

3.0 closuresecomprehensions

Scala

Java

Smalltalk

Eiffel

Ruby

C #

ML Haskell

OCaml, OHaskell PLT-Scheme

sintassi , aspetti di base,

librerie

codice conciso

FP

FP+OOP

Uniform object model

Uniform access

principle

Erlang

costrutti di concorrenza

Java8 X10

Page 2: Aspe= Avanza@ dei Linguaggi di Programmazionecrafa/la/Scala1.pdf · • Integra la programmazione funzionale e object-oriented – un modello ad ogge= uniforme – funzioni higher-order

S.CrafaUniPdAA18/19

Scala:cos’è?•  Unlinguaggiosta(camente(pato

–  maconunasintassileggera

•  Integralaprogrammazionefunzionaleeobject-oriented–  unmodelloadogge=uniforme–  funzionihigher-orderepaDernmatching–  nuovimodidicomporreeastrarreespressioni

•  Èunlinguaggioscalabile:–  conglistessicostru=siscrivonoagevolmentepiccoliscriptegrandiprogrammi–  èfacilecrearedomain-specificlanguagesmoltoricchi(es.ADori)

•  Supportoefficaceallaprogrammazioneconcorrente:– futures/promiseseactorssonostrumen@poten@perorganizzaresistemiconcorren@adunaltolivellodiastrazione

S.CrafaUniPdAA18/19

Scala:siusa?•  GirasuJavaVirtualMachine:Scalacopilainbytecode

•  TypeinferenceavanzatopermeDesta@ctypingnonverboso

S.CrafaUniPdAA18/19

scala> class Person(val name: String, val age: Int) { | override def toString = s"$name ($age)" | } defined class Person scala> def underagePeopleNames(persons: List[Person]) = { | for (person <- persons; if person.age < 18) | yield person.name | } underagePeopleNames: (persons: List[Person])List[String] scala> def createRandomPeople() = { | val names = List("Alice", "Bob", "Carol", | "Dave", "Eve", "Frank") | for (name <- names) yield { | val age = (Random.nextGaussian()*8 + 20).toInt | new Person(name, age) | } | } createRandomPeople: ()List[Person] scala> val people = createRandomPeople() people:List[Person]=List(Alice(16),Bob(16),Carol(19),Dave(18),Eve.. scala> underagePeopleNames(people) res1: List[String] = List(Alice, Bob, Frank)

S.CrafaUniPdAA18/19

Scala:siusa?•  GirasuJavaVirtualMachine:Scalacopilainbytecode

•  TypeinferenceavanzatopermeDesta@ctypingnonverboso

•  ÈcompletamenteinteroperabileconJava…

Page 3: Aspe= Avanza@ dei Linguaggi di Programmazionecrafa/la/Scala1.pdf · • Integra la programmazione funzionale e object-oriented – un modello ad ogge= uniforme – funzioni higher-order

S.CrafaUniPdAA18/19

Completainteroperabilita’conJava

class Author(val firstName: String, val lastName: String) extends Comparable[Author] {

override def compareTo(that: Author) = {

val lastNameComp = this.lastName compareTo that.lastName if (lastNameComp != 0) lastNameComp else this.firstName compareTo that.firstName } } object Author { def loadAuthFromFile(file: java.io.File): List[Author] = ... }

Author.scala Java’sComparable<T> interface

S.CrafaUniPdAA18/19

Completainteroperabilita’conJava

import static scala.collection.JavaConversions.asJavaCollection; public class App { public List<Author> loadAuthFromFile(File file) { return new ArrayList<Author>( asJavaCollection(Author.loadAuthFromFile(file))); } public void sortAuth(List<Author> ats){Collections.sort(ats);} public void displaySortedAuthors(File file) { List<Author> authors = loadAuthFromFile(file); sortAuth(authors); for (Author a : authors) { System.out.println(a.lastName() + ", " + a.firstName()); } }}

App.java convertsfromScalacollec@ons

toJavacollec@ons

S.CrafaUniPdAA18/19

Scala:siusa?•  GirasuJavaVirtualMachine:Scalacopilainbytecode

•  TypeinferenceavanzatopermeDesta@ctypingnonverboso

•  ÈcompletamenteinteroperabileconJava…

•  C’èuncompilatoreper.NET

–  .NEThauntypesystemmoltodiversoesupportagia’linguaggiconingredien@funzionali:C#,F#

–  subrowser(Scala.jscompilainJavaScript)

–  DoDy,thenextgenera@onScalacompiler…Hydra…

–  Scalana@ve:compilaScalacodeinLLVMperna@veexecu@on

•  IDE:SBT(SimpleBuildTool),pluginperIntelliJ,Sublime,Eclipse

•  REPL(Read-Eval-Print-Loop)

S.CrafaUniPdAA18/19

Scala:siusa?

Scala-basedtechnologies:•  reac(vepla@orm(Lightbend)•  Akka(Actors),microservices,streams,reac@vesystems•  ApacheSpark(Clustercompu@ngandDataanalysis),

•  ApacheKama,Flink(streamprocessing,fastdata)

•  Scala.js(integra@onwithJavaScript,compilesScalacodetoJavaScript)

•  ScalaonAndroid•  …

Page 4: Aspe= Avanza@ dei Linguaggi di Programmazionecrafa/la/Scala1.pdf · • Integra la programmazione funzionale e object-oriented – un modello ad ogge= uniforme – funzioni higher-order

S.CrafaUniPdAA18/19

Scala:chilousa?

Iservizinelback-enderanoscri=inRuby,poisonomigra@inScala

IlmodelloadaCorihapermessodiscalareilconcurrentmessagequeuesystem

adungrannumerodiuten(

Scalatomeetthedemandingreal-@mecontentsearching,indexingorupda@ng.

Usingactorstheywereabletoreducethesearchindexbuild@mefrom20hourstojustone.

RequestpaDerns,hesays,arehardtopredictsoTHEABILITYTOEASILYSCALETHESERVICESWASESSENTIAL.

S.CrafaUniPdAA18/19

ScalavieneadoDatoperchésidimostra

ada)oallaprogrammazioneconcorrente

Perché?

1)  Supportabenelaprogrammazionefunzionale…

–  funzionihigherorder,paDernmatching,da@immutabili

manellinguaggiononcisono(nonpiù!)primi$vediconcorrenza!

S.CrafaUniPdAA18/19

PerchélaFPècrucialeperlaprogrammazioneconcorrente?

•  Laconcorrenzaèdifficile,moltodifficile–  Dataraces,deadlocks,sideeffectsinmemoria,…

•  Mo@vo:interleavingnon-determinis@codeithread–  Interleavingdiversihannoeffe>diversisullostatodella

memoriacondivisa

L’unico modo efficace di lavorare con strutture dati immutabili è la programmazione funzionale

Eliminando variabili condivise eliminiamo concurrency hazards

quelle con valore modificabile!!

S.CrafaUniPdAA18/19

ScalavieneadoDatoperchésidimostra

ada)oallaprogrammazioneconcorrente

Perché?

1)  Supportabenelaprogrammazionefunzionale…

2)  lafainteragireinmodoefficaceconla

programmazioneOO Futures Actors

Si possono definire DSLs per la concorrenza e il parallelismo:

Parallel Graph Processing, Parallel Collections, Parallel DSLs

Page 5: Aspe= Avanza@ dei Linguaggi di Programmazionecrafa/la/Scala1.pdf · • Integra la programmazione funzionale e object-oriented – un modello ad ogge= uniforme – funzioni higher-order

S.CrafaUniPdAA18/19

Futures

val x = future { someExpensiveComputation() } val y = future { someOtherExpensiveComputation() } val z = for (a <- x; b <- y) yield a*b for (c <- z) println("Result: " + c) println("Meanwhile, the main thread goes on!")

print(“Meanwhile...”)

:Future[T] :T

someExpensiveComp

someOtherExpensiveComp

a*b

print(“Result”+c)

S.CrafaUniPdAA18/19

Esempidicodice

codice conciso, chiaro, elegante

1) Hello, World!

S.CrafaUniPdAA18/19

HelloWorldclass HelloWorld { public static void main(String[] args){ System.out.println(“Hello, World!”); } }

println(“Hello, World!”)

Scalainterpreter:• unashellinteraMvachevalutaespressioni(integratainIDE)• interpretagliscript:sequenzadiistruzionidentrounfilehello.scalacheeseguoconilcomando>scala hello.scala

unoscriptterminaconun’espressione-risultatoun’applicazioneèuninsiemedidefinizioni

S.CrafaUniPdAA18/19

HelloWorldclass HelloWorld { public static void main(String[] args){ System.out.println(“Hello, World!”); } }

object HelloWorld { def main(args: Array[String]){ println(“Hello World!”) } }

Singletonobject:classeconunasolaistanza

No@podiritorno:Unit No;

Array[T]èunaclassegenerica

•  Sicompilailfilecon> scalac Hello.scala •  VieneprodoDoHello.classchecon@enestandardJavabytecode•  Sieseguecon> scala HelloWorld

Page 6: Aspe= Avanza@ dei Linguaggi di Programmazionecrafa/la/Scala1.pdf · • Integra la programmazione funzionale e object-oriented – un modello ad ogge= uniforme – funzioni higher-order

S.CrafaUniPdAA18/19

Esempidicodice

1) Hello, World!

2) Definire una classe molto semplice

codice conciso, chiaro, elegante

S.CrafaUniPdAA18/19

Unaclassepublic class Person { public final String name; public int age; Person(String name, int age) { this.name = name; this.age = age; } }

class Person( val name: String, var age: Int) {}

Immutablevalueread-onlyvariable

val b = new Person(“Pippo”,10)

println(b.age)

S.CrafaUniPdAA18/19

variabili:valoppurevar?•  Due@pidivariabili:

val msg = “Hello world”

var i=0

•  iparametrideimetodi/funzionisonovals

–  ivalorideiparametrinoncambiano,percostruzione!–  iparametrisonopassa@pervalore,comeinJava

immutable variable non può essere modificata

Ogni volta che si può, meglio usare vals,

è più facile ragionare su ciò che si è scritto!

FuncIonalStyle

mutable variable

S.CrafaUniPdAA18/19

Esempidicodice

3)DatounelencodiPersone,produrreunelencodimaggiorenniedunelencodiminorenni

codice conciso, chiaro, elegante

1) Hello, World!

2) Definire una classe molto semplice

Page 7: Aspe= Avanza@ dei Linguaggi di Programmazionecrafa/la/Scala1.pdf · • Integra la programmazione funzionale e object-oriented – un modello ad ogge= uniforme – funzioni higher-order

S.CrafaUniPdAA18/19

importjava.util.ArrayList;...Person[]people=...;Person[]minors;Person[]adults;ArrayList<Person>minorsList=newArrayList<Person>();ArrayList<Person>adultsList=newArrayList<Person>();

for(inti=0;i<people.length;i++)if(people[i].age<18)minorsList.add(people[i]);elseadultsList.add(people[i]);

minors=minorsList.toArray(people);adults=adultsList.toArray(people);

val people: Array[Person] = ... val (minors, adults) = people partition (_.age < 18)

Lista implementata con un resizable array

Restituisce un array del tipo del parametro

S.CrafaUniPdAA18/19

val people: Array[Person] val (minors, adults) = people partition (_.age < 18)

È un metodo della classe Array[T]

def partition (p: T=>Boolean) : (Array[T], Array[T])

Invocato con notazione infissa

Scorre gli elementi dell’array this e restituisce una coppia di array

S.CrafaUniPdAA18/19

val people: Array[Person] val (minors, adults) = people partition (_.age < 18)

È un metodo della classe Array[T]

def partition(p: T=>Boolean):(Array[T], Array[T])

È un valore funzione,

def fun(x){ retrun x.age < 18 }

un anonymous function literal

x => x.age < 18

i(pisonoinferi(! à la Ruby e Haskell

S.CrafaUniPdAA18/19

val people: Array[Person] val (minors, adults) = people partition (_.age < 18)

x => x.age < 18

scala> val prova = Array (1,2,3,4) prova: Array[Int]=Array(1,2,3,4) scala> val (x,y)=prova partition (_<2) x: Array[Int] = Array(1) y: Array[Int] = Array(2,3,4)

È un pattern matching!

È un metodo della classe Array[T]

def partition(p: T=>Boolean):(Array[T], Array[T])

i(pisonoinferi(!