3. Langages alternatives pour la JVM
Java ≠ JVM
● Java : Langage qui compile vers du bytecode
● JVM : Machine virtuelle qui exécute du bytecode
4. 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
5. 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 ?
6. 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
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)...
8. 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/
9. 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/
10. 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/
11. 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/
12. 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/
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
15. 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/
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 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>
19. 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>
20. 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>
21. 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>
22. 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>
23. 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 ?
24. 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 !
26. 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
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! : pas un 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'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é !
34. 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
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 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
37. 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