Domain-Specific Languages avec le langage Groovy Guillaume Laforge VP Technology G2One, Inc.
<ul><li>VP Technology de G2One </li></ul><ul><ul><li>[email_address] </li></ul></ul><ul><li>Chef de projet du langage Groo...
Le but de cette présentation <ul><li>Expliquer </li></ul><ul><ul><li>Ce que sont les Domain-Specific Languages </li></ul><...
DSL ? Késako ! <ul><li>DSL : Domain-Specific Language </li></ul><ul><li>Un langage informatique spécifique à un  domaine p...
Les caractéristiques d’un DSL <ul><li>C’est un langage </li></ul><ul><ul><li>Qui n’est pas forcément Turing complet </li><...
Quelques exemples connus <ul><li>Technique </li></ul><ul><ul><li>SELECT * FROM USER WHERE NAME LIKE ‘Guil%’ </li></ul></ul...
Mais pourquoi créer un DSL ? <ul><li>Pour avoir un langage  plus expressif  et  plus lisible  qu’un langage de programmati...
Vers du code métier lisible ? Densité  sémantique métier 20%
Vers du code métier lisible ? 80%
Groovy à la rescousse Les techniques pour implémenter des DSLs en utilisant le langage dynamique Groovy pour la machine vi...
Mais déjà, qu’est-ce que Groovy ? <ul><li>Groovy est un  langage dynamique  alternatif pour la JVM </li></ul><ul><ul><li>C...
La différence avec Java ? <ul><li>Java est un langage statiquement compilé </li></ul><ul><ul><li>Le comportement total du ...
Rajouter des propriétés à des nombres <ul><li>Tout est objet  en Groovy, m ême les nombres </li></ul><ul><li>Par intercept...
Surcharge d’opérateurs <ul><li>Surcharge par implémentation de méthodes </li></ul><ul><ul><li>+ a.plus(b) </li></ul></ul><...
BigDecimal et surcharge <ul><li>Par défaut, les nombres à virgule sont des BigDecimal </li></ul><ul><ul><li>Idéal pour le ...
Syntaxe malléable <ul><li>Parenthèses et point-virgule optionnels </li></ul><ul><ul><li>move left </li></ul></ul><ul><li>P...
Le concept de « builder » <ul><li>Support du pattern « builder » au niveau syntaxique </li></ul><ul><ul><li>Gr âce à des a...
Structures de contr ôle customisées <ul><li>Raccourci de notation pour un appel de méthode avec une closure comme dernier ...
Intégrer un DSL Groovy  dans une application Java JSR-223: javax.script.* Mécanismes spécifiques Groovy Spring 2 dynamic b...
JSR-223 : javax.script.* <ul><li>Dans JDK 6, nouvelle API basique  pour manipuler et intégrer les langages de script </li>...
Mécanismes Groovy <ul><li>Groovy propose plusieurs mécanismes </li></ul><ul><ul><li>Eval  : pour évaluer des expressions s...
Beans dynamiques dans Spring 2 <ul><li>Des beans peuvent  être configurés avec des langages alternatifs tels que Groovy </...
Considérations à garder à l’esprit S’assurer de l’adoption du DSL Suivre un processus itératif Techniques défensives de pr...
S’assurer de l’adoption d’un DSL <ul><li>Ne pas forcer l’adoption ! </li></ul><ul><li>Faire en sorte que les utilisateurs ...
Suivre un processus itératif <ul><li>Commencer simple, avec les concepts primordiaux </li></ul><ul><li>Se rappeler qu’on n...
Programmation défensive <ul><li>Exécuter un DSL de type « embedded » peut -être dangereux ! </li></ul><ul><ul><li>System.e...
Conclusion : Vers plus d’expressivité
Conclusion <ul><li>Les DSLs sont un excellent moyen  pour partager une métaphore commune  entre développeurs et experts mé...
Questions / Réponses [email_address]
Upcoming SlideShare
Loading in …5
×

Domain-Specific Languages avec Groovy

4,740 views
4,659 views

Published on

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

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

No notes for slide

Domain-Specific Languages avec Groovy

  1. 1. Domain-Specific Languages avec le langage Groovy Guillaume Laforge VP Technology G2One, Inc.
  2. 2. <ul><li>VP Technology de G2One </li></ul><ul><ul><li>[email_address] </li></ul></ul><ul><li>Chef de projet du langage Groovy </li></ul><ul><li>Spec Lead JSR-241 </li></ul><ul><li>Initiateur du framework web Grails </li></ul><ul><li>Speaker </li></ul><ul><ul><li>JavaOne, JavaPolis, QCon, JAX Spring Experience, TSSJS… </li></ul></ul><ul><li>Co-auteur du livre Groovy in Action </li></ul>Guillaume Laforge
  3. 3. Le but de cette présentation <ul><li>Expliquer </li></ul><ul><ul><li>Ce que sont les Domain-Specific Languages </li></ul></ul><ul><ul><li>Où et quand utiliser un DSL </li></ul></ul><ul><li>Montrer </li></ul><ul><ul><li>Les techniques pour implémenter un DSL en Groovy </li></ul></ul><ul><ul><li>Comment intégrer un DSL dans une application Java </li></ul></ul><ul><ul><li>Les considérations à garder à l’esprit </li></ul></ul>
  4. 4. DSL ? Késako ! <ul><li>DSL : Domain-Specific Language </li></ul><ul><li>Un langage informatique spécifique à un domaine particulier , qui modélise des concepts métier rattachés à des constructions syntaxiques de ce langage </li></ul>
  5. 5. Les caractéristiques d’un DSL <ul><li>C’est un langage </li></ul><ul><ul><li>Qui n’est pas forcément Turing complet </li></ul></ul><ul><li>Couvre un domaine particulier de connaissance </li></ul><ul><li>Possède une forme : visuelle ou textuelle </li></ul><ul><li>Produit un résultat </li></ul><ul><ul><li>Configure des objets, représente une structure de données… </li></ul></ul><ul><li>Peut être « interne » ou « externe » </li></ul><ul><ul><li>Internal / embedded DSL : utilise un langage h ôte </li></ul></ul><ul><ul><li>Autonome : avec son propre parseur / lexeur / compilateur </li></ul></ul><ul><li>Possède certains attributs de qualité </li></ul><ul><ul><li>Facile à écrire et à utiliser, testable, évolutif </li></ul></ul>
  6. 6. Quelques exemples connus <ul><li>Technique </li></ul><ul><ul><li>SELECT * FROM USER WHERE NAME LIKE ‘Guil%’ </li></ul></ul><ul><ul><li>^[w-.]+@([w-]+.)+[w-]{2,4}$ </li></ul></ul><ul><li>Notation </li></ul><ul><ul><li>1. e4 e5 2. Nf3 Nc6 3. Bb5 a6. </li></ul></ul><ul><ul><li>U R' U2 R U R' U R </li></ul></ul><ul><li>Métier </li></ul><ul><ul><li>Expression des règles de calcul de risque sur des polices d’assurance </li></ul></ul><ul><ul><li>Schéma comptable d’une banque </li></ul></ul><ul><ul><li>Représentation des compétences pour les ressources humaines </li></ul></ul><ul><ul><li>Simulation de la résistance aux médicaments anti-malaria </li></ul></ul>
  7. 7. Mais pourquoi créer un DSL ? <ul><li>Pour avoir un langage plus expressif et plus lisible qu’un langage de programmation généraliste </li></ul><ul><li>Partager une métaphore commune entre tous les acteurs d’un m ême projet </li></ul><ul><li>Permettre aux experts métier d’aider au développement de règles métier complexes </li></ul><ul><li>Eviter de noyer son code métier avec trop de code technique environnant </li></ul><ul><li>Séparer plus proprement le code métier du code applicatif technique </li></ul><ul><li>Donner au code métier son propre cycle de vie </li></ul>
  8. 8. Vers du code métier lisible ? Densité sémantique métier 20%
  9. 9. Vers du code métier lisible ? 80%
  10. 10. Groovy à la rescousse Les techniques pour implémenter des DSLs en utilisant le langage dynamique Groovy pour la machine virtuelle Java
  11. 11. Mais déjà, qu’est-ce que Groovy ? <ul><li>Groovy est un langage dynamique alternatif pour la JVM </li></ul><ul><ul><li>Compilé en bytecode Java ou interprété </li></ul></ul><ul><li>Projet Open Source (licence Apache) </li></ul><ul><ul><li>Hébergé par la communauté Codehaus </li></ul></ul><ul><li>Syntaxe dérivée de Java , mais plus souple </li></ul><ul><li>Reprend des idées de Smalltalk, Ruby et Python </li></ul><ul><li>Syntaxe native </li></ul><ul><ul><li>Listes, dictionnaires, intervalles, expression régulières </li></ul></ul><ul><li>Supporte le typage optionnel </li></ul><ul><ul><li>Typage dynamique ou typage statique au choix </li></ul></ul><ul><li>Fonctionnalités avancées </li></ul><ul><ul><li>Closures , properties, surcharge d’opérateurs … </li></ul></ul>
  12. 12. La différence avec Java ? <ul><li>Java est un langage statiquement compilé </li></ul><ul><ul><li>Le comportement total du code est gravé dans le marbre (dans le bytecode que la JVM exécute) </li></ul></ul><ul><li>Les langages dynamiques comme Groovy </li></ul><ul><ul><li>Peuvent modifier le comportement du code à l’exécution au travers du « MetaObject Protocol » (on peut m ême écrire 1+1==1 !) </li></ul></ul><ul><ul><li>Interception d’appel de méthode, de propriété (m ême inexistante !) </li></ul></ul><ul><ul><li>Surcharge d’opérateur, création de structures de contrôle, etc. </li></ul></ul>
  13. 13. Rajouter des propriétés à des nombres <ul><li>Tout est objet en Groovy, m ême les nombres </li></ul><ul><li>Par interception de l’accès aux propriétés </li></ul><ul><li>Number.metaClass.getEuros = { new CurrencyAmount(delegate, Currency.EUROS) } </li></ul><ul><li>Exemples </li></ul><ul><ul><li>30.euros </li></ul></ul><ul><ul><li>4.pills </li></ul></ul><ul><ul><li>50.kilo.meters </li></ul></ul>
  14. 14. Surcharge d’opérateurs <ul><li>Surcharge par implémentation de méthodes </li></ul><ul><ul><li>+ a.plus(b) </li></ul></ul><ul><ul><li>- a.minus(b) </li></ul></ul><ul><ul><li>* a.multiply(b) </li></ul></ul><ul><ul><li>/ a.divide(b) </li></ul></ul><ul><ul><li>% a.modulo(b) </li></ul></ul><ul><ul><li>| a.or(b) </li></ul></ul><ul><ul><li>& a.and(b) </li></ul></ul><ul><ul><li>a[b] a.getAt(b) </li></ul></ul><ul><ul><li>a << b a.leftShift(b) </li></ul></ul><ul><li>Monnaies </li></ul><ul><ul><li>30.euros + 15.euros </li></ul></ul><ul><li>Distances </li></ul><ul><ul><li>12.kilo.meters + 300.meters </li></ul></ul><ul><li>Workflow, concurrence </li></ul><ul><ul><li>taskA | taskB & taskC </li></ul></ul><ul><li>Créditer un compte </li></ul><ul><ul><li>account << 10.euros </li></ul></ul><ul><ul><li>Account += 10.euros </li></ul></ul>
  15. 15. BigDecimal et surcharge <ul><li>Par défaut, les nombres à virgule sont des BigDecimal </li></ul><ul><ul><li>Idéal pour le calcul exact (pas d’erreur d’arrondi) </li></ul></ul><ul><ul><li>Important dans la banque / finance / assurance </li></ul></ul><ul><li>Mutual of Omaha, assurance américaine (Fortune 500) </li></ul><ul><ul><li>Utilise Groovy pour son moteur de calcul de risque </li></ul></ul><ul><ul><li>Expressivité des règles de calcul </li></ul></ul>BigDecimal uMinusv = c.subtract(a); BigDecimal vMinusl = b.subtract(c); BigDecimal uMinusl = a.subtract(b); return e.multiply(uMinusv) .add(d.multiply(vMinusl)) .divide(uMinusl, 10, BigDecimal.ROUND_HALF_UP); (d * (b - c) + e * (c - a)) / (a - b)
  16. 16. Syntaxe malléable <ul><li>Parenthèses et point-virgule optionnels </li></ul><ul><ul><li>move left </li></ul></ul><ul><li>Paramètres nommés </li></ul><ul><ul><li>monster.move x: 3.meters, y: 4.meters </li></ul></ul><ul><ul><li>compare indicator: ‘NIKEI’, withFund: ‘Aberdeen’ </li></ul></ul><ul><li>Syntaxe native </li></ul><ul><ul><li>Liste : [Monday, Wednesday, Friday] </li></ul></ul><ul><ul><li>Dictionnaire : [buy: 300.GOOG, sell: 1000.MSFT] </li></ul></ul><ul><ul><li>Intervalles : Monday..Friday </li></ul></ul>
  17. 17. Le concept de « builder » <ul><li>Support du pattern « builder » au niveau syntaxique </li></ul><ul><ul><li>Gr âce à des appels de méthodes chaînées et de passage de c losures en paramètre </li></ul></ul>etre { idees { capture 2 formule 3 produit 4 } } faire { build { J2EE 4 } }
  18. 18. Structures de contr ôle customisées <ul><li>Raccourci de notation pour un appel de méthode avec une closure comme dernier paramètre </li></ul><ul><ul><li>unless(account.balance < 0, { account.debit 10.euros }) </li></ul></ul><ul><ul><li>unless(account.balance< 0) { account.debit 10.euros } </li></ul></ul><ul><li>Quelques idées </li></ul><ul><ul><li>withLock(lock) { … } </li></ul></ul><ul><ul><li>transactional { … } </li></ul></ul><ul><ul><li>execute (in: 3.hours) { } </li></ul></ul>
  19. 19. Intégrer un DSL Groovy dans une application Java JSR-223: javax.script.* Mécanismes spécifiques Groovy Spring 2 dynamic beans
  20. 20. JSR-223 : javax.script.* <ul><li>Dans JDK 6, nouvelle API basique pour manipuler et intégrer les langages de script </li></ul><ul><li>Scripting.dev.java.net propose un moteur pour Groovy </li></ul><ul><ul><li>à mettre dans son classpath avec les JARs Groovy </li></ul></ul><ul><li>ScriptEngineManager mgr = new ScriptEngineManager(); ScriptEngine engine = mgr.getEngineByName(‘groovy’); String result = (String)engine.eval(« ’foo’ * 2 »); </li></ul>
  21. 21. Mécanismes Groovy <ul><li>Groovy propose plusieurs mécanismes </li></ul><ul><ul><li>Eval : pour évaluer des expressions simples </li></ul></ul><ul><ul><li>GroovyShell : pour intéragir avec des scripts et expressions complexes </li></ul></ul><ul><ul><li>GroovyScriptEngine : lorsqu’il y a des dépendances entre scripts </li></ul></ul><ul><ul><li>GroovyClassLoader : mécanisme le plus puissant à la base de tous les autres </li></ul></ul><ul><li>Bien que propriétaires, ce sont les mécanismes les plus puissants pour écrire et intégrer des DSLs dans une application Java </li></ul>
  22. 22. Beans dynamiques dans Spring 2 <ul><li>Des beans peuvent être configurés avec des langages alternatifs tels que Groovy </li></ul><ul><ul><li>Un POGO peut-être configuré / proxifié / injecté </li></ul></ul><ul><ul><li>Interopérabilité avec POJO transparente </li></ul></ul><ul><ul><li>On peut mixer Java et Groovy ensemble </li></ul></ul><ul><li>Nouveau namespace <lang:groovy/> </li></ul><ul><ul><li>Possibilité de rechargement à chaud sur modification </li></ul></ul><ul><ul><li>Personnalisation du comportement au runtime </li></ul></ul><lang:groovy id=&quot;events&quot; script-source=&quot;classpath:dsl/eventsChart.groovy&quot; customizer-ref=&quot;eventsMetaClass&quot; />
  23. 23. Considérations à garder à l’esprit S’assurer de l’adoption du DSL Suivre un processus itératif Techniques défensives de programmation
  24. 24. S’assurer de l’adoption d’un DSL <ul><li>Ne pas forcer l’adoption ! </li></ul><ul><li>Faire en sorte que les utilisateurs finaux construisent leur propre langage (avec notre aide) </li></ul><ul><ul><li>Ne pas le créer seul devant son écran </li></ul></ul><ul><ul><li>Impliquer les utilisateurs régulièrement à chaque évolution ou nouveau concept métier à représenter </li></ul></ul><ul><ul><li>Etudier comment ils emploient ce DSL, pour l’améliorer </li></ul></ul><ul><li>Guider les utilisateurs pour leur indiquer ce qu’il est possible de faire avec Groovy </li></ul>
  25. 25. Suivre un processus itératif <ul><li>Commencer simple, avec les concepts primordiaux </li></ul><ul><li>Se rappeler qu’on n’a jamais tout bon la première fois </li></ul><ul><li>Retourner brainstormer avec les experts métier pour une amélioration continue du DSL </li></ul><ul><li>Tester continuellement </li></ul>
  26. 26. Programmation défensive <ul><li>Exécuter un DSL de type « embedded » peut -être dangereux ! </li></ul><ul><ul><li>System.exit(0); </li></ul></ul><ul><li>Un DSL doit tourner dans un « bac à sable » </li></ul><ul><li>Tester, tester, tester ! </li></ul><ul><ul><li>Echouer avec gr âce en donnant toujours des messages d’erreurs lisibles </li></ul></ul><ul><ul><li>Ne pas tester que les cas valides, tester explicitement les erreurs </li></ul></ul>
  27. 27. Conclusion : Vers plus d’expressivité
  28. 28. Conclusion <ul><li>Les DSLs sont un excellent moyen pour partager une métaphore commune entre développeurs et experts métier </li></ul><ul><li>Ils permettent de se focaliser sur le métier , en masquant une grande partie du code technique </li></ul><ul><li>Externalisation possible, cycle de vie distinct </li></ul><ul><li>Groovy est idéal de par sa nature et sa syntaxe malléable pour d’écrire des DSLs de type « embedded » </li></ul><ul><li>Toujours garder les considérations en t ête pour s’assurer de l’adoption et la bonne évolution de son DSL </li></ul>
  29. 29. Questions / Réponses [email_address]

×