ggug:practical dsl design

Post on 27-Jan-2015

106 Views

Category:

Technology

0 Downloads

Preview:

Click to see full reader

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

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

top related