Aspe= Avanza@ dei Linguaggi di Programmazionecrafa/la/Scala1.pdf · • Integra la programmazione...
-
Upload
phungkhanh -
Category
Documents
-
view
214 -
download
0
Transcript of Aspe= Avanza@ dei Linguaggi di Programmazionecrafa/la/Scala1.pdf · • Integra la programmazione...
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
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…
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• …
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
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
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
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(!