Nicolas Jozwiak Xebia
Romain Maton Xebia Twitter : rmat0n
Citations James Gosling (Java) :   During a meeting in the Community Corner, a participant asked an interesting question: ...
Sommaire <ul><li>Les origines de Scala ?
Qu'y a-t-il sous le capot ? Quelques exemples
L'outillage et les frameworks
Pourquoi faut-il s'y intéresser ?
Difficultés/Challenges
Les freins à son adoption
Le futur ?
Qui l'utilise ?
Conclusion </li></ul>
Les origines <ul><li>Créateur : Martin Odersky </li><ul><li>Professeur de méthodes de programmation à l'EPFL (École Polyte...
Scala... ça décolle !
Groovy loin devant
Et la route est encore longue
Scala <ul><li>C'est un compromis entre la programmation orientée objet et la programmation fonctionnelle </li><ul><li>Orie...
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é </li></ul></ul>
Scala <ul><li>La non nullité, Scala prônera
L'immutabilité, Scala prônera
Tout objet, Scala sera
1+1 <=> (1).+(1) </li></ul>
Quelques exemples Inférence val   listStr : Array [ String ] =  new   Array [ String ] val   listStr  =  new   Array [ Str...
Quelques exemples Listes Collections. sort (...) list.filter({x:Int => x%2==0}) list.map({x:Int => x*2}) Support XML natif...
Passer de l'objet au fonctionnel List<Integer> listInteger =  new  LinkedList<Integer>(); for  (Integer number : list) {  ...
Quelques exemples Calculer (3+4) * (4+2) Round(FixingIndex(&quot;Euribor 06 Mois&quot;, DateFixing(&quot;Prefixe&quot;, -2...
Quelques exemples Expression   expression  =  new  Multiply( new  Add( new  Const(3),  new  Const(4)), new  Add( new  Cons...
Pattern matching abstract   class   Expr case   class   Const ( n :  Int )  extends   Expr case   class   Add ( l :  Expr ...
Pattern visiteur
Pattern visiteur public   abstract   class  Expression { abstract  Object evaluate(ExpressionVisiteur v); } public   class...
Pattern visiteur public   interface  ExpressionVisiteur { Object visitConst( int  c); Object visitAdd( Expression  expr1, ...
API Actors <ul><li>Un actor, c'est : </li><ul><li>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) </li></ul></ul>
Avant : threads
Après : actors
Les Actors val   printActor  =  actor  { loop { react  { c ase   _  =>  println ( text ) } } } printActor   !   &quot;foo&...
Les Actors val   pong  =  new  Pong val   ping  =  new  Ping(100000,  pong ) ping .start pong .start
Les Actors class   Ping ( count :  int ,  pong :  Actor )  extends   Actor  { def   act () { pong !  Ping loop { react { c...
Les Actors class   Pong   extends   Actor  { def   act () { loop { react { case  Ping =>  sender ! Pong  } } } }
Upcoming SlideShare
Loading in …5
×

13 04 2010 Scala au Paris JUG (Nicolas Jozwiak, Romain Maton)

624 views
507 views

Published on

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
624
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
2
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

13 04 2010 Scala au Paris JUG (Nicolas Jozwiak, Romain Maton)

  1. 2. Nicolas Jozwiak Xebia
  2. 3. Romain Maton Xebia Twitter : rmat0n
  3. 4. Citations James Gosling (Java) : During a meeting in the Community Corner, a participant asked an interesting question: &quot;Which Programming Language would you use now on top of JVM, except Java?&quot; The answer was surprisingly fast and very clear : Scala. James Strachan (Groovy) : 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.
  4. 5. Sommaire <ul><li>Les origines de Scala ?
  5. 6. Qu'y a-t-il sous le capot ? Quelques exemples
  6. 7. L'outillage et les frameworks
  7. 8. Pourquoi faut-il s'y intéresser ?
  8. 9. Difficultés/Challenges
  9. 10. Les freins à son adoption
  10. 11. Le futur ?
  11. 12. Qui l'utilise ?
  12. 13. Conclusion </li></ul>
  13. 14. Les origines <ul><li>Créateur : Martin Odersky </li><ul><li>Professeur de méthodes de programmation à l'EPFL (École Polytechnique Fédérale de Lausanne) </li></ul></ul>
  14. 15. Scala... ça décolle !
  15. 16. Groovy loin devant
  16. 17. Et la route est encore longue
  17. 18. Scala <ul><li>C'est un compromis entre la programmation orientée objet et la programmation fonctionnelle </li><ul><li>Orientée Objet : Structuration des données et richesse des APIs
  18. 19. Fonctionelle : Moindre verbosité et composition de fonctions
  19. 20. Scalable, programmation concurrente et parallèle
  20. 21. Scala est exécutable sur une JVM
  21. 22. 100% compatible avec Java
  22. 23. Statiquement typé </li></ul></ul>
  23. 24. Scala <ul><li>La non nullité, Scala prônera
  24. 25. L'immutabilité, Scala prônera
  25. 26. Tout objet, Scala sera
  26. 27. 1+1 <=> (1).+(1) </li></ul>
  27. 28. 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)
  28. 29. 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> }
  29. 30. Passer de l'objet au fonctionnel List<Integer> listInteger = new LinkedList<Integer>(); for (Integer number : list) { if (number % 2 == 0) listInteger.add(number); } Predicate predicateNumber = new Predicate () { @ Override public boolean evaluate (Object o) { Integer number = (Integer) o; return n % 2 == 0; } } CollectionUtils .filter( list , predicateNumber); val listNumber = list.filter(_%2 == 0);
  30. 31. Quelques exemples Calculer (3+4) * (4+2) Round(FixingIndex(&quot;Euribor 06 Mois&quot;, DateFixing(&quot;Prefixe&quot;, -2, 0, &quot;Ouvré&quot;, &quot;XX-XX&quot;), Spot()), 0.01) + SnowBall()
  31. 32. Quelques exemples 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); <ul><ul><li>En Scala </li></ul></ul>var expression = Multiply(Add(Const(3), Const(4)), Add(Const(4), Const(2))); val v = new Visiteur(); v.evaluate(expression); Calculer (3+4) * (4+2) <ul><ul><li>En Java </li></ul></ul>
  32. 33. 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 ) }
  33. 34. Pattern visiteur
  34. 35. 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 ); } }
  35. 36. 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()); } .... }
  36. 37. API Actors <ul><li>Un actor, c'est : </li><ul><li>Un objet qui vit dans la JVM
  37. 38. Pile de messages type mailbox
  38. 39. Il reçoit des messages, et il répond…
  39. 40. Soit 1 thread par actor
  40. 41. Soit un pool de threads (plusieurs millions d’actors)
  41. 42. Remote actor (jvm distantes) </li></ul></ul>
  42. 43. Avant : threads
  43. 44. Après : actors
  44. 45. Les Actors val printActor = actor { loop { react { c ase _ => println ( text ) } } } printActor ! &quot;foo&quot; printActor ! &quot;bar&quot;
  45. 46. Les Actors val pong = new Pong val ping = new Ping(100000, pong ) ping .start pong .start
  46. 47. Les Actors class Ping ( count : int , pong : Actor ) extends Actor { def act () { pong ! Ping loop { react { case Pong => pong ! Ping } } } }
  47. 48. Les Actors class Pong extends Actor { def act () { loop { react { case Ping => sender ! Pong } } } }
  48. 49. Les Traits <ul><li>Définition : interfaces permettant de définir des </li></ul>méthodes/variables abstraites, mais aussi des méthodes concrètes
  49. 50. Les Traits trait XML { def toString (): String def toXML (): String = &quot;<![CDATA[&quot; + toString () + &quot;]]>&quot; } class MyObject { override def toString () = &quot;Hello Paris JUG !&quot; } var myObject = new MyObject with XML println (myObject.toXML) => <![CDATA[Hello Paris JUG !]]>
  50. 51. Les Traits abstract class Car { def drive () = { print ( &quot;Drive an&quot; ); } } trait OilCar extends Car { override def drive = { super . drive (); println ( &quot; oil car&quot; ); } } class MyCar extends OilCar { } trait ElectricalCar extends OilCar { override def drive = { super .drive(); println ( &quot; electrical car&quot; ); } } trait LogCar extends Car { abstract override def drive = { println ( &quot;Entree peage&quot; ); super .drive println ( &quot;Sortie peage&quot; ); } }
  51. 52. Les Traits myCar = new MyCar with ElectricalCar with LogCar myCar . drive => Entree peage Drive an oil car electricial car Sortie peage var myCar = new MyCar myCar . drive => Drive an oil car myCar = new MyCar with ElectricalCar myCar . drive => Drive an oil car electricial car
  52. 53. Outillage Plugin Eclipse Coloration syntaxique, markers Compatabilité java / scala, trait, fonction... Difficulté au niveau configuration projet Plante très souvent Refactoring quasi impossible
  53. 54. Outillage Plugin IntelliJ Complétion très bien gérée Parfois lent à la compilation Configuration de projet simple Très bonne gestion de l'inférence
  54. 55. Outillage Plugin NetBeans Plugin en version Beta Installation laborieuse du plugin
  55. 56. Les frameworks <ul>: tester en Scala en DSL !!! </ul>class StackSpec extends FlatSpec with ShouldMatchers { &quot;A Stack&quot; should &quot;pop values in last-in-first-out order&quot; in { val stack = new Stack[Int] stack.push(1) stack.push(2) stack.pop() should equal (2) stack.pop() should equal (1) } it should &quot;throw NoSuchElementException if an empty stack is popped&quot; in { val emptyStack = new Stack[String] evaluating { emptyStack.pop() } should produce [NoSuchElementException] } }
  56. 57. Les frameworks <ul><ul><li>Tolérance aux pannes
  57. 58. Let it crash ! Don't try to prevent it, but manage it !
  58. 59. Stratégies de redémarrage
  59. 60. Simplification des remote actors
  60. 61. 2 à 3 fois plus rapides que les actors Scala
  61. 62. Nombreux modules : Comet, REST, Security, Spring, Guice, AMQP, Scheduler... </li></ul></ul>: Actors++ !
  62. 63. Les frameworks <ul><ul><li>Simple, concis, ajax, comet... focus sur le métier
  63. 64. Tourne sur tomcat, jetty, weblogic...
  64. 65. Pas de code dans les pages HTML
  65. 66. Logique gérée dans le code Scala
  66. 67. Snippet = tag librairies
  67. 68. Mapping assez poussé (BD, model, snippet et pages HTML) </li></ul></ul>
  68. 69. Pourquoi faut-il s'y intéresser ? <ul><ul><li>Code plus concis
  69. 70. Développement plus rapide (peut-être pas tout de suite)
  70. 71. Tests encore plus métier
  71. 72. Gestion « plus simple » des problèmes de modélisation
  72. 73. Gestion de la concurrence </li></ul></ul>
  73. 74. Difficultés/Challenges <ul><ul><li>Enrichissement personnel
  74. 75. => ça fait marcher le cerveau !
  75. 76. Nouveau paradigme
  76. 77. Penser fonctionnel, ça prend du temps </li></ul></ul>
  77. 78. Les freins à son adoption <ul><ul><li>Peut devenir assez vite complexe </li></ul></ul><ul><ul><li>Problème de maîtrise du langage </li></ul></ul><ul><ul><li>Courbe d'apprentissage </li></ul></ul><ul><ul><li>Scala dans des parties business critical </li></ul></ul><ul><ul><li>Intégration avec Java </li></ul></ul>def foo ( l : List [ int ]): int = (0 /: l ){_ + _}
  78. 79. Le futur <ul><li>Quelques nouveautés de Scala 2.8 : </li><ul><li>Nouvelle API collection
  79. 80. REPL amélioré (complétion...)
  80. 81. Paramètres nommés et par défaut
  81. 82. Nouveaux contrôles (breakable and break)
  82. 83. Pas de compatibilité binaire avec 2.7 </li></ul></ul>
  83. 84. Qui utilise Scala ?
  84. 85. Conclusion Essayez-le !!!
  85. 86. Bibliographie / liens <ul><li>http://www.scala-lang.org/
  86. 87. http://www.artima.com/scalazine
  87. 88. http://www.codecommit.com/blog/
  88. 89. Programming in Scala: A Comprehensive Step-by-step Guide ( Martin Odersky )
  89. 90. Programming Scala: Tackle Multicore Complexity on the JVM ( Venkat Subramaniam ) </li></ul>
  90. 91. Questions / Réponses
  91. 92. Sponsors
  92. 93. Merci de votre attention!
  93. 94. Licence <ul><li>http://creativecommons.org/licenses/by-nc-sa/2.0/fr/ </li></ul>

×