© logica 2008. tous droits réservés une introduction à michel daviot
TRANSCRIPT
![Page 1: © Logica 2008. Tous droits réservés Une Introduction à Michel Daviot](https://reader036.vdocuments.mx/reader036/viewer/2022062712/56649c8a5503460f949443de/html5/thumbnails/1.jpg)
© Logica 2008. Tous droits réservés
Une Introduction àMichel Daviot
![Page 2: © Logica 2008. Tous droits réservés Une Introduction à Michel Daviot](https://reader036.vdocuments.mx/reader036/viewer/2022062712/56649c8a5503460f949443de/html5/thumbnails/2.jpg)
N°220 mai 2010 Une introduction à Scala
2
3
Plan
Scala, c’est quoi ? Pourquoi Scala ?1
Syntaxe Java améliorée
Programmation fonctionnelle
4 Les Traits
5 Pattern Matching
6 Acteurs et immuabilité
8 Interopérabilité avec Java
7 XML
![Page 3: © Logica 2008. Tous droits réservés Une Introduction à Michel Daviot](https://reader036.vdocuments.mx/reader036/viewer/2022062712/56649c8a5503460f949443de/html5/thumbnails/3.jpg)
N°3Une introduction à Scala
Qui utilise Scala ?
http://www.scala-lang.org/node/1658
![Page 4: © Logica 2008. Tous droits réservés Une Introduction à Michel Daviot](https://reader036.vdocuments.mx/reader036/viewer/2022062712/56649c8a5503460f949443de/html5/thumbnails/4.jpg)
N°3Une introduction à Scala
Un langage qui émerge lentement
http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html
Avril 2010
![Page 5: © Logica 2008. Tous droits réservés Une Introduction à Michel Daviot](https://reader036.vdocuments.mx/reader036/viewer/2022062712/56649c8a5503460f949443de/html5/thumbnails/5.jpg)
N°3Une introduction à Scala
Scala, c’est quoi ?
•Scalable Language, inventé en 2003 par Martin Odersky
•Langage hybride : fonctionnel et objet
•Code concis et expressif; fort niveau d’abstraction (plus pour moins)
•Fortement typé (typage statique)
•Compatible avec Java, exécuté dans la JVM
![Page 6: © Logica 2008. Tous droits réservés Une Introduction à Michel Daviot](https://reader036.vdocuments.mx/reader036/viewer/2022062712/56649c8a5503460f949443de/html5/thumbnails/6.jpg)
N°3Une introduction à Scala
La Syntaxe
•def, var et val (immuable)
•Éliminer l’inutile . () ; et return DSL"(S|s)cala".r findAllIn "Scala is scalable"
•Typage statique, implicite (inférence)def add(i:Int, j:Int) = i + jval i=add(3,5)
•Chaines « magiques » regexp, html"""(\w+)://([^/:]+)(:\d+)?/(.*) """
•Retour multipledef div(a:Int, b:Int)= (a/b, a%b)
list.partition(_.age>18)
![Page 7: © Logica 2008. Tous droits réservés Une Introduction à Michel Daviot](https://reader036.vdocuments.mx/reader036/viewer/2022062712/56649c8a5503460f949443de/html5/thumbnails/7.jpg)
N°3Une introduction à Scala
La Syntaxe (2)
•Classes « intelligentes »
class Person (val id : Int=0, var name : String="") {
override def toString = name
}
val p=new Person(3)
p.name="Jacques"
println(p)
![Page 8: © Logica 2008. Tous droits réservés Une Introduction à Michel Daviot](https://reader036.vdocuments.mx/reader036/viewer/2022062712/56649c8a5503460f949443de/html5/thumbnails/8.jpg)
Programmation fonctionnelle
•Toute fonction est un objetdef square(x:Int)=x*x
List(1,2,3,4,5).map(square)
•Paramètres anonymesList(1,2,3,4,5).filter( _ > 2)
•Attention aux excès (au début)
(0 /: List(1,2,3,4,5)) { _ + _ }
N°3Une introduction à Scala
![Page 9: © Logica 2008. Tous droits réservés Une Introduction à Michel Daviot](https://reader036.vdocuments.mx/reader036/viewer/2022062712/56649c8a5503460f949443de/html5/thumbnails/9.jpg)
N°3Une introduction à Scala
Les traits
•Utilisable comme interface Javatrait Observer { def receiveAlert(s: String) }
•Permet les Mixins
trait Observable { private var observers : List[Observer]=Nil
def addObserver(o:Observer){observers = o::observers}
def alert(msg : String) { observers.foreach(_.receiveAlert(msg)) }}
![Page 10: © Logica 2008. Tous droits réservés Une Introduction à Michel Daviot](https://reader036.vdocuments.mx/reader036/viewer/2022062712/56649c8a5503460f949443de/html5/thumbnails/10.jpg)
N°3Une introduction à Scala
Les traits (2) : Mixin sur une classe
class WatchedPerson() extends Person() with Observable {
def changeName(n:String) { name=n; super.alert("new name "+n) }
}
val p=new WatchedPerson
val o=new Observer{
def receiveAlert(s : String) { println(s)}
}
p.addObserver(o)
p changeName "Dominique"
![Page 11: © Logica 2008. Tous droits réservés Une Introduction à Michel Daviot](https://reader036.vdocuments.mx/reader036/viewer/2022062712/56649c8a5503460f949443de/html5/thumbnails/11.jpg)
N°3Une introduction à Scala
Les traits (3) : Mixin sur une instance
val p=new Person with Observable
p.addObserver(o)
p changeName "toto"
![Page 12: © Logica 2008. Tous droits réservés Une Introduction à Michel Daviot](https://reader036.vdocuments.mx/reader036/viewer/2022062712/56649c8a5503460f949443de/html5/thumbnails/12.jpg)
N°3Une introduction à Scala
Pattern matching : regexp
val url="http://www.allocine.fr:8080/seance/"
val regexp="""(\w+)://([^/:]+)(:\d+)?/(.*)""".r
url match {
case regexp(protocol, host, port, path) => printf("protocol %s, host %s, port %s, path
%s\n", protocol, host, port, path)
case _ => println("does not match")
}
![Page 13: © Logica 2008. Tous droits réservés Une Introduction à Michel Daviot](https://reader036.vdocuments.mx/reader036/viewer/2022062712/56649c8a5503460f949443de/html5/thumbnails/13.jpg)
N°3Une introduction à Scala
Pattern matching : listes et tuples
def test(x:Any) = {
x match {
case List(a,b,c) => "3 elts"
case (a:Int, b:Int) => a+"&"+b
case _ => "no idea"
}}
println(test(List(1,2,3)))
println(test(2,3))
println(test("toto"))
![Page 14: © Logica 2008. Tous droits réservés Une Introduction à Michel Daviot](https://reader036.vdocuments.mx/reader036/viewer/2022062712/56649c8a5503460f949443de/html5/thumbnails/14.jpg)
Acteurs et immuabilité : situation initiale (mono thread)
def slowFibo(n:Int) : Int = if(n<=2) 1 else slowFibo(n-1)+slowFibo(n-2)
def time(f: => Int) = {
val t=System.currentTimeMillis
(f, System.currentTimeMillis - t)
}
def sum(n:Int, f: Int => Int) = (0 /: (1 to n).map(f(_))) (_ + _)
time(sum(40,slowFibo))
No. 14
![Page 15: © Logica 2008. Tous droits réservés Une Introduction à Michel Daviot](https://reader036.vdocuments.mx/reader036/viewer/2022062712/56649c8a5503460f949443de/html5/thumbnails/15.jpg)
Acteurs et immuabilité
def actorSum(n:Int, f: Int => Int) = {
val caller=self
for (i <- 1 to n) {
actor { caller ! slowFibo(i) }
}
var sum=0
for (i <- 1 to n) {
receive {
case f : Int => sum = sum + f
}}
sum
}
No. 15
![Page 16: © Logica 2008. Tous droits réservés Une Introduction à Michel Daviot](https://reader036.vdocuments.mx/reader036/viewer/2022062712/56649c8a5503460f949443de/html5/thumbnails/16.jpg)
N°3Une introduction à Scala
Résultats de l’utilisation des acteurs
(701408732,6020)
(701408732,3776)
![Page 17: © Logica 2008. Tous droits réservés Une Introduction à Michel Daviot](https://reader036.vdocuments.mx/reader036/viewer/2022062712/56649c8a5503460f949443de/html5/thumbnails/17.jpg)
N°3Une introduction à Scala
Acteurs et immuabilité
Applications :•Requêtes réseaux•Calcul distribué•Algorithmes MapReduce
•Un code très simple par rapport aux Threads•Pas de synchronize donc pas de risque de deadlock•Possible si on utilise des immuables (val)
![Page 18: © Logica 2008. Tous droits réservés Une Introduction à Michel Daviot](https://reader036.vdocuments.mx/reader036/viewer/2022062712/56649c8a5503460f949443de/html5/thumbnails/18.jpg)
N°3Une introduction à Scala
XML
•Simple à produire :val content= <data>some</data> <data tag='important'> more</data> val name="logica" val r= <root xmlns='urn:com.logica.ns'> <elt value={name}/>{content}</root>
•Assez simple à parser :r \\ "data" foreach {e=> println(e.text) }r \\ "data" foreach println
•Limitation : moins élégant pour filtrer sur les attributs
![Page 19: © Logica 2008. Tous droits réservés Une Introduction à Michel Daviot](https://reader036.vdocuments.mx/reader036/viewer/2022062712/56649c8a5503460f949443de/html5/thumbnails/19.jpg)
N°3Une introduction à Scala
Interopérabilité avec Java
•Support de la double dépendance à la compilation
•Implémentation d’un trait
•En Scala :trait Observer { def receiveAlert(s: String) }
•En Java :public class JavaObserver implements Observer { @Override public void receiveAlert(String s) { System.out.println(s); }}
![Page 20: © Logica 2008. Tous droits réservés Une Introduction à Michel Daviot](https://reader036.vdocuments.mx/reader036/viewer/2022062712/56649c8a5503460f949443de/html5/thumbnails/20.jpg)
N°3Une introduction à Scala
Conclusion : quelques citations
•James Gosling (Java) : During a meeting in the Community Corner, a participant asked an interesting question: "Which Programming Language would you use now on top of JVM, except Java?“
•James Strachan (Groovy, 07/2009) : I'm very impressed with it ! I can honestly say if someone had shown me the Programming Scala book by by Martin Odersky, Lex Spoon & Bill Venners back in 2003 I'd probably have never created Groovy.
•Charles Nutter (JRuby) : Scala is most likely candidate to replace Java, compared to Groovy and JRuby. While Scala is not a dynamic language, it has many of the characteristics of popular dynamic languages, through its rich and flexible type system, its sparse and clean syntax, and its marriage of functional and object paradigms.
![Page 21: © Logica 2008. Tous droits réservés Une Introduction à Michel Daviot](https://reader036.vdocuments.mx/reader036/viewer/2022062712/56649c8a5503460f949443de/html5/thumbnails/21.jpg)
Pour essayer
N°3Une introduction à Scala
http://www.simplyscala.com/ : en ligne, rien à télécharger
![Page 22: © Logica 2008. Tous droits réservés Une Introduction à Michel Daviot](https://reader036.vdocuments.mx/reader036/viewer/2022062712/56649c8a5503460f949443de/html5/thumbnails/22.jpg)
Pour essayer (2) : interpréteur en ligne de commande
N°3Une introduction à Scala
http://www.scala-lang.org/downloads
![Page 23: © Logica 2008. Tous droits réservés Une Introduction à Michel Daviot](https://reader036.vdocuments.mx/reader036/viewer/2022062712/56649c8a5503460f949443de/html5/thumbnails/23.jpg)
Pour essayer (3) : Eclipse
N°3Une introduction à Scala
http://download.scala-ide.org/
![Page 24: © Logica 2008. Tous droits réservés Une Introduction à Michel Daviot](https://reader036.vdocuments.mx/reader036/viewer/2022062712/56649c8a5503460f949443de/html5/thumbnails/24.jpg)
No. 24Une introduction à Scala
or
![Page 25: © Logica 2008. Tous droits réservés Une Introduction à Michel Daviot](https://reader036.vdocuments.mx/reader036/viewer/2022062712/56649c8a5503460f949443de/html5/thumbnails/25.jpg)
Programmation fonctionnelle (2)
•Le currydef sum(i:Int)(j:Int) = i + jdef s2 =sum(2) _val k=s2(9)
•Closuresdef repeat(n : Int, closure : Int => Unit) { for (i <- 1 to n) {closure(i)}}
var context=new StringBuilderrepeat(5, {i => context.append(i)})println(context.toString)
ou aussi : (1 to 5) mkString(",")
N°3Une introduction à Scala
![Page 26: © Logica 2008. Tous droits réservés Une Introduction à Michel Daviot](https://reader036.vdocuments.mx/reader036/viewer/2022062712/56649c8a5503460f949443de/html5/thumbnails/26.jpg)
Programmation fonctionnelle
N°3Une introduction à Scala
import java.io._
def write(file : String)(code : PrintWriter => Unit) { val writer=new PrintWriter(file) try { code(writer) } catch { case e : IOException => println(e.getMessage) } finally { writer.close }}
write("toto.txt"){pw => pw.write("hello")}