Domain Specific Languages Lukas Renggli ToDo - start with examples - less text ToDo - start with...

81
Domain Specific Domain Specific Languages Languages Lukas Renggli Lukas Renggli www.lukas-renggli.ch www.lukas-renggli.ch ToDo - start with examples - less text
  • date post

    20-Dec-2015
  • Category

    Documents

  • view

    216
  • download

    1

Transcript of Domain Specific Languages Lukas Renggli ToDo - start with examples - less text ToDo - start with...

Page 1: Domain Specific Languages Lukas Renggli  ToDo - start with examples - less text ToDo - start with examples - less text.

Domain Specific Domain Specific LanguagesLanguages

Lukas RenggliLukas Renggliwww.lukas-renggli.chwww.lukas-renggli.ch

ToDo- start with examples- less text

ToDo- start with examples- less text

Page 2: Domain Specific Languages Lukas Renggli  ToDo - start with examples - less text ToDo - start with examples - less text.

1.DSL

– GPL vs. DSL

– Architecture

– Styles

– Embedding

2.Diesel

– Quasiquoting

– Diesel System

1. Language Aspects

Roadmap

Page 3: Domain Specific Languages Lukas Renggli  ToDo - start with examples - less text ToDo - start with examples - less text.

‣ Martin Fowler, “Domain Specific Languages,” June 2008, Work In Progress. URL

‣ Diomidis Spinellis, “Notable Design Patterns for Domain Specific Languages,” Journal of Systems and Software, vol. 56, no. 1, February 2001, pp. 91—99. DOI URL

‣ Laurence Tratt, “Domain specific language implementation via compile-time meta-programming,” ACM TOPLAS, vol. 30, no. 6, 2008, pp. 1—40. DOI PDF

Literature

Page 4: Domain Specific Languages Lukas Renggli  ToDo - start with examples - less text ToDo - start with examples - less text.

GPL GPL ←←→ DSL→ DSL

Page 5: Domain Specific Languages Lukas Renggli  ToDo - start with examples - less text ToDo - start with examples - less text.

General Purpose Language

‣ Turing complete

‣ Well understood and widely used

‣ Applicable to a wide range of problems

Page 6: Domain Specific Languages Lukas Renggli  ToDo - start with examples - less text ToDo - start with examples - less text.

GPL Pros

‣ Excellent support through IDEs

‣ Easy to find experienced developers

‣ Growth through libraries

Page 7: Domain Specific Languages Lukas Renggli  ToDo - start with examples - less text ToDo - start with examples - less text.

GPL Cons

‣ Growth of language is (often) not possible

‣ Can be very verbose

‣ Lack of abstractions

Page 8: Domain Specific Languages Lukas Renggli  ToDo - start with examples - less text ToDo - start with examples - less text.

Domain Specific Language

‣ Small language targeted at a particular problem domain

‣ Expressive in its own domain

‣ Often declarative

Page 9: Domain Specific Languages Lukas Renggli  ToDo - start with examples - less text ToDo - start with examples - less text.

DSL Pros

‣ Tailored to a particular application domain [Mern05a]

‣ Expressive and easy to use [Huda98a]

‣ Little languages, little maintenance, increased productivity [Deur97a]

‣ Communication with domain experts [Fowl08X]

Page 10: Domain Specific Languages Lukas Renggli  ToDo - start with examples - less text ToDo - start with examples - less text.

DSL Cons

‣ Extra investment

– Language engineering

– Learning a new language

‣ Weak IDE support

– Editor, Debugger, Refactoring

‣ Migration might be difficult

‣ Evolving into generality

Page 11: Domain Specific Languages Lukas Renggli  ToDo - start with examples - less text ToDo - start with examples - less text.

ArchitectureArchitecture

Page 12: Domain Specific Languages Lukas Renggli  ToDo - start with examples - less text ToDo - start with examples - less text.

computer: processor: cores 2 i386 disk: size 150 disk: size 75 speed 7200 sata

Processor p = new Processor(2, Processor.Type.i386);

Disk d1 = new Disk(150, Disk.UNKNOWN_SIZE, null);

Disk d2 = new Disk(75, 7200, Disk.Interface.SATA);

return new Computer(p, d1, d2);

Parse Generate

DSL Script Semantic ModelGenerated

Code

Page 13: Domain Specific Languages Lukas Renggli  ToDo - start with examples - less text ToDo - start with examples - less text.

DSL Script

‣ A language to build, configure or do in your domain.

‣ Not necessary textual, could be graphical

‣ Might reuse syntax of host language

Page 14: Domain Specific Languages Lukas Renggli  ToDo - start with examples - less text ToDo - start with examples - less text.

Semantic Model

‣ An in-memory representation of the subject the DSL describes.

‣ Sometimes this is the AST

‣ Separates parser and generation

Page 15: Domain Specific Languages Lukas Renggli  ToDo - start with examples - less text ToDo - start with examples - less text.

Generated Code

‣ Executable representation of the DSL.

‣ Evaluation during parsing

‣ Interpretation of semantic model

Page 16: Domain Specific Languages Lukas Renggli  ToDo - start with examples - less text ToDo - start with examples - less text.

StylesStyles

Page 17: Domain Specific Languages Lukas Renggli  ToDo - start with examples - less text ToDo - start with examples - less text.

Styles

‣ External DSL

‣ Internal DSL

‣ Workbench

Page 18: Domain Specific Languages Lukas Renggli  ToDo - start with examples - less text ToDo - start with examples - less text.

External

‣ DSLs that use a different syntax to the main language that uses them.

‣ Examples

– make, flex, yacc, bison

– XPath, SQL, regexp

– sed, awk

Page 19: Domain Specific Languages Lukas Renggli  ToDo - start with examples - less text ToDo - start with examples - less text.

External Pros

‣ Language Designer

– Tools for compiler construction can be used

‣ Language User

– Simpler to use than a GPL

Page 20: Domain Specific Languages Lukas Renggli  ToDo - start with examples - less text ToDo - start with examples - less text.

External Cons

‣ Language Designer

– Expensive to implement

‣ Language User

– Weak tool support

– Yet another language to learn

– Often targeted towards a particular GPL

– Often difficult to closely integrate with GPL

Page 21: Domain Specific Languages Lukas Renggli  ToDo - start with examples - less text ToDo - start with examples - less text.

Internal

‣ DSLs that share the same syntax to the main language that uses them.

‣ Examples

– PetitParser (Smalltalk)

– rake, rspec (Ruby)

– jQuery (JavaScript)

– RPython (Python)

Page 22: Domain Specific Languages Lukas Renggli  ToDo - start with examples - less text ToDo - start with examples - less text.

Internal

‣ A subset of the host language is used.

‣ Popular in Lisp, Scheme, Ruby, Smalltalk and JavaScript.

Page 23: Domain Specific Languages Lukas Renggli  ToDo - start with examples - less text ToDo - start with examples - less text.

Internal Pros

‣ Language Designer

– No special tools required

– No new grammar required

‣ Language User

– Intermixable with GPL

– Tools continue to work

– No new language to learn

Page 24: Domain Specific Languages Lukas Renggli  ToDo - start with examples - less text ToDo - start with examples - less text.

Internal Cons

‣ Limited expressivity

‣ Unnecessary syntactic noise

‣ Constrained by host language

Page 25: Domain Specific Languages Lukas Renggli  ToDo - start with examples - less text ToDo - start with examples - less text.

Pattern ofInternal DSLs

Page 26: Domain Specific Languages Lukas Renggli  ToDo - start with examples - less text ToDo - start with examples - less text.

Processor p = new Processor(2, Processor.Type.i386);Disk d1 = new Disk(150, Disk.UNKNOWN_SIZE, null);

Disk d2 = new Disk(75, 7200, Disk.Interface.SATA);

return new Computer(p, d1, d2);

Example

Page 27: Domain Specific Languages Lukas Renggli  ToDo - start with examples - less text ToDo - start with examples - less text.

Function Sequence

computer(); processor(); cores(2); i386(); disk(); size(150); disk(); size(75); speed(7200); sata(); end();

Page 28: Domain Specific Languages Lukas Renggli  ToDo - start with examples - less text ToDo - start with examples - less text.

Function Nesting

computer(

processor(

cores(2),

Processor.Type.i386),

disk(

size(150)),

disk(

size(75),

speed(7200),

Disk.Interface.SATA));

Page 29: Domain Specific Languages Lukas Renggli  ToDo - start with examples - less text ToDo - start with examples - less text.

Function Chaining

computer() .processor() .cores(2) .i386() .end() .disk() .size(150) .end() .disk() .size(75) .speed(7200) .sata() .end() .end();

Page 30: Domain Specific Languages Lukas Renggli  ToDo - start with examples - less text ToDo - start with examples - less text.

Closures

computer() do | c | c.processor() do | p | p.cores(2) p.i386() end c.disk().size(150) c.disk() do | d | d.size(75) d.speed(7200) d.sata() endendb.computer() do b.processor() do b.cores(2) b.i386() end b.disk().size(150) b.disk() do b.size(75) b.speed(7200) b.sata() endend

Page 31: Domain Specific Languages Lukas Renggli  ToDo - start with examples - less text ToDo - start with examples - less text.

Literal Collections

[:computer,

[:processor,

[:cores, 2],

[:type, :i386]],

[:disk,

[:size, 150]],

[:disk,

[:size, 75],

[:speed, 7200],

[:interface, :sata]]]

Page 32: Domain Specific Languages Lukas Renggli  ToDo - start with examples - less text ToDo - start with examples - less text.

Other Approaches

‣ Operator Overloading

– C++, C#, Smalltalk, Python, Ruby, ...

‣ Annotations

– Java, C#, Smalltalk, Python, ...

‣ Parse Tree Manipulation

– C#, Smalltalk

‣ Macros

– LISP, Scheme, Template Haskell

Page 33: Domain Specific Languages Lukas Renggli  ToDo - start with examples - less text ToDo - start with examples - less text.

Language Workbenches

‣ IDEs designed for building DSLs.

‣ Common representation of host and domain specific languages.

‣ Examples

– JetBrains Meta Programming System (MPS)

– openArchitectureWare

Page 34: Domain Specific Languages Lukas Renggli  ToDo - start with examples - less text ToDo - start with examples - less text.

Martin Fowler, Language Workbenches: The Killer-App for Domain Specific Languages?

Page 35: Domain Specific Languages Lukas Renggli  ToDo - start with examples - less text ToDo - start with examples - less text.
Page 36: Domain Specific Languages Lukas Renggli  ToDo - start with examples - less text ToDo - start with examples - less text.

EmbeddingEmbedding

Page 37: Domain Specific Languages Lukas Renggli  ToDo - start with examples - less text ToDo - start with examples - less text.

Heterogenous

‣ At least one of the languages is largely, or completely ignorant of the existence of the other languages.

‣ Examples

– Preprocessors

– Stratego/XT, TXL

Page 38: Domain Specific Languages Lukas Renggli  ToDo - start with examples - less text ToDo - start with examples - less text.

Homogeneous

‣ All languages are specifically designed to work with each other.

‣ Examples

– LISP/Scheme Macros, Template Haskell

– Nemerle, Metalua (Lua), xTc (C)

– Converge, Diesel

Page 39: Domain Specific Languages Lukas Renggli  ToDo - start with examples - less text ToDo - start with examples - less text.

Heterogenous

Homogenous

Internal rake Diesel Pidgin

External makeConverge

Diesel Creole

Page 40: Domain Specific Languages Lukas Renggli  ToDo - start with examples - less text ToDo - start with examples - less text.
Page 41: Domain Specific Languages Lukas Renggli  ToDo - start with examples - less text ToDo - start with examples - less text.

QuasiquotingQuasiquoting

Page 42: Domain Specific Languages Lukas Renggli  ToDo - start with examples - less text ToDo - start with examples - less text.

Compile timemeta

programming

Page 43: Domain Specific Languages Lukas Renggli  ToDo - start with examples - less text ToDo - start with examples - less text.

DSL for AST construction

Page 44: Domain Specific Languages Lukas Renggli  ToDo - start with examples - less text ToDo - start with examples - less text.

QuasiquoteMeta Level

SourcecodeBase Level

Quasiquote `` Unquote `,

Page 45: Domain Specific Languages Lukas Renggli  ToDo - start with examples - less text ToDo - start with examples - less text.

Lisp Scheme

Template Haskell

Quasiquote

Smalltalk

Quote `

Quasiquote `` [| ... |] ``

Unquote , ${ ... } `,

Splice ,@ $< ... > `@

Page 46: Domain Specific Languages Lukas Renggli  ToDo - start with examples - less text ToDo - start with examples - less text.

Quasiquote Example

raise: aNode to: anIntegeranInteger = 0

ifTrue: [ ^ ``1 ].anInteger = 1

ifTrue: [ ^ aNode ].^ ``(`,(self raise: aNode to: anInteger - 1) *

`,aNode)

power3: aNumber^ `@(self raise: ``aNumber to: 3)

Page 47: Domain Specific Languages Lukas Renggli  ToDo - start with examples - less text ToDo - start with examples - less text.

Quasiquote Decompiled

raise: aNode to: anIntegeranInteger = 0

ifTrue: [ ^ RBLiteralNode value: 1 ].anInteger = 1

ifTrue: [ ^ aNode ].^ RBMessageNode

receiver: (self raise: aNode to: anInteger - 1)selector: #* arguments: (Array with: aNode)

power3: aNumber^ aNumber * aNumber * aNumber

Page 48: Domain Specific Languages Lukas Renggli  ToDo - start with examples - less text ToDo - start with examples - less text.
Page 49: Domain Specific Languages Lukas Renggli  ToDo - start with examples - less text ToDo - start with examples - less text.

DIESELDIESEL

Teaching IDEs new LanguagesTeaching IDEs new Languages

Page 50: Domain Specific Languages Lukas Renggli  ToDo - start with examples - less text ToDo - start with examples - less text.

Floating Point Numbers

digit = "0" | "1" | ... | "9" ;number = [ "-" ] digit { digit }

[ "." digit { digit } ] ;

Page 51: Domain Specific Languages Lukas Renggli  ToDo - start with examples - less text ToDo - start with examples - less text.

JParsec Parser

final Pattern digit = Patterns.range('0', '9');

final Pattern number = Patterns.seq(Patterns.isChar('-').optional(), digit.many(1), Patterns.seq(Patterns.isChar('.'), digit.many(1)).optional());

Page 52: Domain Specific Languages Lukas Renggli  ToDo - start with examples - less text ToDo - start with examples - less text.

PetitParser

digit ^ $0 asParser / $1 asParser / ... / $9 asParser

number ^ $- asParser optional , self digit plus , ($. asParser , self digit plus) optional

Page 53: Domain Specific Languages Lukas Renggli  ToDo - start with examples - less text ToDo - start with examples - less text.

Pidgin PetitParser

digit $0 / $1 / ... / $9

number $- optional , digit plus , ($. , digit plus) optional

Page 54: Domain Specific Languages Lukas Renggli  ToDo - start with examples - less text ToDo - start with examples - less text.

Pidgin Transformations

DSLTreePattern newexpression: '`#literal'do: [ :ast | ``(`,(ast) asParser) ]

DSLTreePattern newexpression: '`variable'do: [ :ast | ``(self `,(ast name)) ]

DSLTreePattern newexpression: '`.statement'do: [ :ast | ``(^ `,(ast statement)) ]

Page 55: Domain Specific Languages Lukas Renggli  ToDo - start with examples - less text ToDo - start with examples - less text.

Pidgin

In the domain of natural language, a pidgin is a grammatically simplified form of a language used for communication between people not sharing a common language.

Page 56: Domain Specific Languages Lukas Renggli  ToDo - start with examples - less text ToDo - start with examples - less text.

Pidgin PetitParser

digit $0 / $1 / ... / $9

number $- optional , digit plus , ($. , digit plus) optional

Page 57: Domain Specific Languages Lukas Renggli  ToDo - start with examples - less text ToDo - start with examples - less text.

Creole PetitParser

digit = "0" | "1" | ... | "9" ;number = [ "-" ] digit { digit }

[ "." digit { digit } ] ;

Page 58: Domain Specific Languages Lukas Renggli  ToDo - start with examples - less text ToDo - start with examples - less text.

EBNF Parser

production = identifier "=" choice ";" ;choice = sequence { "/" sequence } ;sequence = element { element } ;element = option / repetition / literal / identifier ;option = "[" choice "]" ;repetition = "{" choice "}" ;literal = '"' string '"' / "'" string "'" ;

Page 59: Domain Specific Languages Lukas Renggli  ToDo - start with examples - less text ToDo - start with examples - less text.

option = "[" choice "]" ;

super repetition ==> [ :ast | ``(`,(ast second) optional) ]

Page 60: Domain Specific Languages Lukas Renggli  ToDo - start with examples - less text ToDo - start with examples - less text.

Creole

In the domain of natural language, a creole is a a mother tongue formed from the contract of two languages through an earlier pidgin stage.

Page 61: Domain Specific Languages Lukas Renggli  ToDo - start with examples - less text ToDo - start with examples - less text.

Implementation

Page 62: Domain Specific Languages Lukas Renggli  ToDo - start with examples - less text ToDo - start with examples - less text.
Page 63: Domain Specific Languages Lukas Renggli  ToDo - start with examples - less text ToDo - start with examples - less text.

Tool Integration

Page 64: Domain Specific Languages Lukas Renggli  ToDo - start with examples - less text ToDo - start with examples - less text.

Homogenous Embedding

Page 65: Domain Specific Languages Lukas Renggli  ToDo - start with examples - less text ToDo - start with examples - less text.

Scoping of Languages

Page 66: Domain Specific Languages Lukas Renggli  ToDo - start with examples - less text ToDo - start with examples - less text.

Demo

Page 67: Domain Specific Languages Lukas Renggli  ToDo - start with examples - less text ToDo - start with examples - less text.

DIESEL Summary

‣ Language Workbench and Meta-Programming System

‣ Extension points in the compiler pipeline

‣ Tight integration with existing tools

Page 68: Domain Specific Languages Lukas Renggli  ToDo - start with examples - less text ToDo - start with examples - less text.

DIESEL Pros

‣ Tools continue to work

‣ Homogenous Embedding

‣ Relatively simple implementation

‣ Incremental development of DSLs

Page 69: Domain Specific Languages Lukas Renggli  ToDo - start with examples - less text ToDo - start with examples - less text.

DIESEL Cons

‣ Pidgin DSL is constrained by syntax

‣ Creole DSL requires you to write a parser and specify a transformation

‣ Language definitions are in “scripts”, there is no real model behind it

Page 70: Domain Specific Languages Lukas Renggli  ToDo - start with examples - less text ToDo - start with examples - less text.

Language AspectsLanguage Aspects

Bending the Host LanguageBending the Host Language

Page 71: Domain Specific Languages Lukas Renggli  ToDo - start with examples - less text ToDo - start with examples - less text.

Aspects

Aspect

Pointcut

Advice

Source

Page 72: Domain Specific Languages Lukas Renggli  ToDo - start with examples - less text ToDo - start with examples - less text.

Language Aspects

Pointcut

Advice

AspectLanguage Source

CompilerHighlighterCompletion{

Page 73: Domain Specific Languages Lukas Renggli  ToDo - start with examples - less text ToDo - start with examples - less text.

Start withhost language

Page 74: Domain Specific Languages Lukas Renggli  ToDo - start with examples - less text ToDo - start with examples - less text.

Modular

Page 75: Domain Specific Languages Lukas Renggli  ToDo - start with examples - less text ToDo - start with examples - less text.

Crosscutting

Page 76: Domain Specific Languages Lukas Renggli  ToDo - start with examples - less text ToDo - start with examples - less text.

Integration

Page 77: Domain Specific Languages Lukas Renggli  ToDo - start with examples - less text ToDo - start with examples - less text.

Demo

Page 78: Domain Specific Languages Lukas Renggli  ToDo - start with examples - less text ToDo - start with examples - less text.

Bachelor and Master Projects

‣ Better editor integration

‣ Language Aspects for C#

‣ Transparent optimization of DSLs

‣ Refactoring and migration of DSLs

Page 79: Domain Specific Languages Lukas Renggli  ToDo - start with examples - less text ToDo - start with examples - less text.

What you should know!

‣ What are the reasons for using DSLs?

‣ What are the reasons for not using DSLs?

‣ What is the difference between an API and an internal DSL?

‣ What is a language workbench?

‣ What is quasiquoting and why is it useful?

Page 80: Domain Specific Languages Lukas Renggli  ToDo - start with examples - less text ToDo - start with examples - less text.

Can you answer these questions?

‣ How would you extend an internal DSL?

‣ How would you execute a graphical DSL?

‣ What problems do we face when modifying the language within an interactive environment?

‣ Why is it often difficult to achieve homogenous embedding?

Page 81: Domain Specific Languages Lukas Renggli  ToDo - start with examples - less text ToDo - start with examples - less text.