GGUG:Practical DSL Design

38
Practical DSL Design London Groovy & Grails User Group May 17th, 2010 Peter Bell CEO/CTO SystemsForge Monday, May 17, 2010

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 Workshop

Transcript of GGUG:Practical DSL Design

Page 1: GGUG:Practical DSL Design

Practical DSL Design

London Groovy & Grails User GroupMay 17th, 2010

Peter BellCEO/CTO SystemsForge

Monday, May 17, 2010

Page 2: GGUG:Practical DSL Design

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

Goals:• Understand:

• What is a DSL

• Where use one

• Engineering considerations

• NOT about syntax

Monday, May 17, 2010

Page 4: GGUG:Practical DSL Design

Division of Labor

• My Job:

• Present ideas

• Your Job:

• Discriminate, select, adapt, experiment

Monday, May 17, 2010

Page 5: GGUG:Practical DSL Design

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

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

• 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

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

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

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

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

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

Projections• Multiple projections

• Textual

• Spreadsheet

• Visual

• Form based

Monday, May 17, 2010

Page 14: GGUG:Practical DSL Design

Three Broad Types of DSL• Internal (embedded)

• External (parser)

• Language workbench

Monday, May 17, 2010

Page 15: GGUG:Practical DSL Design

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

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

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

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

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

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

Reducing Visual Noise• Flexible and malleable

syntax

• Metaprogramming

• AST transformations

© Guillaume Laforge

Monday, May 17, 2010

Page 22: GGUG:Practical DSL Design

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

Metaprogramming• PoGo

• Categories

• Builders

• Custom metaclass

• ExpandoMetaClass

© Guillaume Laforge

Monday, May 17, 2010

Page 24: GGUG:Practical DSL Design

AST Transformations

© Guillaume Laforge

• AST traversal

• Local transformations

• Global transformations

• Hooks into ANTLR

Monday, May 17, 2010

Page 25: GGUG:Practical DSL Design

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

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

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

Nested Parser• Syntax directed translation

• Grammar/parser

• ANTLR

Monday, May 17, 2010

Page 29: GGUG:Practical DSL Design

Additional Considerations• Testing

• Evolution

• Documentation

• Error handling

• IDE support

Monday, May 17, 2010

Page 30: GGUG:Practical DSL Design

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

DSL Evolution• The problem: success!

• Approaches:

• No changes

• Backwards compatibility

• Versioning

• Model migrations

Monday, May 17, 2010

Page 32: GGUG:Practical DSL Design

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

Error Handling• Throw while process = easy

• Meaningful messages hard

Monday, May 17, 2010

Page 34: GGUG:Practical DSL Design

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

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

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

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