practical dsl design - wordpress.com › 2010 › 05 › 2010-05-londo… · practical dsl design...

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

Upload: others

Post on 28-May-2020

11 views

Category:

Documents


0 download

TRANSCRIPT

Practical DSL Design

London Groovy & Grails User GroupMay 17th, 2010

Peter BellCEO/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

• 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

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

• 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

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:

• 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

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

© Guillaume Laforge

• AST traversal

• Local transformations

• Global transformations

• Hooks into ANTLR

Monday, May 17, 2010

Outcome:

© Guillaume Laforge

event from 4.pm to 6.pm .with “Joe” “Smith” .and “Fred” “Jones”

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/blogViewSteve Kelly: http://www.metacase.com/blogs/stevek/blogViewMarkus 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/TolvanenGenerative Programming - Czarnecki/EiseneckerDomain Driven Design - Evans

Monday, May 17, 2010