SlideShare ist ein Scribd-Unternehmen logo
1 von 38
Downloaden Sie, um offline zu lesen
Practical DSL Design
                       London Groovy & Grails User Group
                               May 17th, 2010

                                 Peter Bell
                            CEO/CTO SystemsForge



Monday, May 17, 2010
Overview
  • What is a DSL?
  • Key Concepts
  • DSL Design
  • Implementing DSLs
  • Additional Considerations
           •      Testing, evolution, documentation,
                  error handling , IDE support




Monday, May 17, 2010
Goals:
  • Understand:
    • What is a DSL
    • Where use one
    • Engineering considerations
  • NOT about syntax



Monday, May 17, 2010
Division of Labor

    •       My Job:
        •      Present ideas


    •       Your Job:
        •      Discriminate, select, adapt, experiment




Monday, May 17, 2010
About Me
   • Programmer: 50-80 projects/yr
   • Entrepreneur: profitable/practical
   • Research:
     • Domain Specific Modeling/DSLs
     • Software Product Lines
   • Writer: GroovyMag, InfoQ, IEEE
              Software, JSMag, Methods & Tools,
              Fusion Authority, Flex Authority . . .
      •       Presenter: ooPSLA, Code
              Generation, BCS SPA . . .

Monday, May 17, 2010
What is a DSL?
      •      Specific to single domain - generally not
             Turing complete (excl. XSLT)
      •      More expressive than GPL within the
             domain
      •      Executable
      •      Examples: SQL, CSS, Regex, PC
             configurator, document workflow rules




Monday, May 17, 2010
What is a DSL? - DSL vs. API
   • Subjective
   • Often facade to API
   • Focus on language nature
   • “Fluent” interface
     API: new event( startTime: "16:00", endTime: "18:00" )
     DSL: new event.from 4.pm, to: 6.pm



Monday, May 17, 2010
What is a DSL? - Benefits
   • Expressive (clear intent, concise)
   • Separate business logic from code
   • Separate lifecycle
   • SME readable (not writable)




Monday, May 17, 2010
What is a DSL? - When Use?
      •       Frequently changing business rules
      •       Interactions with stakeholders
      •       Relatively well understood domain
      •       Typical use cases:
            •      Product family
            •      Platform based development
            •      Configuration
            •      Business rule definitions

Monday, May 17, 2010
Key Concepts
   • Overview:
     • Vertical vs horizontal
     • Abstract vs Concrete
     • Projections
     • Three types of DSL
     • Internal vs. External


Monday, May 17, 2010
Vertical vs. Horizontal
      •       Horizontal: technical domain
            •      SQL, CSS, GORM . . .
            •      More maintainable/readable code
            •      Good enough is good enough
      •       Vertical: business domain
            •      Insurance, PC configurator . . .
            •      Share “code” with SME’s
            •      Readability is key

Monday, May 17, 2010
Abstract vs. Concrete
   • Abstract grammar       <person>
     • what say                <FirstName>Paul</FirstName>
                               <LastName>King</LastName>
   • Concrete syntax        </person>
     • how say new person( firstName: "Paul", lastName: "King" )
                                      person called “Paul “, “ King “

                                                          Paul King




Monday, May 17, 2010
Projections
   • Multiple projections
     • Textual
     • Spreadsheet
     • Visual
     • Form based



Monday, May 17, 2010
Three Broad Types of DSL
   • Internal (embedded)
   • External (parser)
   • Language workbench




Monday, May 17, 2010
Internal vs. External
   • Internal:              • External:
     • Easier to implement • Easier to evolve
     • Power of GPL:         • End user writable (forms)?
       • Loops               • Projectional:
       • Math                  • Forms
       • Conditionals . . .    • Visual
     • Refactor to external    • Spreadsheet

Monday, May 17, 2010
Top Down/Bottom Up
   • Bottom up:
     • Evolve from API (e.g.
                  Hibernate)
          •       Not very expressive, but
                  quick starting point
     •      Top down:
          •       Sketch out UL with
                  stakeholders
          •       Generally better language

Monday, May 17, 2010
General Hints
   • Learn from DDD/UL:
     • Common, rigorous understanding
     • Driven by domain model
     • Involve to SME’s
   • Lots of little languages (e.g. Grails)
     • Bounded contexts
   • Risk:
     • DSL eventually becomes badly designed GPL
     • Think: Ant
Monday, May 17, 2010
Implementing DSLs
   • API
   • Fluent interface
   • Reducing visual noise
   • Config file/XML/Json
   • Simple parser
   • Nested parser


Monday, May 17, 2010
API
   • Good starting point
   • Easy to evolve
   • Often readable enough . . .
     Event salesMeet = new event( startTime: "16:00", endTime: "18:00" )
     Participant Joe = new Participant( firstName: “Joe”, lastName: “Smith” )
     Participant Fred = new Participant( firstName: “Fred”, lastName: “Jones” )
     salesMeet.addParticipant( Joe )
     salesMeet.addParticipant( Fred )




Monday, May 17, 2010
Fluent interface
   • The start of DSLs
   • Language nature
   • Focus on sentence like syntax
                       Event salesMeet = new event( from: 4.pm, to: 6.pm )
                                                  .with( “Joe”, “Smith” )
                                                  .and( “Fred”, “Jones” )




Monday, May 17, 2010
Reducing Visual Noise
   • Flexible and malleable
              syntax
      •       Metaprogramming
      •       AST transformations




     © Guillaume Laforge
Monday, May 17, 2010
Flexible and Malleable Syntax
   • Scripts
   • Optional typing
   • Native syntax constructs
     • (lists, maps)
   • Parentheses/semi omission
   • Named arguments
   • Operator overloading
   • Closures
     © Guillaume Laforge
Monday, May 17, 2010
Metaprogramming
   • PoGo
   • Categories
   • Builders
   • Custom metaclass
   • ExpandoMetaClass


     © Guillaume Laforge
Monday, May 17, 2010
AST Transformations
      •       AST traversal
      •       Local transformations
      •       Global transformations
      •       Hooks into ANTLR




     © Guillaume Laforge
Monday, May 17, 2010
Outcome:
               event from 4.pm to 6.pm
                        .with “Joe” “Smith”
                        .and “Fred” “Jones”




     © Guillaume Laforge
Monday, May 17, 2010
Config File/XML/Json
   • Introduction to external DSLs
   • Easy to load/parse
   • Supports projections and tooling
          <events>
            <event startTime=”16:00” endTime=”18:00”>
              <participants>
                <participant firstname=”Joe” lastName=”Smith” />
                <participant firstname=”Joe” lastName=”Smith” />
              </participants>
            </event>
          <events>


Monday, May 17, 2010
Simple Parser
   • Delimiter directed translation
     • Regex or similar
     • Doesn’t support nesting
     • Only for simplest languages




Monday, May 17, 2010
Nested Parser
   • Syntax directed translation
     • Grammar/parser
     • ANTLR




Monday, May 17, 2010
Additional Considerations
   • Testing
   • Evolution
   • Documentation
   • Error handling
   • IDE support



Monday, May 17, 2010
Testing DSLs
   • Test domain model
   • Test fluent interface
              (expression builder)
            •      Can Compile
            •      Scenarios
            •      Orthogonal test DSLs




Monday, May 17, 2010
DSL Evolution
   • The problem: success!
   • Approaches:
     • No changes
     • Backwards compatibility
     • Versioning
     • Model migrations


Monday, May 17, 2010
Documentation
   • Getting started guide
   • Samples
   • FAQs for common tasks
   • Language reference
   • Some debugging suggestions
   • Not more than API requires
   • Source/regression tests help but
              aren't enough


Monday, May 17, 2010
Error Handling
   • Throw while process = easy
   • Meaningful messages hard




Monday, May 17, 2010
IDE Support
   • Syntax highlighting
   • Code completion
   • Static verification
   • IntelliJ helps . . .
   • If important, consider Xtext/EMF



Monday, May 17, 2010
Conclusions
   • It’s all about the domain
   • Evolve to DSLs
   • API to internal . . .
   • . . . external if required
   • Check Guillaume’s preso
              for syntax
      •       Think about additional
              considerations from day 1



Monday, May 17, 2010
Resources

   History:
   http://www.faqs.org/docs/artu/minilanguageschapter.html

   DSM:
   JP Tolvanen: http://www.metacase.com/blogs/jpt/blogView
   Steve Kelly: http://www.metacase.com/blogs/stevek/blogView
   Markus Voelter: http://www.voelter.de/

   DDD:
   http://domaindrivendesign.org/



Monday, May 17, 2010
Resources (2)
  DSLs:
  Martin Fowler: http://martinfowler.com/dslwip/

  Groovy DSLs:
  Google - Guillaume Laforge, Paul King, Hamlet D’Arcy,Venkat Subramaniam,
  Neil Ford

  DSL Evolution:
  http://www.infoq.com/articles/dsl-evolution

  Books:
  Domain Specific Modeling - Kelly/Tolvanen
  Generative Programming - Czarnecki/Eisenecker
  Domain Driven Design - Evans
Monday, May 17, 2010
The End!
  • http://gettinggroovy.com
  • Email: peter@pbell.com
  • Twitter: peterbell




Monday, May 17, 2010

Weitere ähnliche Inhalte

Ähnlich wie GGUG:Practical DSL Design

GoOpen 2010: David Elboth
GoOpen 2010: David ElbothGoOpen 2010: David Elboth
GoOpen 2010: David Elboth
Friprogsenteret
 
MWLUG 2011: The Never Ending Integration Story
MWLUG 2011: The Never Ending Integration StoryMWLUG 2011: The Never Ending Integration Story
MWLUG 2011: The Never Ending Integration Story
John Head
 
eSynergy Andy Hawkins - Enabling DevOps through next generation configuration...
eSynergy Andy Hawkins - Enabling DevOps through next generation configuration...eSynergy Andy Hawkins - Enabling DevOps through next generation configuration...
eSynergy Andy Hawkins - Enabling DevOps through next generation configuration...
PatrickCrompton
 
Los Angeles R users group - Nov 17 2010 - Part 2
Los Angeles R users group - Nov 17 2010 - Part 2Los Angeles R users group - Nov 17 2010 - Part 2
Los Angeles R users group - Nov 17 2010 - Part 2
rusersla
 

Ähnlich wie GGUG:Practical DSL Design (20)

An introduction to go programming language
An introduction to go programming languageAn introduction to go programming language
An introduction to go programming language
 
GoOpen 2010: David Elboth
GoOpen 2010: David ElbothGoOpen 2010: David Elboth
GoOpen 2010: David Elboth
 
Debugging and Profiling Symfony Apps
Debugging and Profiling Symfony AppsDebugging and Profiling Symfony Apps
Debugging and Profiling Symfony Apps
 
Integrating ECM (WebCenter Content) with your Enterprise! 5 Tips to Try, 5 Tr...
Integrating ECM (WebCenter Content) with your Enterprise! 5 Tips to Try, 5 Tr...Integrating ECM (WebCenter Content) with your Enterprise! 5 Tips to Try, 5 Tr...
Integrating ECM (WebCenter Content) with your Enterprise! 5 Tips to Try, 5 Tr...
 
BRAINREPUBLIC - Powered by no-SQL
BRAINREPUBLIC - Powered by no-SQLBRAINREPUBLIC - Powered by no-SQL
BRAINREPUBLIC - Powered by no-SQL
 
Rust 101 (2017 edition)
Rust 101 (2017 edition)Rust 101 (2017 edition)
Rust 101 (2017 edition)
 
Beyond Java: Go for Java developers
Beyond Java: Go for Java developersBeyond Java: Go for Java developers
Beyond Java: Go for Java developers
 
150603 go go-beyond-vckovski-jugs
150603 go go-beyond-vckovski-jugs150603 go go-beyond-vckovski-jugs
150603 go go-beyond-vckovski-jugs
 
Introduction to webprogramming using PHP and MySQL
Introduction to webprogramming using PHP and MySQLIntroduction to webprogramming using PHP and MySQL
Introduction to webprogramming using PHP and MySQL
 
Ruby tutorial
Ruby tutorialRuby tutorial
Ruby tutorial
 
MWLUG 2011: The Never Ending Integration Story
MWLUG 2011: The Never Ending Integration StoryMWLUG 2011: The Never Ending Integration Story
MWLUG 2011: The Never Ending Integration Story
 
OpenDocument Scripting
OpenDocument ScriptingOpenDocument Scripting
OpenDocument Scripting
 
Node.js and Ruby
Node.js and RubyNode.js and Ruby
Node.js and Ruby
 
Becoming an Open Source developer, Dimitris Andreadis
Becoming an Open Source developer, Dimitris AndreadisBecoming an Open Source developer, Dimitris Andreadis
Becoming an Open Source developer, Dimitris Andreadis
 
MyIBBT - Project Collaboration with Alfresco Share
MyIBBT - Project Collaboration with Alfresco ShareMyIBBT - Project Collaboration with Alfresco Share
MyIBBT - Project Collaboration with Alfresco Share
 
eSynergy Andy Hawkins - Enabling DevOps through next generation configuration...
eSynergy Andy Hawkins - Enabling DevOps through next generation configuration...eSynergy Andy Hawkins - Enabling DevOps through next generation configuration...
eSynergy Andy Hawkins - Enabling DevOps through next generation configuration...
 
Mobile Development with uPortal and Infusion
Mobile Development with uPortal and InfusionMobile Development with uPortal and Infusion
Mobile Development with uPortal and Infusion
 
Operational MongoDB
Operational MongoDBOperational MongoDB
Operational MongoDB
 
Evergreen Documentation Lightning Talk
Evergreen Documentation Lightning TalkEvergreen Documentation Lightning Talk
Evergreen Documentation Lightning Talk
 
Los Angeles R users group - Nov 17 2010 - Part 2
Los Angeles R users group - Nov 17 2010 - Part 2Los Angeles R users group - Nov 17 2010 - Part 2
Los Angeles R users group - Nov 17 2010 - Part 2
 

Mehr von Skills Matter

Oscar reiken jr on our success at manheim
Oscar reiken jr on our success at manheimOscar reiken jr on our success at manheim
Oscar reiken jr on our success at manheim
Skills Matter
 
Russ miles-cloudfoundry-deep-dive
Russ miles-cloudfoundry-deep-diveRuss miles-cloudfoundry-deep-dive
Russ miles-cloudfoundry-deep-dive
Skills Matter
 
I went to_a_communications_workshop_and_they_t
I went to_a_communications_workshop_and_they_tI went to_a_communications_workshop_and_they_t
I went to_a_communications_workshop_and_they_t
Skills Matter
 

Mehr von Skills Matter (20)

5 things cucumber is bad at by Richard Lawrence
5 things cucumber is bad at by Richard Lawrence5 things cucumber is bad at by Richard Lawrence
5 things cucumber is bad at by Richard Lawrence
 
Patterns for slick database applications
Patterns for slick database applicationsPatterns for slick database applications
Patterns for slick database applications
 
Scala e xchange 2013 haoyi li on metascala a tiny diy jvm
Scala e xchange 2013 haoyi li on metascala a tiny diy jvmScala e xchange 2013 haoyi li on metascala a tiny diy jvm
Scala e xchange 2013 haoyi li on metascala a tiny diy jvm
 
Oscar reiken jr on our success at manheim
Oscar reiken jr on our success at manheimOscar reiken jr on our success at manheim
Oscar reiken jr on our success at manheim
 
Progressive f# tutorials nyc dmitry mozorov & jack pappas on code quotations ...
Progressive f# tutorials nyc dmitry mozorov & jack pappas on code quotations ...Progressive f# tutorials nyc dmitry mozorov & jack pappas on code quotations ...
Progressive f# tutorials nyc dmitry mozorov & jack pappas on code quotations ...
 
Cukeup nyc ian dees on elixir, erlang, and cucumberl
Cukeup nyc ian dees on elixir, erlang, and cucumberlCukeup nyc ian dees on elixir, erlang, and cucumberl
Cukeup nyc ian dees on elixir, erlang, and cucumberl
 
Cukeup nyc peter bell on getting started with cucumber.js
Cukeup nyc peter bell on getting started with cucumber.jsCukeup nyc peter bell on getting started with cucumber.js
Cukeup nyc peter bell on getting started with cucumber.js
 
Agile testing & bdd e xchange nyc 2013 jeffrey davidson & lav pathak & sam ho...
Agile testing & bdd e xchange nyc 2013 jeffrey davidson & lav pathak & sam ho...Agile testing & bdd e xchange nyc 2013 jeffrey davidson & lav pathak & sam ho...
Agile testing & bdd e xchange nyc 2013 jeffrey davidson & lav pathak & sam ho...
 
Progressive f# tutorials nyc rachel reese & phil trelford on try f# from zero...
Progressive f# tutorials nyc rachel reese & phil trelford on try f# from zero...Progressive f# tutorials nyc rachel reese & phil trelford on try f# from zero...
Progressive f# tutorials nyc rachel reese & phil trelford on try f# from zero...
 
Progressive f# tutorials nyc don syme on keynote f# in the open source world
Progressive f# tutorials nyc don syme on keynote f# in the open source worldProgressive f# tutorials nyc don syme on keynote f# in the open source world
Progressive f# tutorials nyc don syme on keynote f# in the open source world
 
Agile testing & bdd e xchange nyc 2013 gojko adzic on bond villain guide to s...
Agile testing & bdd e xchange nyc 2013 gojko adzic on bond villain guide to s...Agile testing & bdd e xchange nyc 2013 gojko adzic on bond villain guide to s...
Agile testing & bdd e xchange nyc 2013 gojko adzic on bond villain guide to s...
 
Dmitry mozorov on code quotations code as-data for f#
Dmitry mozorov on code quotations code as-data for f#Dmitry mozorov on code quotations code as-data for f#
Dmitry mozorov on code quotations code as-data for f#
 
A poet's guide_to_acceptance_testing
A poet's guide_to_acceptance_testingA poet's guide_to_acceptance_testing
A poet's guide_to_acceptance_testing
 
Russ miles-cloudfoundry-deep-dive
Russ miles-cloudfoundry-deep-diveRuss miles-cloudfoundry-deep-dive
Russ miles-cloudfoundry-deep-dive
 
Serendipity-neo4j
Serendipity-neo4jSerendipity-neo4j
Serendipity-neo4j
 
Simon Peyton Jones: Managing parallelism
Simon Peyton Jones: Managing parallelismSimon Peyton Jones: Managing parallelism
Simon Peyton Jones: Managing parallelism
 
Plug 20110217
Plug   20110217Plug   20110217
Plug 20110217
 
Lug presentation
Lug presentationLug presentation
Lug presentation
 
I went to_a_communications_workshop_and_they_t
I went to_a_communications_workshop_and_they_tI went to_a_communications_workshop_and_they_t
I went to_a_communications_workshop_and_they_t
 
Plug saiku
Plug   saikuPlug   saiku
Plug saiku
 

Kürzlich hochgeladen

Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
vu2urc
 

Kürzlich hochgeladen (20)

Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreter
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 

GGUG:Practical DSL Design

  • 1. Practical DSL Design London Groovy & Grails User Group May 17th, 2010 Peter Bell CEO/CTO SystemsForge Monday, May 17, 2010
  • 2. Overview • What is a DSL? • Key Concepts • DSL Design • Implementing DSLs • Additional Considerations • Testing, evolution, documentation, error handling , IDE support Monday, May 17, 2010
  • 3. Goals: • Understand: • What is a DSL • Where use one • Engineering considerations • NOT about syntax Monday, May 17, 2010
  • 4. Division of Labor • My Job: • Present ideas • Your Job: • Discriminate, select, adapt, experiment Monday, May 17, 2010
  • 5. About Me • Programmer: 50-80 projects/yr • Entrepreneur: profitable/practical • Research: • Domain Specific Modeling/DSLs • Software Product Lines • Writer: GroovyMag, InfoQ, IEEE Software, JSMag, Methods & Tools, Fusion Authority, Flex Authority . . . • Presenter: ooPSLA, Code Generation, BCS SPA . . . Monday, May 17, 2010
  • 6. What is a DSL? • Specific to single domain - generally not Turing complete (excl. XSLT) • More expressive than GPL within the domain • Executable • Examples: SQL, CSS, Regex, PC configurator, document workflow rules Monday, May 17, 2010
  • 7. What is a DSL? - DSL vs. API • Subjective • Often facade to API • Focus on language nature • “Fluent” interface API: new event( startTime: "16:00", endTime: "18:00" ) DSL: new event.from 4.pm, to: 6.pm Monday, May 17, 2010
  • 8. What is a DSL? - Benefits • Expressive (clear intent, concise) • Separate business logic from code • Separate lifecycle • SME readable (not writable) Monday, May 17, 2010
  • 9. What is a DSL? - When Use? • Frequently changing business rules • Interactions with stakeholders • Relatively well understood domain • Typical use cases: • Product family • Platform based development • Configuration • Business rule definitions Monday, May 17, 2010
  • 10. Key Concepts • Overview: • Vertical vs horizontal • Abstract vs Concrete • Projections • Three types of DSL • Internal vs. External Monday, May 17, 2010
  • 11. Vertical vs. Horizontal • Horizontal: technical domain • SQL, CSS, GORM . . . • More maintainable/readable code • Good enough is good enough • Vertical: business domain • Insurance, PC configurator . . . • Share “code” with SME’s • Readability is key Monday, May 17, 2010
  • 12. Abstract vs. Concrete • Abstract grammar <person> • what say <FirstName>Paul</FirstName> <LastName>King</LastName> • Concrete syntax </person> • how say new person( firstName: "Paul", lastName: "King" ) person called “Paul “, “ King “ Paul King Monday, May 17, 2010
  • 13. Projections • Multiple projections • Textual • Spreadsheet • Visual • Form based Monday, May 17, 2010
  • 14. Three Broad Types of DSL • Internal (embedded) • External (parser) • Language workbench Monday, May 17, 2010
  • 15. Internal vs. External • Internal: • External: • Easier to implement • Easier to evolve • Power of GPL: • End user writable (forms)? • Loops • Projectional: • Math • Forms • Conditionals . . . • Visual • Refactor to external • Spreadsheet Monday, May 17, 2010
  • 16. Top Down/Bottom Up • Bottom up: • Evolve from API (e.g. Hibernate) • Not very expressive, but quick starting point • Top down: • Sketch out UL with stakeholders • Generally better language Monday, May 17, 2010
  • 17. General Hints • Learn from DDD/UL: • Common, rigorous understanding • Driven by domain model • Involve to SME’s • Lots of little languages (e.g. Grails) • Bounded contexts • Risk: • DSL eventually becomes badly designed GPL • Think: Ant Monday, May 17, 2010
  • 18. Implementing DSLs • API • Fluent interface • Reducing visual noise • Config file/XML/Json • Simple parser • Nested parser Monday, May 17, 2010
  • 19. API • Good starting point • Easy to evolve • Often readable enough . . . Event salesMeet = new event( startTime: "16:00", endTime: "18:00" ) Participant Joe = new Participant( firstName: “Joe”, lastName: “Smith” ) Participant Fred = new Participant( firstName: “Fred”, lastName: “Jones” ) salesMeet.addParticipant( Joe ) salesMeet.addParticipant( Fred ) Monday, May 17, 2010
  • 20. Fluent interface • The start of DSLs • Language nature • Focus on sentence like syntax Event salesMeet = new event( from: 4.pm, to: 6.pm ) .with( “Joe”, “Smith” ) .and( “Fred”, “Jones” ) Monday, May 17, 2010
  • 21. Reducing Visual Noise • Flexible and malleable syntax • Metaprogramming • AST transformations © Guillaume Laforge Monday, May 17, 2010
  • 22. Flexible and Malleable Syntax • Scripts • Optional typing • Native syntax constructs • (lists, maps) • Parentheses/semi omission • Named arguments • Operator overloading • Closures © Guillaume Laforge Monday, May 17, 2010
  • 23. Metaprogramming • PoGo • Categories • Builders • Custom metaclass • ExpandoMetaClass © Guillaume Laforge Monday, May 17, 2010
  • 24. AST Transformations • AST traversal • Local transformations • Global transformations • Hooks into ANTLR © Guillaume Laforge Monday, May 17, 2010
  • 25. Outcome: event from 4.pm to 6.pm .with “Joe” “Smith” .and “Fred” “Jones” © Guillaume Laforge Monday, May 17, 2010
  • 26. Config File/XML/Json • Introduction to external DSLs • Easy to load/parse • Supports projections and tooling <events> <event startTime=”16:00” endTime=”18:00”> <participants> <participant firstname=”Joe” lastName=”Smith” /> <participant firstname=”Joe” lastName=”Smith” /> </participants> </event> <events> Monday, May 17, 2010
  • 27. Simple Parser • Delimiter directed translation • Regex or similar • Doesn’t support nesting • Only for simplest languages Monday, May 17, 2010
  • 28. Nested Parser • Syntax directed translation • Grammar/parser • ANTLR Monday, May 17, 2010
  • 29. Additional Considerations • Testing • Evolution • Documentation • Error handling • IDE support Monday, May 17, 2010
  • 30. Testing DSLs • Test domain model • Test fluent interface (expression builder) • Can Compile • Scenarios • Orthogonal test DSLs Monday, May 17, 2010
  • 31. DSL Evolution • The problem: success! • Approaches: • No changes • Backwards compatibility • Versioning • Model migrations Monday, May 17, 2010
  • 32. Documentation • Getting started guide • Samples • FAQs for common tasks • Language reference • Some debugging suggestions • Not more than API requires • Source/regression tests help but aren't enough Monday, May 17, 2010
  • 33. Error Handling • Throw while process = easy • Meaningful messages hard Monday, May 17, 2010
  • 34. IDE Support • Syntax highlighting • Code completion • Static verification • IntelliJ helps . . . • If important, consider Xtext/EMF Monday, May 17, 2010
  • 35. Conclusions • It’s all about the domain • Evolve to DSLs • API to internal . . . • . . . external if required • Check Guillaume’s preso for syntax • Think about additional considerations from day 1 Monday, May 17, 2010
  • 36. Resources History: http://www.faqs.org/docs/artu/minilanguageschapter.html DSM: JP Tolvanen: http://www.metacase.com/blogs/jpt/blogView Steve Kelly: http://www.metacase.com/blogs/stevek/blogView Markus Voelter: http://www.voelter.de/ DDD: http://domaindrivendesign.org/ Monday, May 17, 2010
  • 37. Resources (2) DSLs: Martin Fowler: http://martinfowler.com/dslwip/ Groovy DSLs: Google - Guillaume Laforge, Paul King, Hamlet D’Arcy,Venkat Subramaniam, Neil Ford DSL Evolution: http://www.infoq.com/articles/dsl-evolution Books: Domain Specific Modeling - Kelly/Tolvanen Generative Programming - Czarnecki/Eisenecker Domain Driven Design - Evans Monday, May 17, 2010
  • 38. The End! • http://gettinggroovy.com • Email: peter@pbell.com • Twitter: peterbell Monday, May 17, 2010