Breizh JUG - Scala

1,035 views

Published on

Scala presentation given at Breizh JUG (October 18th, 2010). Also available on Parley's.

Published in: Technology, News & Politics
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,035
On SlideShare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
1
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Breizh JUG - Scala

  1. 1. 18 Octobre 2010Copyright © BreizhJug
  2. 2. 18/10/2010 Photo Nicolas Jozwiak Xebia LogoCopyright © BreizhJug
  3. 3. 18/10/2010 Romain Maton Xebia Twitter : rmat0n LogoCopyright © BreizhJug
  4. 4. Citations 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. James Strachan (Groovy) : Im 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 Id probably have never created Groovy. 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? The answer was surprisingly fast and very clear : Scala.Copyright © BreizhJug
  5. 5. Sommaire Les origines de Scala ? Quy a-t-il sous le capot ? Quelques exemples Loutillage et les frameworks Pourquoi faut-il sy intéresser ? Difficultés/Challenges Les freins à son adoption Programmation fonctionnelle avec Javascript Scala 2.8 et 2.9 Qui lutilise ? ConclusionCopyright © BreizhJug
  6. 6. Les origines Créateur : Martin Odersky Professeur de méthodes de programmation à lEPFL (École Polytechnique Fédérale de Lausanne)Copyright © BreizhJug
  7. 7. Scala... ça décolle !Copyright © BreizhJug
  8. 8. Groovy loin devant 13/04/2010Copyright © BreizhJug SCALA 8
  9. 9. Et la route est encore longueCopyright © BreizhJug
  10. 10. Scala Cest un compromis entre la programmation orientée objet et la programmation fonctionnelle Orientée Objet : Structuration des données et richesse des APIs Fonctionelle : Moindre verbosité et composition de fonctions Scalable, programmation concurrente et parallèle Scala est exécutable sur une JVM 100% compatible avec Java Statiquement typéCopyright © BreizhJug
  11. 11. Scala La non nullité, Scala prônera Limmutabilité, Scala prônera Tout objet, Scala sera 1+1 <=> (1).+(1)Copyright © BreizhJug
  12. 12. Quelques exemples Inférence val listStr:Array[String] = new Array[String] val listStr = new Array[String] Déclaration de fonctions def multiply(x:Int, y:Int) = x*y Multiply(2, 10) def multiply(x:Int)(y:Int) = x*y Multiply(2)(10) def double = multiply(2)(_) double(10)Copyright © BreizhJug
  13. 13. Quelques exemples Listes Collections.sort(...) list.filter({x:Int => x%2==0}) list.map({x:Int => x*2}) Support XML natif class HelloWorld { def hello = <span>Welcome Juggers for Scala’s presentation ! {new java.util.Date}</span> }Copyright © BreizhJug
  14. 14. Passer de lobjet au fonctionnel List<Integer> listInteger = new LinkedList<Integer>(); for (Integer number : list) { if (number % 2 == 0) listInteger.add(number); } val listNumber = list.filter(_%2 == 0); Predicate predicateNumber = new Predicate () { @Override public boolean evaluate (Object o) { Integer number = (Integer) o; return n % 2 == 0; } } CollectionUtils.filter(list, predicateNumber);Copyright © BreizhJug
  15. 15. Quelques exemples Round(FixingIndex("Euribor 06 Mois", DateFixing("Prefixe", -2, 0, "Ouvré", "XX-XX"), Spot()), 0.01) + SnowBall() Calculer (3+4) * (4+2)Copyright © BreizhJug
  16. 16. Quelques exemples Calculer (3+4) * (4+2) En Java Expression expression = new Multiply(new Add(new Const(3), new Const(4)), new Add(new Const(4), new Const(2))); ExpressionVisiteur eval = new EvaluateVisiteur(); expression.evaluate(eval); En Scala var expression = Multiply(Add(Const(3), Const(4)), Add(Const(4), Const(2))); val v = new Visiteur(); v.evaluate(expression);Copyright © BreizhJug
  17. 17. Pattern matching abstract class Expr case class Const(n: Int) extends Expr case class Add(l: Expr, r: Expr) extends Expr case class Multiply(l: Expr, r: Expr) extends Expr class Visiteur { def evaluate(e: Expr): Int = e match { case Const(n) => n case Add(l, r) => evaluate(l) + evaluate(r) case Multiply(l, r) => evaluate(l) * evaluate(r) }Copyright © BreizhJug
  18. 18. Pattern visiteurCopyright © BreizhJug
  19. 19. Pattern visiteur public abstract class Expression { abstract Object evaluate(ExpressionVisiteur v); } public class Add extends Expression { private Expression expr1; private Expression expr2; public Add(Expression expr1, Expression expr2) { this.expr1 = expr1; this.expr2 = expr2; } public Object evaluate(ExpressionVisiteur v) { return v.visitAdd(expr1, expr2); } }Copyright © BreizhJug
  20. 20. Pattern visiteur public interface ExpressionVisiteur { Object visitConst(int c); Object visitAdd(Expression expr1, Expression expr2); Object visitMult(Expression expr1, Expression expr2); } public class EvaluateVisiteur implements ExpressionVisiteur { public Object visitConst(int constante) { return new Integer(constante); } public Object visitAdd(Expression expr1, Expression expr2) { return new Integer(((Integer) expr1.evaluate(this)).intValue() + ((Integer) expr2.evaluate(this)).intValue()); } .... }Copyright © BreizhJug
  21. 21. API Actors Un actor, cest : Un objet qui vit dans la JVM Pile de messages type mailbox Il reçoit des messages, et il répond… Soit 1 thread par actor Soit un pool de threads (plusieurs millions d’actors) Remote actor (jvm distantes)Copyright © BreizhJug
  22. 22. Avant : threadsCopyright © BreizhJug
  23. 23. Après : actorsCopyright © BreizhJug
  24. 24. Les Actors val printActor = actor { loop { react { case _ => println(text) } } } printActor ! "foo" printActor ! "bar"Copyright © BreizhJug
  25. 25. Les Actors val pong = new Pong val ping = new Ping(100000, pong) ping.start pong.startCopyright © BreizhJug
  26. 26. Les Actors class Ping(count: int, pong: Actor) extends Actor { def act() { pong ! Ping loop { react { case Pong => pong ! Ping } } } }Copyright © BreizhJug
  27. 27. Les Actors class Pong extends Actor { def act() { loop { react { case Ping => sender ! Pong } } } }Copyright © BreizhJug
  28. 28. Les Traits Définition : interfaces permettant de définir des méthodes/variables abstraites, mais aussi des méthodes concrètesCopyright © BreizhJug
  29. 29. Les Traits trait XML { def toString(): String def toXML(): String = "<![CDATA[" + toString() + "]]>" } class MyObject { override def toString() = "Hello Paris JUG !" } var myObject = new MyObject with XML println(myObject.toXML) => <![CDATA[Hello Paris JUG !]]>Copyright © BreizhJug
  30. 30. Les Traits abstract class Car { trait ElectricalCar extends OilCar { def drive() = { override def drive = { print("Drive an"); super.drive(); } println(" electrical car"); } } } trait OilCar extends Car { override def drive = { trait LogCar extends Car { super.drive(); abstract override def drive = { println(" oil car"); println("Entree peage"); } super.drive } println("Sortie peage"); } } class MyCar extends OilCar { }Copyright © BreizhJug
  31. 31. Les Traits var myCar = new MyCar myCar.drive => Drive an oil car myCar = new MyCar with ElectricalCar myCar.drive => Drive an oil car electricial car myCar = new MyCar with ElectricalCar with LogCar myCar.drive => Entree peage Drive an oil car electricial car Sortie peageCopyright © BreizhJug
  32. 32. Outillage Plugin Eclipse Coloration syntaxique, markers Refactoring difficile Plante très souvent Compatabilité java / scala, trait, fonction... Difficulté au niveau configuration projetCopyright © BreizhJug
  33. 33. Outillage Plugin IntelliJ Complétion très bien gérée Parfois lent à la compilation Très bonne gestion de linférence Configuration de projet simpleCopyright © BreizhJug
  34. 34. Outillage Plugin NetBeans Coloration syntaxique Intégration maven Plugin en version BetaCopyright © BreizhJug
  35. 35. Les frameworks : tester en Scala en DSL !!! class StackSpec extends FlatSpec with ShouldMatchers { "A Stack" should "pop values in last-in-first-out order" in { val stack = new Stack[Int] stack.push(1) stack.push(2) stack.pop() should equal (2) stack.pop() should equal (1) } it should "throw NoSuchElementException if an empty stack is popped" in { val emptyStack = new Stack[String] evaluating { emptyStack.pop() } should produce [NoSuchElementException] } }Copyright © BreizhJug
  36. 36. Les frameworks : Actors++ ! Tolérance aux pannes Let it crash ! Dont try to prevent it, but manage it ! Stratégies de redémarrage Simplification des remote actors 2 à 3 fois plus rapides que les actors Scala Nombreux modules : Comet, REST, Security, Spring, Guice, AMQP, Scheduler...Copyright © BreizhJug
  37. 37. Les frameworks SBT : Simple Build Tool pour Scala Gestion de dépendances en Scala Compilation multiples vers différentes versions de Scala Actions en continues (tests, compilation…) Excellentes intégration avec specs, ScalaTest… Plugins multiples Peut s’intégrer avec MavenCopyright © BreizhJug
  38. 38. Les frameworks Simple, concis, ajax, comet... focus sur le métier Tourne sur tomcat, jetty, weblogic... Pas de code dans les pages HTML Logique gérée dans le code Scala Snippet = tag librairies Mapping assez poussé (BD, model, snippet et pages HTML)Copyright © BreizhJug
  39. 39. Pourquoi faut-il sy intéresser ? Code plus concis Développement plus rapide (peut-être pas tout de suite) Tests encore plus métier Gestion « plus simple » des problèmes de modélisation Gestion de la concurrenceCopyright © BreizhJug
  40. 40. Difficultés/Challenges Enrichissement personnel => ça fait marcher le cerveau ! Nouveau paradigme Penser fonctionnel, ça prend du tempsCopyright © BreizhJug
  41. 41. Les freins à son adoption Problème de maîtrise du langage Peut devenir assez vite complexe def foo(l: List[int]): int = (0/:l){_+_} Courbe dapprentissage Intégration avec Java Scala dans des parties business criticalCopyright © BreizhJug
  42. 42. Programmation fonctionnelle avec Javascript Natif Javascript functionaljavascript.js ou underscore.js : ‘x y -> x+2*y’.lambda()(2, 3) ‘x -> x+1’ = ‘x+1’ = ‘_+1’ = ‘+1’ = function(x) { return x+1; } map(‘x*x’, [1,2,3,4]) = [1, 4, 9, 16] reduce(‘x*2+y’, 0, [1,0,1,0]) = 10 select(‘>2’, [1,2,3,4]) = [3,4] map(guard(‘2*’, not(‘%2’)), [1,2,3,4]) = [1,4,3,8]Copyright © BreizhJug
  43. 43. Programmation fonctionnelle avec Javascript until(‘>100’, ‘x*x’)(2) -> 256 var squareUntil = until.partial(_, ‘x*x’); var square2Until = squareUntil.uncurry().flip().curry(2); var firstSquare2Over = compose(square2Until, ‘n -> i -> i > n’); firstSquare2Over(100) -> 256Copyright © BreizhJug
  44. 44. Scala 2.8 API collectionsval myMap = Map(1 -> "Xebia France", 2 -> "Xebia Hollande", 3 -> "Xebia Inde");myMap.map(_._1); => List (1, 2, 3)myMap.values; => MapLike (Xebia France, Xebia Hollande, Xebia Inde)val lignes = List (ligneDeCredit_1, ligneDeCredit_2, ligneDeCredit_3, ligneDeCredit_4);val(petitTirages, grandsTiranges) = lignes partition (_.montantTirage < 10000);Copyright © BreizhJug
  45. 45. Scala 2.8 Paramètres nommés et par défautdef pondereProduit (produit:LigneDeCredit, devise:String, pourcentage:Double)def pondereProduit (produit:LigneDeCredit, devise:String = "EUR", pourcentage:Double)pondereProduit(pourcentage = 10.0, produit = ligneDeCredit_1, "USD");Copyright © BreizhJug
  46. 46. Le futur Les annonces : Collections parallèles Optimisations des performancesCopyright © BreizhJug
  47. 47. Qui utilise Scala ?Copyright © BreizhJug
  48. 48. Conclusion Essayez-le !!!Copyright © BreizhJug
  49. 49. Bibliographie / liens http://www.scala-lang.org/ http://www.artima.com/scalazine http://www.codecommit.com/blog/ Programming in Scala: A Comprehensive Step-by- step Guide (Martin Odersky) Programming Scala: Tackle Multicore Complexity on the JVM (Venkat Subramaniam)Copyright © BreizhJug
  50. 50. Merci de votre attention !Copyright © BreizhJug
  51. 51. Questions / Réponses ?Copyright © BreizhJug
  52. 52. Licence http://creativecommons.org/licenses/by-nc-sa/2.0/fr/Copyright © BreizhJug

×