ggug:practical dsl design
DESCRIPTION
What are some practical uses for Domain Specific Languages (DSL)? And how do you go about designing DSLs, implementing them in Groovy, creating tests for your models and evolving the structure of the languages over time? In this fast paced session, Peter Bell will examine a real world Groovy DSL, how it was designed and implemented, the testing strategies employed and the options for evolving the structure (grammar) of the DSL. If you've built DSLs but want to go further, or if you've still not figured out how a DSL might help you to build better, more maintainable apps more quickly and easily, come along and learn more about creating practical, maintainable DSLs for your projects. Just a thought . . . If you are interested in this talk you might also be interested in Core Gradle: Gradle, a Build System for Java Workshop and Graeme Rocher's Groovy and Grails WorkshopTRANSCRIPT
![Page 1: GGUG:Practical DSL Design](https://reader034.vdocument.in/reader034/viewer/2022051819/54c6cd484a795922028b4573/html5/thumbnails/1.jpg)
Practical DSL Design
London Groovy & Grails User GroupMay 17th, 2010
Peter BellCEO/CTO SystemsForge
Monday, May 17, 2010
![Page 2: GGUG:Practical DSL Design](https://reader034.vdocument.in/reader034/viewer/2022051819/54c6cd484a795922028b4573/html5/thumbnails/2.jpg)
Overview• What is a DSL?
• Key Concepts
• DSL Design
• Implementing DSLs
• Additional Considerations
• Testing, evolution, documentation, error handling , IDE support
Monday, May 17, 2010
![Page 3: GGUG:Practical DSL Design](https://reader034.vdocument.in/reader034/viewer/2022051819/54c6cd484a795922028b4573/html5/thumbnails/3.jpg)
Goals:• Understand:
• What is a DSL
• Where use one
• Engineering considerations
• NOT about syntax
Monday, May 17, 2010
![Page 4: GGUG:Practical DSL Design](https://reader034.vdocument.in/reader034/viewer/2022051819/54c6cd484a795922028b4573/html5/thumbnails/4.jpg)
Division of Labor
• My Job:
• Present ideas
• Your Job:
• Discriminate, select, adapt, experiment
Monday, May 17, 2010
![Page 5: GGUG:Practical DSL Design](https://reader034.vdocument.in/reader034/viewer/2022051819/54c6cd484a795922028b4573/html5/thumbnails/5.jpg)
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
![Page 6: GGUG:Practical DSL Design](https://reader034.vdocument.in/reader034/viewer/2022051819/54c6cd484a795922028b4573/html5/thumbnails/6.jpg)
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
![Page 7: GGUG:Practical DSL Design](https://reader034.vdocument.in/reader034/viewer/2022051819/54c6cd484a795922028b4573/html5/thumbnails/7.jpg)
• Subjective
• Often facade to API
• Focus on language nature
• “Fluent” interface
What is a DSL? - DSL vs. API
API: new event( startTime: "16:00", endTime: "18:00" )
DSL: new event.from 4.pm, to: 6.pm
Monday, May 17, 2010
![Page 8: GGUG:Practical DSL Design](https://reader034.vdocument.in/reader034/viewer/2022051819/54c6cd484a795922028b4573/html5/thumbnails/8.jpg)
What is a DSL? - Benefits• Expressive (clear intent, concise)
• Separate business logic from code
• Separate lifecycle
• SME readable (not writable)
Monday, May 17, 2010
![Page 9: GGUG:Practical DSL Design](https://reader034.vdocument.in/reader034/viewer/2022051819/54c6cd484a795922028b4573/html5/thumbnails/9.jpg)
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
![Page 10: GGUG:Practical DSL Design](https://reader034.vdocument.in/reader034/viewer/2022051819/54c6cd484a795922028b4573/html5/thumbnails/10.jpg)
Key Concepts• Overview:
• Vertical vs horizontal
• Abstract vs Concrete
• Projections
• Three types of DSL
• Internal vs. External
Monday, May 17, 2010
![Page 11: GGUG:Practical DSL Design](https://reader034.vdocument.in/reader034/viewer/2022051819/54c6cd484a795922028b4573/html5/thumbnails/11.jpg)
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
![Page 12: GGUG:Practical DSL Design](https://reader034.vdocument.in/reader034/viewer/2022051819/54c6cd484a795922028b4573/html5/thumbnails/12.jpg)
Abstract vs. Concrete• Abstract grammar
• what say
• Concrete syntax
• how say
<person> <FirstName>Paul</FirstName>
<LastName>King</LastName></person>
new person( firstName: "Paul", lastName: "King" )
person called “Paul “, “ King “
Paul King
Monday, May 17, 2010
![Page 13: GGUG:Practical DSL Design](https://reader034.vdocument.in/reader034/viewer/2022051819/54c6cd484a795922028b4573/html5/thumbnails/13.jpg)
Projections• Multiple projections
• Textual
• Spreadsheet
• Visual
• Form based
Monday, May 17, 2010
![Page 14: GGUG:Practical DSL Design](https://reader034.vdocument.in/reader034/viewer/2022051819/54c6cd484a795922028b4573/html5/thumbnails/14.jpg)
Three Broad Types of DSL• Internal (embedded)
• External (parser)
• Language workbench
Monday, May 17, 2010
![Page 15: GGUG:Practical DSL Design](https://reader034.vdocument.in/reader034/viewer/2022051819/54c6cd484a795922028b4573/html5/thumbnails/15.jpg)
Internal vs. External• Internal:
• Easier to implement
• Power of GPL:
• Loops
• Math
• Conditionals . . .
• Refactor to external
• External:
• Easier to evolve
• End user writable (forms)?
• Projectional:
• Forms
• Visual
• Spreadsheet
Monday, May 17, 2010
![Page 16: GGUG:Practical DSL Design](https://reader034.vdocument.in/reader034/viewer/2022051819/54c6cd484a795922028b4573/html5/thumbnails/16.jpg)
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
![Page 17: GGUG:Practical DSL Design](https://reader034.vdocument.in/reader034/viewer/2022051819/54c6cd484a795922028b4573/html5/thumbnails/17.jpg)
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
![Page 18: GGUG:Practical DSL Design](https://reader034.vdocument.in/reader034/viewer/2022051819/54c6cd484a795922028b4573/html5/thumbnails/18.jpg)
Implementing DSLs• API
• Fluent interface
• Reducing visual noise
• Config file/XML/Json
• Simple parser
• Nested parser
Monday, May 17, 2010
![Page 19: GGUG:Practical DSL Design](https://reader034.vdocument.in/reader034/viewer/2022051819/54c6cd484a795922028b4573/html5/thumbnails/19.jpg)
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
![Page 20: GGUG:Practical DSL Design](https://reader034.vdocument.in/reader034/viewer/2022051819/54c6cd484a795922028b4573/html5/thumbnails/20.jpg)
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
![Page 21: GGUG:Practical DSL Design](https://reader034.vdocument.in/reader034/viewer/2022051819/54c6cd484a795922028b4573/html5/thumbnails/21.jpg)
Reducing Visual Noise• Flexible and malleable
syntax
• Metaprogramming
• AST transformations
© Guillaume Laforge
Monday, May 17, 2010
![Page 22: GGUG:Practical DSL Design](https://reader034.vdocument.in/reader034/viewer/2022051819/54c6cd484a795922028b4573/html5/thumbnails/22.jpg)
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
![Page 23: GGUG:Practical DSL Design](https://reader034.vdocument.in/reader034/viewer/2022051819/54c6cd484a795922028b4573/html5/thumbnails/23.jpg)
Metaprogramming• PoGo
• Categories
• Builders
• Custom metaclass
• ExpandoMetaClass
© Guillaume Laforge
Monday, May 17, 2010
![Page 24: GGUG:Practical DSL Design](https://reader034.vdocument.in/reader034/viewer/2022051819/54c6cd484a795922028b4573/html5/thumbnails/24.jpg)
AST Transformations
© Guillaume Laforge
• AST traversal
• Local transformations
• Global transformations
• Hooks into ANTLR
Monday, May 17, 2010
![Page 25: GGUG:Practical DSL Design](https://reader034.vdocument.in/reader034/viewer/2022051819/54c6cd484a795922028b4573/html5/thumbnails/25.jpg)
Outcome:
© Guillaume Laforge
event from 4.pm to 6.pm .with “Joe” “Smith” .and “Fred” “Jones”
Monday, May 17, 2010
![Page 26: GGUG:Practical DSL Design](https://reader034.vdocument.in/reader034/viewer/2022051819/54c6cd484a795922028b4573/html5/thumbnails/26.jpg)
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
![Page 27: GGUG:Practical DSL Design](https://reader034.vdocument.in/reader034/viewer/2022051819/54c6cd484a795922028b4573/html5/thumbnails/27.jpg)
Simple Parser• Delimiter directed translation
• Regex or similar
• Doesn’t support nesting
• Only for simplest languages
Monday, May 17, 2010
![Page 28: GGUG:Practical DSL Design](https://reader034.vdocument.in/reader034/viewer/2022051819/54c6cd484a795922028b4573/html5/thumbnails/28.jpg)
Nested Parser• Syntax directed translation
• Grammar/parser
• ANTLR
Monday, May 17, 2010
![Page 29: GGUG:Practical DSL Design](https://reader034.vdocument.in/reader034/viewer/2022051819/54c6cd484a795922028b4573/html5/thumbnails/29.jpg)
Additional Considerations• Testing
• Evolution
• Documentation
• Error handling
• IDE support
Monday, May 17, 2010
![Page 30: GGUG:Practical DSL Design](https://reader034.vdocument.in/reader034/viewer/2022051819/54c6cd484a795922028b4573/html5/thumbnails/30.jpg)
Testing DSLs• Test domain model
• Test fluent interface (expression builder)
• Can Compile
• Scenarios
• Orthogonal test DSLs
Monday, May 17, 2010
![Page 31: GGUG:Practical DSL Design](https://reader034.vdocument.in/reader034/viewer/2022051819/54c6cd484a795922028b4573/html5/thumbnails/31.jpg)
DSL Evolution• The problem: success!
• Approaches:
• No changes
• Backwards compatibility
• Versioning
• Model migrations
Monday, May 17, 2010
![Page 32: GGUG:Practical DSL Design](https://reader034.vdocument.in/reader034/viewer/2022051819/54c6cd484a795922028b4573/html5/thumbnails/32.jpg)
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
![Page 33: GGUG:Practical DSL Design](https://reader034.vdocument.in/reader034/viewer/2022051819/54c6cd484a795922028b4573/html5/thumbnails/33.jpg)
Error Handling• Throw while process = easy
• Meaningful messages hard
Monday, May 17, 2010
![Page 34: GGUG:Practical DSL Design](https://reader034.vdocument.in/reader034/viewer/2022051819/54c6cd484a795922028b4573/html5/thumbnails/34.jpg)
IDE Support• Syntax highlighting
• Code completion
• Static verification
• IntelliJ helps . . .
• If important, consider Xtext/EMF
Monday, May 17, 2010
![Page 35: GGUG:Practical DSL Design](https://reader034.vdocument.in/reader034/viewer/2022051819/54c6cd484a795922028b4573/html5/thumbnails/35.jpg)
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
![Page 36: GGUG:Practical DSL Design](https://reader034.vdocument.in/reader034/viewer/2022051819/54c6cd484a795922028b4573/html5/thumbnails/36.jpg)
Resources
History:http://www.faqs.org/docs/artu/minilanguageschapter.html
DSM:JP Tolvanen: http://www.metacase.com/blogs/jpt/blogViewSteve Kelly: http://www.metacase.com/blogs/stevek/blogViewMarkus Voelter: http://www.voelter.de/
DDD:http://domaindrivendesign.org/
Monday, May 17, 2010
![Page 37: GGUG:Practical DSL Design](https://reader034.vdocument.in/reader034/viewer/2022051819/54c6cd484a795922028b4573/html5/thumbnails/37.jpg)
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/TolvanenGenerative Programming - Czarnecki/EiseneckerDomain Driven Design - Evans
Monday, May 17, 2010
![Page 38: GGUG:Practical DSL Design](https://reader034.vdocument.in/reader034/viewer/2022051819/54c6cd484a795922028b4573/html5/thumbnails/38.jpg)
The End!• http://gettinggroovy.com
• Email: [email protected]
• Twitter: peterbell
Monday, May 17, 2010