52
Copyright © BreizhJug

20101018_scala_breizh_jug_Romain_Maton_Nicolas_Jozwiak

  • Upload
    yoh82

  • View
    868

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 20101018_scala_breizh_jug_Romain_Maton_Nicolas_Jozwiak

Copyright © BreizhJug

Page 2: 20101018_scala_breizh_jug_Romain_Maton_Nicolas_Jozwiak

Copyright © BreizhJug

18/10/2010

Nicolas Jozwiak

Xebia

Photo

Logo

Page 3: 20101018_scala_breizh_jug_Romain_Maton_Nicolas_Jozwiak

Copyright © BreizhJug

18/10/2010

Romain Maton

Xebia

Twitter : rmat0n

Logo

Page 4: 20101018_scala_breizh_jug_Romain_Maton_Nicolas_Jozwiak

Copyright © BreizhJug

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?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.

Page 5: 20101018_scala_breizh_jug_Romain_Maton_Nicolas_Jozwiak

Copyright © BreizhJug

SommaireL

es 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

Programmation fonctionnelle avec Javascript

Scala 2.8 et 2.9

Qui l'utilise ?

Conclusion

Page 6: 20101018_scala_breizh_jug_Romain_Maton_Nicolas_Jozwiak

Copyright © BreizhJug

Les originesC

réateur : Martin OderskyP

rofesseur de méthodes de programmation à l'EPFL (École Polytechnique Fédérale de Lausanne)

Page 7: 20101018_scala_breizh_jug_Romain_Maton_Nicolas_Jozwiak

Copyright © BreizhJug

Scala... ça décolle !

Page 8: 20101018_scala_breizh_jug_Romain_Maton_Nicolas_Jozwiak

Copyright © BreizhJug13/04/2010 SCALA 8

Groovy loin devant

Page 9: 20101018_scala_breizh_jug_Romain_Maton_Nicolas_Jozwiak

Copyright © BreizhJug

Et la route est encore longue

Page 10: 20101018_scala_breizh_jug_Romain_Maton_Nicolas_Jozwiak

Copyright © BreizhJug

Scala

C'est 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é

Page 11: 20101018_scala_breizh_jug_Romain_Maton_Nicolas_Jozwiak

Copyright © BreizhJug

Scala

La non nullité, Scala prônera

L'immutabilité, Scala prônera

Tout objet, Scala sera

1+1 <=> (1).+(1)

Page 12: 20101018_scala_breizh_jug_Romain_Maton_Nicolas_Jozwiak

Copyright © BreizhJug

Quelques exemplesInférence

val listStr:Array[String] = new Array[String]val listStr = new Array[String]

Déclaration de fonctions

def multiply(x:Int, y:Int) = x*yMultiply(2, 10)

def multiply(x:Int)(y:Int) = x*yMultiply(2)(10)

def double = multiply(2)(_)double(10)

Page 13: 20101018_scala_breizh_jug_Romain_Maton_Nicolas_Jozwiak

Copyright © BreizhJug

Quelques exemplesListes

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>}

Page 14: 20101018_scala_breizh_jug_Romain_Maton_Nicolas_Jozwiak

Copyright © BreizhJug

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);

Page 15: 20101018_scala_breizh_jug_Romain_Maton_Nicolas_Jozwiak

Copyright © BreizhJug

Quelques exemples

Calculer (3+4) * (4+2)

Round(FixingIndex("Euribor 06 Mois", DateFixing("Prefixe", -2, 0, "Ouvré", "XX-XX"), Spot()), 0.01) + SnowBall()

Page 16: 20101018_scala_breizh_jug_Romain_Maton_Nicolas_Jozwiak

Copyright © BreizhJug

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);

En Scalavar expression = Multiply(Add(Const(3), Const(4)),

Add(Const(4), Const(2)));

val v = new Visiteur();v.evaluate(expression);

Calculer (3+4) * (4+2)

En Java

Page 17: 20101018_scala_breizh_jug_Romain_Maton_Nicolas_Jozwiak

Copyright © BreizhJug

Pattern matching

abstract class Expr

case class Const(n: Int) extends Exprcase class Add(l: Expr, r: Expr) extends Exprcase 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) }

Page 18: 20101018_scala_breizh_jug_Romain_Maton_Nicolas_Jozwiak

Copyright © BreizhJug

Pattern visiteur

Page 19: 20101018_scala_breizh_jug_Romain_Maton_Nicolas_Jozwiak

Copyright © BreizhJug

Pattern visiteurpublic 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); }}

Page 20: 20101018_scala_breizh_jug_Romain_Maton_Nicolas_Jozwiak

Copyright © BreizhJug

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()); } ....}

Page 21: 20101018_scala_breizh_jug_Romain_Maton_Nicolas_Jozwiak

Copyright © BreizhJug

API Actors

Un actor, c'est :

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)

Page 22: 20101018_scala_breizh_jug_Romain_Maton_Nicolas_Jozwiak

Copyright © BreizhJug

Avant : threads

Page 23: 20101018_scala_breizh_jug_Romain_Maton_Nicolas_Jozwiak

Copyright © BreizhJug

Après : actors

Page 24: 20101018_scala_breizh_jug_Romain_Maton_Nicolas_Jozwiak

Copyright © BreizhJug

Les Actors

val printActor = actor { loop { react { case _ => println(text) } }}

printActor ! "foo"printActor ! "bar"

Page 25: 20101018_scala_breizh_jug_Romain_Maton_Nicolas_Jozwiak

Copyright © BreizhJug

Les Actors

val pong = new Pong val ping = new Ping(100000, pong)

ping.start pong.start

Page 26: 20101018_scala_breizh_jug_Romain_Maton_Nicolas_Jozwiak

Copyright © BreizhJug

Les Actors

class Ping(count: int, pong: Actor) extends Actor { def act() { pong ! Ping loop { react { case Pong => pong ! Ping } } }}

Page 27: 20101018_scala_breizh_jug_Romain_Maton_Nicolas_Jozwiak

Copyright © BreizhJug

Les Actors

class Pong extends Actor { def act() { loop { react { case Ping => sender ! Pong } } }}

Page 28: 20101018_scala_breizh_jug_Romain_Maton_Nicolas_Jozwiak

Copyright © BreizhJug

Les Traits

Définition : interfaces permettant de définir des

méthodes/variables abstraites, mais

aussi des méthodes concrètes

Page 29: 20101018_scala_breizh_jug_Romain_Maton_Nicolas_Jozwiak

Copyright © BreizhJug

Les Traitstrait XML { def toString(): String def toXML(): String = "<![CDATA[" + toString() + "]]>"}

class MyObject { override def toString() = "Hello Paris JUG !"}

var myObject = new MyObject with XMLprintln(myObject.toXML)

=> <![CDATA[Hello Paris JUG !]]>

Page 30: 20101018_scala_breizh_jug_Romain_Maton_Nicolas_Jozwiak

Copyright © BreizhJug

Les Traitsabstract class Car { def drive() = { print("Drive an"); }}

trait OilCar extends Car { override def drive = { super.drive(); println(" oil car"); }}

class MyCar extends OilCar {}

trait ElectricalCar extends OilCar { override def drive = { super.drive(); println(" electrical car"); }}

trait LogCar extends Car { abstract override def drive = { println("Entree peage"); super.drive println("Sortie peage"); }}

Page 31: 20101018_scala_breizh_jug_Romain_Maton_Nicolas_Jozwiak

Copyright © BreizhJug

Les Traits

myCar = new MyCar with ElectricalCar with LogCarmyCar.drive

=> Entree peage Drive an oil car electricial car Sortie peage

var myCar = new MyCarmyCar.drive=> Drive an oil car

myCar = new MyCar with ElectricalCarmyCar.drive=> Drive an oil car electricial car

Page 32: 20101018_scala_breizh_jug_Romain_Maton_Nicolas_Jozwiak

Copyright © BreizhJug

Outillage

Plugin Eclipse

Coloration syntaxique, markers

Compatabilité java / scala, trait, fonction...

Difficulté au niveau configuration projet

Plante très souvent

Refactoring difficile

Page 33: 20101018_scala_breizh_jug_Romain_Maton_Nicolas_Jozwiak

Copyright © BreizhJug

Outillage

Plugin IntelliJ

Complétion très bien géréeParfois lent à la compilation

Configuration de projet simple

Très bonne gestion de l'inférence

Page 34: 20101018_scala_breizh_jug_Romain_Maton_Nicolas_Jozwiak

Copyright © BreizhJug

Outillage

Plugin NetBeans

Plugin en version Beta

Coloration syntaxique

Intégration maven

Page 35: 20101018_scala_breizh_jug_Romain_Maton_Nicolas_Jozwiak

Copyright © BreizhJug

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] }}

Page 36: 20101018_scala_breizh_jug_Romain_Maton_Nicolas_Jozwiak

Copyright © BreizhJug

Les frameworks

Tolérance aux pannes

Let it crash ! Don't 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...

: Actors++ !

Page 37: 20101018_scala_breizh_jug_Romain_Maton_Nicolas_Jozwiak

Copyright © BreizhJug

Les frameworks

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 Maven

SBT : Simple Build Tool pour Scala

Page 38: 20101018_scala_breizh_jug_Romain_Maton_Nicolas_Jozwiak

Copyright © BreizhJug

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)

Page 39: 20101018_scala_breizh_jug_Romain_Maton_Nicolas_Jozwiak

Copyright © BreizhJug

Pourquoi faut-il s'y 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 concurrence

Page 40: 20101018_scala_breizh_jug_Romain_Maton_Nicolas_Jozwiak

Copyright © BreizhJug

Difficultés/Challenges

Enrichissement personnel

=> ça fait marcher le cerveau !

Nouveau paradigme

Penser fonctionnel, ça prend du temps

Page 41: 20101018_scala_breizh_jug_Romain_Maton_Nicolas_Jozwiak

Copyright © BreizhJug

Les freins à son adoption

Peut devenir assez vite complexedef foo(l: List[int]): int = (0/:l){_+_}

Problème de maîtrise du langage

Courbe d'apprentissage

Scala dans des parties business critical

Intégration avec Java

Page 42: 20101018_scala_breizh_jug_Romain_Maton_Nicolas_Jozwiak

Copyright © BreizhJug

Programmation fonctionnelleavec 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]

Natif Javascript

Page 43: 20101018_scala_breizh_jug_Romain_Maton_Nicolas_Jozwiak

Copyright © BreizhJug

Programmation fonctionnelleavec 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)

-> 256

Page 44: 20101018_scala_breizh_jug_Romain_Maton_Nicolas_Jozwiak

Copyright © BreizhJug

Scala 2.8

val lignes = List (ligneDeCredit_1, ligneDeCredit_2, ligneDeCredit_3, ligneDeCredit_4);

val(petitTirages, grandsTiranges) = lignes partition (_.montantTirage < 10000);

API collections

val 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)

Page 45: 20101018_scala_breizh_jug_Romain_Maton_Nicolas_Jozwiak

Copyright © BreizhJug

Scala 2.8

Paramètres nommés et par défaut

def pondereProduit (produit:LigneDeCredit, devise:String, pourcentage:Double)

def pondereProduit (produit:LigneDeCredit, devise:String = "EUR", pourcentage:Double)

pondereProduit(pourcentage = 10.0, produit = ligneDeCredit_1, "USD");

Page 46: 20101018_scala_breizh_jug_Romain_Maton_Nicolas_Jozwiak

Copyright © BreizhJug

Le futur

Les annonces :

Collections parallèles

Optimisations des performances

Page 47: 20101018_scala_breizh_jug_Romain_Maton_Nicolas_Jozwiak

Copyright © BreizhJug

Qui utilise Scala ?

Page 48: 20101018_scala_breizh_jug_Romain_Maton_Nicolas_Jozwiak

Copyright © BreizhJug

Conclusion

Essayez-le !!!

Page 49: 20101018_scala_breizh_jug_Romain_Maton_Nicolas_Jozwiak

Copyright © BreizhJug

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)

Page 50: 20101018_scala_breizh_jug_Romain_Maton_Nicolas_Jozwiak

Copyright © BreizhJug

Merci de votre Merci de votre attention !attention !

Page 51: 20101018_scala_breizh_jug_Romain_Maton_Nicolas_Jozwiak

Copyright © BreizhJug

Questions / Réponses ?

Page 52: 20101018_scala_breizh_jug_Romain_Maton_Nicolas_Jozwiak

Copyright © BreizhJug

Licence

http://creativecommons.org/licenses/by-nc-sa/2.0/fr/