Conception d'Applications
       Interactives :
 Applications Web et JEE
            Séance #5
     Scala / Play! Framework
Langages alternatives pour la JVM
Langages alternatives pour la JVM



                 Java ≠ JVM
● Java : Langage qui compile vers du bytecode
● JVM : Machine virtuelle qui exécute du bytecode
La JVM en tant que plate-forme
● Build once, run everywhere
  ○ Des implémentations de JVM pour la plupart du
    hardware et OS
  ○ Bytecode format pivot indépendant de la plate-forme


● Tendance à s'affranchir de l'OS
  ○ Côté client : navigateur comme plate-forme
  ○ Côté serveur : JVM comme plate-forme
Pourquoi des nouveaux langages
         If all you have is a hammer,
          everything looks like a nail

Java est un très bon langage généraliste, mais
pas la solution ultime
● Scripting ?
● Programmation fonctionnelle ?
● Simplification et réduction du boilerplate ?
Pourquoi des nouveaux langages
sur la JVM
● Le target est le bytecode
  ○ Pas besoin d'implémenter la compilation vers le
    format natif de chaque OS


● Profiter de l'écosystème Java
  ○ Bibliothèques, serveurs, outils...
  ○ Courbe d'adoption moins ardue


● Support pour langages à typage dynamique
  ○ JSR 292, invokedynamic
  ○ Intégrée à la JVM depuis Java 1.7
Quels sont ces langages ?



● Des langages nouveaux :
  ○ Clojure, Groovy, Scala, Ceylon, Kotlin...



● Des implémentations d'autres langages
  ○ JRuby (Ruby), Jython (Python), Rhino (JS), Elastic
    COBOL (Cobol), JGNAT (Ada), Luaj (Lua)...
Jython
Interprète Python écrit en Java, créé en 1997

●   Compilation de code Python en bytecode
●   Héritage de classes Java par des classes Python
●   Scripting de code Python dans un programme Java
●   Utilisation d'objets Java dans du code Python

Très utilisé pour prototypage, scripting et exploration des
classes Java


                http://www.jython.org/
JRuby
Interprète Ruby écrit en Java, créé en 2001

● Equivalente de Jython pout Ruby
● Capable de faire tourner Rails
● Plus rapide que l'implémentation de
  référence
   ○   Option JIT


                http://www.jruby.org/
Groovy
Langage de POO destiné à la plate-forme Java
● Inspiré de Python, Ruby et Smalltalk
● Syntaxe très proche de Java
● Compilé
   ○ soit à la volée dynamiquement
   ○ soit classiquement vers bytecode
● Typages statique et dynamique
● Support natif pour listes, maps, et expressions
  régulières
● Fermetures ou clôtures (closures)
● Surcharge des opérateurs

            http://groovy.codehaus.org/
Ceylon
Nouveau langage pour la JVM par RedHat
● "Java tel qu'ils serait si il avait été développé
  aujourd'hui"
● Typage statique
  ○ Types union et intersection
● Syntaxe régulière
  ○ Sucre syntactique ajouté
● Modulaire
  ○ Dépôt Ceylon Herd


             http://www.ceylon-lang.org/
Scala
Langage de programmation multi-paradigme
  ○ Programmations orientée objet et fonctionnelle


● Typage statique, syntaxe concise
● Compilé vers bytecode
● Intéropérabilité avec le code Java

           http://www.scala-lang.org/
Le développeur multi-lingue
● Environnement JVM en mouvement continu
  ○ Nouveaux langages
  ○ Nouveaux frameworks
  ○ Nouveaux outils


● Ne pas se tenir à jour, ne pas apprendre =
  stagner, régresser.
  ○ Un nouveau langage par an
  ○ Un nouveau framework tous les 3 mois
Introduction à Scala
Scala
Langage de programmation multi-paradigme
  ○ Programmations orientée objet et fonctionnelle


● Typage statique, syntaxe concise
● Compilé vers bytecode
● Intéropérabilité avec le code Java

           http://www.scala-lang.org/
La console REPL
REPL : Read Event Print Loop

● Console intéractive pour l'interprétation de
  Scala
    horacio@horacio-laptop:$ scala
    Welcome to Scala version 2.10.0-RC3 (Java HotSpot(TM)
    Server VM, Java 1.6.0_31).
    Type in expressions to have them evaluated.
    Type :help for more information.

    scala> val revolution : Int = 1789
    revolution: Int = 1789

    scala>
val et var
● var : variables (mutables)
● val : valeurs (constantes, inmutables)

    scala> val revolution : Int = 1789
    revolution: Int = 1789

    scala> revolution = 1917
    <console>:8: error: reassignment to val
           revolution = 1917
                      ^
    scala> var variable : String = "Ma variable"
    variable: String = Ma variable

    scala> variable = "Notre variable"
    variable: String = Notre variable

    scala>
Classes
● Pas besoin de déclarer les attributs privés et
  les getters et setters
   ○ Le constructeur suffit


● Constructeur avec des valeurs par défaut
     scala> case class Employee( name:String="guest", age:
     Int=30, company:String = "DevCode" )
     defined class Employee

     scala> val guest = Employee()
     guest: Employee = Employee(guest,30,DevCode)

     scala> val guestAge = guest.age
     guestAge: Int = 30

     scala>
Classes
● Définition explicite des paramètres lors des appels aux
  méthodes

● Méthode copy pour créer des copies des objets

     scala> case class Employee( name:String="guest", age:
     Int=30, company:String = "DevCode" )
     defined class Employee

     scala> val luke = Employee("Luke", company="LucasArt")
     luke: Employee = Employee(Luke,30,LucasArt)

     scala> val yoda = luke.copy("Yoda", age=800)
     yoda: Employee = Employee(Yoda,800,LucasArt)


     scala>
Collections
● Les listes et les maps sont des types natifs
  ○ Immuables par défaut

● Simplification des génériques Java
  ○ Inférence des types
     scala> val numbers = List(1,2,3)
     numbers: List[Int] = List(1, 2, 3)

     scala>   for (n <- numbers) println("Number "+n)
     Number   1
     Number   2
     Number   3

     scala>
Collections
● Le for est "très Java"
  ○ Façon Scala : Utiliser des fonctions
                             functionName { input =>
                                             body
                                           }




  scala> val numbers = List(1,2,3)
  numbers: List[Int] = List(1, 2, 3)

  scala>   numbers.foreach { n:Int =>   // Enter to continue on the next line
       |   println("Number "+n)
       |   }
  Number   1
  Number   2
  Number   3



  scala>
Collections
● D'autres exemples des fonctions sur des listes
  scala> val reversedList = numbers.reverse
  reversedList: List[Int] = List(3, 2, 1)

  scala> val numbersLessThan3 = numbers.filter { n => n < 3 }
  numbersLessThan3: List[Int] = List(1, 2)

  scala> val oddNumbers = numbers.filterNot { n => n % 2 == 0 }
  oddNumbers: List[Int] = List(1, 3)

  scala> val higherNumbers = numbers.map { n => n + 10 }
  higherNumbers: List[Int] = List(11, 12, 13)

  scala> val sumOfNumbers = numbers.foldLeft(0) { (total,element) =>
     | total + element
     | }
  sumOfNumbers: Int = 6

  scala> val sumOfNumbers = numbers.sum
  sumOfNumbers: Int = 6

  scala> val higherNumbers = numbers.map(_+10)
  higherNumbers: List[Int] = List(11, 12, 13)

  scala>
Comment apprendre
Scala ?
Je ne vais pas passer une heure à vos passer
des slides
● Méthode peu éfficace

Tentons quelque chose de nouveau
● Approche pratique

      Essayons les Scala Koans !

Scala Koans ? Kesaco ?
Koans
Une nouvelle façon d'apprendre un langage
● Des petits cas pratiques
   ○ Sous la forme de suites de tests unitaires
● Chaque cas orienté pour un concept
   ○ Et un ensemble de tests qui ne passent pas
● Objectif : réparer les tests pour qu'ils
  passent
   ○ Et apprendre le langage en passant


Méthode d'apprentissage différente et éfficace !
Scala Koans :
Learn Scala with the Koans
       http://www.scalakoans.org/
Scala Koans

1. Telecharger le .zip sur http://www.scalakoans.org/
2. Extraire tout et exécuter le fichier ./sbt
3. Compiler les tests avec :
   > test:compile
4. Exécuter tous les koans avec :
   > ~test-only org.functionalkoans.forscala.Koans
   ou
   Exécuter un koan en concret :
   > ~test-only org.functionalkoans.forscala.AboutAsserts
5. Ouvrir le fichier source du koan, l'éditer et voir si ça
   passe
C'est l'heure des Scala Koans !
Play! Framework



Play 2.0, a Web framework for a new era
Le projet Play!
Play! est un framework pour
● faire du développement web
● avec une haute productivité
● avec l'état de l'art des technologies web
● sur la JVM
Play! : productivité et plaisir
● Conçu par des développeurs web pour des
    développeurs web
●   Gestion simple, flexible et puissante du protocole HTTP
    ○ Framework web -> HTTP au centre
    ○ Stateless, request-response
●   Facilité de démarrage
    ○ Courbe d'apprentissage douce
●   Rapidité et simplicité : change le code et recharge la
    page !
●   Framework complet, full-stack
Play! : pas un jouet
●   Modèle de programmation HTTP asynchrone
●   Architecture scalable de haute performance
●   Modèle reactive, non bloquant
●   Typage fort
Suivons le web !
    When a web framework starts an architecture fight
          with the web, the framework loses.




● PHP et Ruby on Rails l'ont bien compris
   ○ Si on fait du web, on s'adapte au web !

● Exemples : session, bouton back...

● Play! a une architecture stateless basé sur HTTP
Modifiez, rechargez, c'est fait !



● Devoir redémarrer le serveur après une modif ?
● Redéployer car on a changé un fichier ?

● A nouveau, regardons PHP ou Ruby on Rails
   ○ Si on fait du web, on s'adapte au web !

● Avec Play! il suffit de recharger la page et la modif est
   prise en compte
   ○ Ca, c'est de la productivité !
Play! ne se bat pas contre le web
● Des URL à ralonge avec des paramètres techniques ?
             C'est pas du web, ça !




● Play! utilise HTTP comme protocole, avec sa
   semantique
   ○ il ne cherche pas à faire son meta-protocole au dessus
Le web a évolué




● On est au bord d'une nouvelle évolution :
    ○ Les requêtes asynchrones en temps réel
    ○ Des énormes flux de données
    ○ Les BDD non relationnelles
●   Les frameworks classiques ont du mal à s'adapter
Les limites des frameworks
classiques

● Chaque utilisateur connecté consomme des
  ressources
  ○ Mémoire, threads...


● Modèles basés sur l'attente active
  ○ Synchronisme entre requête et réponse
  ○ On bloque un thread côté serveur

● Les I/O sont bloquantes
Play! utilise un modèle réactif

● Inversion de contrôle
  ○ On agit que lorsqu'on a quelque chose à faire


● Sans perte de contrôle
  ○ Mais on est capable de garder le contrôle

● Iteratee/Enumerator IO
Play! Framework




 Voici une petite démo

Enib cours c.a.i. web - séance #5 : scala play! framework

  • 1.
    Conception d'Applications Interactives : Applications Web et JEE Séance #5 Scala / Play! Framework
  • 2.
  • 3.
    Langages alternatives pourla JVM Java ≠ JVM ● Java : Langage qui compile vers du bytecode ● JVM : Machine virtuelle qui exécute du bytecode
  • 4.
    La JVM entant que plate-forme ● Build once, run everywhere ○ Des implémentations de JVM pour la plupart du hardware et OS ○ Bytecode format pivot indépendant de la plate-forme ● Tendance à s'affranchir de l'OS ○ Côté client : navigateur comme plate-forme ○ Côté serveur : JVM comme plate-forme
  • 5.
    Pourquoi des nouveauxlangages If all you have is a hammer, everything looks like a nail Java est un très bon langage généraliste, mais pas la solution ultime ● Scripting ? ● Programmation fonctionnelle ? ● Simplification et réduction du boilerplate ?
  • 6.
    Pourquoi des nouveauxlangages sur la JVM ● Le target est le bytecode ○ Pas besoin d'implémenter la compilation vers le format natif de chaque OS ● Profiter de l'écosystème Java ○ Bibliothèques, serveurs, outils... ○ Courbe d'adoption moins ardue ● Support pour langages à typage dynamique ○ JSR 292, invokedynamic ○ Intégrée à la JVM depuis Java 1.7
  • 7.
    Quels sont ceslangages ? ● Des langages nouveaux : ○ Clojure, Groovy, Scala, Ceylon, Kotlin... ● Des implémentations d'autres langages ○ JRuby (Ruby), Jython (Python), Rhino (JS), Elastic COBOL (Cobol), JGNAT (Ada), Luaj (Lua)...
  • 8.
    Jython Interprète Python écriten Java, créé en 1997 ● Compilation de code Python en bytecode ● Héritage de classes Java par des classes Python ● Scripting de code Python dans un programme Java ● Utilisation d'objets Java dans du code Python Très utilisé pour prototypage, scripting et exploration des classes Java http://www.jython.org/
  • 9.
    JRuby Interprète Ruby écriten Java, créé en 2001 ● Equivalente de Jython pout Ruby ● Capable de faire tourner Rails ● Plus rapide que l'implémentation de référence ○ Option JIT http://www.jruby.org/
  • 10.
    Groovy Langage de POOdestiné à la plate-forme Java ● Inspiré de Python, Ruby et Smalltalk ● Syntaxe très proche de Java ● Compilé ○ soit à la volée dynamiquement ○ soit classiquement vers bytecode ● Typages statique et dynamique ● Support natif pour listes, maps, et expressions régulières ● Fermetures ou clôtures (closures) ● Surcharge des opérateurs http://groovy.codehaus.org/
  • 11.
    Ceylon Nouveau langage pourla JVM par RedHat ● "Java tel qu'ils serait si il avait été développé aujourd'hui" ● Typage statique ○ Types union et intersection ● Syntaxe régulière ○ Sucre syntactique ajouté ● Modulaire ○ Dépôt Ceylon Herd http://www.ceylon-lang.org/
  • 12.
    Scala Langage de programmationmulti-paradigme ○ Programmations orientée objet et fonctionnelle ● Typage statique, syntaxe concise ● Compilé vers bytecode ● Intéropérabilité avec le code Java http://www.scala-lang.org/
  • 13.
    Le développeur multi-lingue ●Environnement JVM en mouvement continu ○ Nouveaux langages ○ Nouveaux frameworks ○ Nouveaux outils ● Ne pas se tenir à jour, ne pas apprendre = stagner, régresser. ○ Un nouveau langage par an ○ Un nouveau framework tous les 3 mois
  • 14.
  • 15.
    Scala Langage de programmationmulti-paradigme ○ Programmations orientée objet et fonctionnelle ● Typage statique, syntaxe concise ● Compilé vers bytecode ● Intéropérabilité avec le code Java http://www.scala-lang.org/
  • 16.
    La console REPL REPL: Read Event Print Loop ● Console intéractive pour l'interprétation de Scala horacio@horacio-laptop:$ scala Welcome to Scala version 2.10.0-RC3 (Java HotSpot(TM) Server VM, Java 1.6.0_31). Type in expressions to have them evaluated. Type :help for more information. scala> val revolution : Int = 1789 revolution: Int = 1789 scala>
  • 17.
    val et var ●var : variables (mutables) ● val : valeurs (constantes, inmutables) scala> val revolution : Int = 1789 revolution: Int = 1789 scala> revolution = 1917 <console>:8: error: reassignment to val revolution = 1917 ^ scala> var variable : String = "Ma variable" variable: String = Ma variable scala> variable = "Notre variable" variable: String = Notre variable scala>
  • 18.
    Classes ● Pas besoinde déclarer les attributs privés et les getters et setters ○ Le constructeur suffit ● Constructeur avec des valeurs par défaut scala> case class Employee( name:String="guest", age: Int=30, company:String = "DevCode" ) defined class Employee scala> val guest = Employee() guest: Employee = Employee(guest,30,DevCode) scala> val guestAge = guest.age guestAge: Int = 30 scala>
  • 19.
    Classes ● Définition explicitedes paramètres lors des appels aux méthodes ● Méthode copy pour créer des copies des objets scala> case class Employee( name:String="guest", age: Int=30, company:String = "DevCode" ) defined class Employee scala> val luke = Employee("Luke", company="LucasArt") luke: Employee = Employee(Luke,30,LucasArt) scala> val yoda = luke.copy("Yoda", age=800) yoda: Employee = Employee(Yoda,800,LucasArt) scala>
  • 20.
    Collections ● Les listeset les maps sont des types natifs ○ Immuables par défaut ● Simplification des génériques Java ○ Inférence des types scala> val numbers = List(1,2,3) numbers: List[Int] = List(1, 2, 3) scala> for (n <- numbers) println("Number "+n) Number 1 Number 2 Number 3 scala>
  • 21.
    Collections ● Le forest "très Java" ○ Façon Scala : Utiliser des fonctions functionName { input => body } scala> val numbers = List(1,2,3) numbers: List[Int] = List(1, 2, 3) scala> numbers.foreach { n:Int => // Enter to continue on the next line | println("Number "+n) | } Number 1 Number 2 Number 3 scala>
  • 22.
    Collections ● D'autres exemplesdes fonctions sur des listes scala> val reversedList = numbers.reverse reversedList: List[Int] = List(3, 2, 1) scala> val numbersLessThan3 = numbers.filter { n => n < 3 } numbersLessThan3: List[Int] = List(1, 2) scala> val oddNumbers = numbers.filterNot { n => n % 2 == 0 } oddNumbers: List[Int] = List(1, 3) scala> val higherNumbers = numbers.map { n => n + 10 } higherNumbers: List[Int] = List(11, 12, 13) scala> val sumOfNumbers = numbers.foldLeft(0) { (total,element) => | total + element | } sumOfNumbers: Int = 6 scala> val sumOfNumbers = numbers.sum sumOfNumbers: Int = 6 scala> val higherNumbers = numbers.map(_+10) higherNumbers: List[Int] = List(11, 12, 13) scala>
  • 23.
    Comment apprendre Scala ? Jene vais pas passer une heure à vos passer des slides ● Méthode peu éfficace Tentons quelque chose de nouveau ● Approche pratique Essayons les Scala Koans ! Scala Koans ? Kesaco ?
  • 24.
    Koans Une nouvelle façond'apprendre un langage ● Des petits cas pratiques ○ Sous la forme de suites de tests unitaires ● Chaque cas orienté pour un concept ○ Et un ensemble de tests qui ne passent pas ● Objectif : réparer les tests pour qu'ils passent ○ Et apprendre le langage en passant Méthode d'apprentissage différente et éfficace !
  • 25.
    Scala Koans : LearnScala with the Koans http://www.scalakoans.org/
  • 26.
    Scala Koans 1. Telechargerle .zip sur http://www.scalakoans.org/ 2. Extraire tout et exécuter le fichier ./sbt 3. Compiler les tests avec : > test:compile 4. Exécuter tous les koans avec : > ~test-only org.functionalkoans.forscala.Koans ou Exécuter un koan en concret : > ~test-only org.functionalkoans.forscala.AboutAsserts 5. Ouvrir le fichier source du koan, l'éditer et voir si ça passe
  • 27.
    C'est l'heure desScala Koans !
  • 28.
    Play! Framework Play 2.0,a Web framework for a new era
  • 29.
    Le projet Play! Play!est un framework pour ● faire du développement web ● avec une haute productivité ● avec l'état de l'art des technologies web ● sur la JVM
  • 30.
    Play! : productivitéet plaisir ● Conçu par des développeurs web pour des développeurs web ● Gestion simple, flexible et puissante du protocole HTTP ○ Framework web -> HTTP au centre ○ Stateless, request-response ● Facilité de démarrage ○ Courbe d'apprentissage douce ● Rapidité et simplicité : change le code et recharge la page ! ● Framework complet, full-stack
  • 31.
    Play! : pasun jouet ● Modèle de programmation HTTP asynchrone ● Architecture scalable de haute performance ● Modèle reactive, non bloquant ● Typage fort
  • 32.
    Suivons le web! When a web framework starts an architecture fight with the web, the framework loses. ● PHP et Ruby on Rails l'ont bien compris ○ Si on fait du web, on s'adapte au web ! ● Exemples : session, bouton back... ● Play! a une architecture stateless basé sur HTTP
  • 33.
    Modifiez, rechargez, c'estfait ! ● Devoir redémarrer le serveur après une modif ? ● Redéployer car on a changé un fichier ? ● A nouveau, regardons PHP ou Ruby on Rails ○ Si on fait du web, on s'adapte au web ! ● Avec Play! il suffit de recharger la page et la modif est prise en compte ○ Ca, c'est de la productivité !
  • 34.
    Play! ne sebat pas contre le web ● Des URL à ralonge avec des paramètres techniques ? C'est pas du web, ça ! ● Play! utilise HTTP comme protocole, avec sa semantique ○ il ne cherche pas à faire son meta-protocole au dessus
  • 35.
    Le web aévolué ● On est au bord d'une nouvelle évolution : ○ Les requêtes asynchrones en temps réel ○ Des énormes flux de données ○ Les BDD non relationnelles ● Les frameworks classiques ont du mal à s'adapter
  • 36.
    Les limites desframeworks classiques ● Chaque utilisateur connecté consomme des ressources ○ Mémoire, threads... ● Modèles basés sur l'attente active ○ Synchronisme entre requête et réponse ○ On bloque un thread côté serveur ● Les I/O sont bloquantes
  • 37.
    Play! utilise unmodèle réactif ● Inversion de contrôle ○ On agit que lorsqu'on a quelque chose à faire ● Sans perte de contrôle ○ Mais on est capable de garder le contrôle ● Iteratee/Enumerator IO
  • 38.
    Play! Framework Voiciune petite démo