0
Stéphane Ducasse
Stéphane Ducasse
stephane.ducasse@inria.fr
http://stephane.ducasse.free.fr/
RMod
Powerful DSL engineering...
S.Ducasse
RMod
A word of introduction
Reflective, metamodeler and happy programmer
Wrote several books on Smalltalk
Pharo b...
S.Ducasse
RMod
RMOD INRIA Team
Software evolution and software composition
Axis 1: Maintaining large software systems
Moos...
S.Ducasse
RMod
Roadmap
A word about design
Smalltalk an executable modeling language
Internal DSLs industrial examples
Mon...
S.Ducasse
RMod
About design and DSL
5
S.Ducasse
RMod
Good OOP design makes implicit explicit
6
S.Ducasse
RMod
Classes structure our vocabulary
7
S.Ducasse
RMod
Classes are recipients of message reaction
8
S.Ducasse
RMod
9
Boolean
xor:
eqv:
storeOn:
and:
or:
ifTrue:ifFalse:
&
not
|
False
and:
or:
ifTrue:ifFalse:
&
not
|
True
a...
S.Ducasse
RMod
Ternary logic
Boolean: true, false, unknown
10
S.Ducasse
RMod
Focus on **your** domain
Define domain elements as first class objects
Long tradition in Smalltalk
11
S.Ducasse
RMod
Exploratory modeling
Extreme/agile modeling
One domain expert
One developer
Pair-programming with the domai...
S.Ducasse
RMod
Requirements for a real DSL
Adequate syntax
Capture intent/domain
EXECUTABLE!
Tools
TestRunner
Browsers
Sem...
S.Ducasse
RMod
Smalltalk is a modeling executable language
Quite close from xactium
14
S.Ducasse
RMod
Smalltalk
Modeling the world
Simple syntax
Trivial OO model
Executable
Full set of powerful tools
15
S.Ducasse
RMod
A Simple and Pure Model
Everything is an object (no primitive)
Only message passing (virtual)
Public method...
S.Ducasse
RMod
Date today
is a unary message
17
S.Ducasse
RMod
1000 factorial
is a unary message
18
S.Ducasse
RMod
1 / 3
is a binary message
19
S.Ducasse
RMod
1000 factorial / 999 factorial
is a unary/binary messages
20
S.Ducasse
RMod
Color gray - Color white = Color black
21
S.Ducasse
RMod
Color r: 0 g: 0 b: 1
is a keyword-based message
22
S.Ducasse
RMod
From Java to Smalltalk
postman.send(mail,recipient);
23
S.Ducasse
RMod
Removing
postman.send(mail,recipient);
24
S.Ducasse
RMod
Removing unnecessary
postman send mail recipient
25
S.Ducasse
RMod
But without losing information
postman send mail to recipient
26
S.Ducasse
RMod
postman send: mail to: recipient
postman.send(mail,recipient);
27
S.Ducasse
RMod
Tamagotchi
Small entity
Its own night and day cycle
Eating, sleeping, been hungry, been satisfied
Changing c...
S.Ducasse
RMod
Class
Object subclass: #Tamagotchi
instanceVariableNames:‘tummy hunger dayCount isNight'
	

 classVariableN...
S.Ducasse
RMod
initialize
“Initialize the internal state of a newly created tomagoshi”
super initialize.
tummy := 0.
hunge...
S.Ducasse
RMod
timePass
"Manage the night and day alternance and digestion"
Beeper beep.
dayCount := dayCount -1.
dayCount...
S.Ducasse
RMod
Self-described
32
S.Ducasse
RMod
Implemented totally in itself
extensible...
33
S.Ducasse
RMod
Vocabulary points
34
S.Ducasse
RMod
External Languages
Tools: make, flex, yacc
Data: awk, sed, XPath, Regular Expressions, SQL
+ expressive, ful...
S.Ducasse
RMod
Internal Languages
Ruby: rspec, rake
JavaScript: jQuery
Smalltalk: Mondrian, Seaside, PetitParser
+ easy to...
S.Ducasse
RMod
Embedded Languages
Language Workbenches: JetBrains MPS, Intentional Software
+ common infrastructure for di...
S.Ducasse
RMod
Mondrian metaphor: painting a view
Composition with Red,Yellow and Blue
Piet Mondrian (1921)
38
S.Ducasse
RMod
Mondrian a scriptable visualization “language”
fast brainstorming of ideas
interactive
developed by Girba/M...
S.Ducasse
RMod
The view consists of nodes and edges
view :=ViewRenderer new.
view nodes: classes.
view edges: classes from...
S.Ducasse
RMod
Visual representation is given by the shape
view :=ViewRenderer new.
view borderedRectangleShape height: [:...
S.Ducasse
RMod
Blocks can be replaced by symbols
view :=ViewRenderer new.
view borderedRectangleShape height:
#numberOfMet...
S.Ducasse
RMod
Nesting is done through blocks
view :=ViewRenderer new.
view borderedRectangleShape.
view nodes: classes fo...
S.Ducasse
RMod
What about interaction?
44
S.Ducasse
RMod
Interaction is scriptable, too
view :=ViewRenderer new.
view2 :=ViewRenderer new.
view interaction
onSelect...
S.Ducasse
RMod
Glamour
Internal language to build data explorer/browser
Component-based
46
S.Ducasse
RMod
47
S.Ducasse
RMod
49
S.Ducasse
RMod
browser := GLMTabulator new.
browser column: #one; column: #two.
browser showOn: #one; using: [
browser tab...
S.Ducasse
RMod
Seaside
To build dynamic applications
Applications in production since 2002
Natural Flow
Reusable statefull...
S.Ducasse
RMod
53
S.Ducasse
RMod
value1 := self request:‘first number’.
value2 := self request:‘second number’.
self inform: value1 asNumber ...
S.Ducasse
RMod
55
Not concerned about HTTP
No manual request parsing
No XML configuration files
S.Ducasse
RMod
Source:stock.xchng,AlNakib
56
S.Ducasse
RMod
html div id:‘list’; with: [
html span class:‘item’; with:‘Item 1’.
html span class:‘item’; with:‘Item 2’ ]
...
S.Ducasse
RMod
html anchor
	

 callback: [ self inform:‘Hello World’ ];
	

 with:‘Show Message’
Generates...
<a href=”/sea...
S.Ducasse
RMod
59
S.Ducasse
RMod
WAComponent subclass: #Example2
	

 instanceVariableNames: 'english'
	

 classVariableNames: ''
	

 poolDic...
S.Ducasse
RMod
renderContentOn: html
	

 html form: [
	

 	

 html button
	

 	

 	

 callback: [english := true];
	

 	

...
S.Ducasse
RMod
Full hot on the fly debug
Full integration with javascript
Handling of the back button
...
62
S.Ducasse
RMod
Slime
Rule for checking validation of Seaside internal
language
63
S.Ducasse
RMod
Mastering Embedded Languages
64
!" #"$%&
S.Ducasse
RMod
65
S.Ducasse
RMod
change semantics
introduce new syntax
change syntax & semantics
66
Adopt, Extend, Overload
Package Name
x = 1
y = 1 (2, 1)
(2, 2)(1, 2)
x = 2
y = 2
S.Ducasse
RMod
aBuilder row grow.
aBuilder row fill.
aBuilder column grow.
aBuilder column fill.
aBuilder x: 1 y: 1 add: (La...
S.Ducasse
RMod
row = grow.
row = fill.
column = grow.
column = fill.
(1 , 1) = label
	

 	

 text: [ :each | each name ];
	
...
S.Ducasse
RMod
shape {
	

 cols: #grow, #fill;
	

 rows: #grow, #fill;
}
label {
	

 position: 1 , 1;
	

 text: [ :each | ea...
S.Ducasse
RMod
Homogeneous Tools
71
S.Ducasse
RMod
Domain-Specific
72
Traditional Smalltalk Compiler
Smalltalk
Parser
Semantic
Analysis
Bytecode
Generation
Executable
Code
Source
Code
Traditional Smalltalk Compiler
Smalltalk
Parser
Semantic
Analysis
Bytecode
Generation
Executable
Code
Source
Code
<parse> ...
Traditional Smalltalk Compiler
Smalltalk
Parser
Semantic
Analysis
Bytecode
Generation
Executable
Code
Source
Code
<parse> ...
Traditional Smalltalk Compiler
Smalltalk
Parser
Semantic
Analysis
Bytecode
Generation
Executable
Code
Source
Code
<parse> ...
S.Ducasse
RMod
Scannerless Parsers combine what is usually done by two independent tools
(scanner and parser) into one. Th...
S.Ducasse
RMod
BNF
ID ::= letter { letter | digit } ;
Ometa2
id = letter (letter | digit)*
PetitParser
id := #letter asPar...
S.Ducasse
RMod
Smalltalk is a serious player in DSL
Trivial model
Trivial syntax
Internal DSLs
Embedded DSLs
Full tool sup...
S.Ducasse
RMod
80
Choose'10: Stephane Ducasse - Powerful DSL engineering in Smalltalk
Choose'10: Stephane Ducasse - Powerful DSL engineering in Smalltalk
Upcoming SlideShare
Loading in...5
×

Choose'10: Stephane Ducasse - Powerful DSL engineering in Smalltalk

888

Published on

Presented at the Choose Forum 2010 in Bern.

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
888
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
8
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Transcript of "Choose'10: Stephane Ducasse - Powerful DSL engineering in Smalltalk"

  1. 1. Stéphane Ducasse Stéphane Ducasse stephane.ducasse@inria.fr http://stephane.ducasse.free.fr/ RMod Powerful DSL engineering with Smalltalk 1
  2. 2. S.Ducasse RMod A word of introduction Reflective, metamodeler and happy programmer Wrote several books on Smalltalk Pharo by example, Squeak by Example, ... Pushed Moose http://www.moosetechnology.org Building Pharo http://www.pharo-project.org Maintained Squeak http://www.squeak.org 2
  3. 3. S.Ducasse RMod RMOD INRIA Team Software evolution and software composition Axis 1: Maintaining large software systems Moose: a platform for reengineering, http://moosetechnology.com Axis 2: Modular and Secure Reflective languages Revisiting fundamental aspects of OO languages Traits (SUN Microsystems...), Classboxes Pharo open-source Smalltalk http://www.pharo-project.org Starting to work on a secure reflective languages 3
  4. 4. S.Ducasse RMod Roadmap A word about design Smalltalk an executable modeling language Internal DSLs industrial examples Mondrian Glamour Seaside Helvetia: mastering embedded languages Tools: PetitParser Conclusion 4
  5. 5. S.Ducasse RMod About design and DSL 5
  6. 6. S.Ducasse RMod Good OOP design makes implicit explicit 6
  7. 7. S.Ducasse RMod Classes structure our vocabulary 7
  8. 8. S.Ducasse RMod Classes are recipients of message reaction 8
  9. 9. S.Ducasse RMod 9 Boolean xor: eqv: storeOn: and: or: ifTrue:ifFalse: & not | False and: or: ifTrue:ifFalse: & not | True and: or: ifTrue:ifFalse: & not | ifTrue: trueAlternativeBlock ifFalse: falseAlternativeBlock self subclassResponsibility ifTrue: trueAlternativeBlock ifFalse: falseAlternativeBlock ^ trueAlternativeBlock value ifTrue: trueAlternativeBlock ifFalse: falseAlternativeBlock ^ falseAlternativeBlock value
  10. 10. S.Ducasse RMod Ternary logic Boolean: true, false, unknown 10
  11. 11. S.Ducasse RMod Focus on **your** domain Define domain elements as first class objects Long tradition in Smalltalk 11
  12. 12. S.Ducasse RMod Exploratory modeling Extreme/agile modeling One domain expert One developer Pair-programming with the domain expert Using the domain expert vocabulary 2007 SAP Experience with Smalltalk 12
  13. 13. S.Ducasse RMod Requirements for a real DSL Adequate syntax Capture intent/domain EXECUTABLE! Tools TestRunner Browsers Semantics versioning Debuggers! 13
  14. 14. S.Ducasse RMod Smalltalk is a modeling executable language Quite close from xactium 14
  15. 15. S.Ducasse RMod Smalltalk Modeling the world Simple syntax Trivial OO model Executable Full set of powerful tools 15
  16. 16. S.Ducasse RMod A Simple and Pure Model Everything is an object (no primitive) Only message passing (virtual) Public methods/Private attributes Single inheritance Class extension (Program slices) Closures 16
  17. 17. S.Ducasse RMod Date today is a unary message 17
  18. 18. S.Ducasse RMod 1000 factorial is a unary message 18
  19. 19. S.Ducasse RMod 1 / 3 is a binary message 19
  20. 20. S.Ducasse RMod 1000 factorial / 999 factorial is a unary/binary messages 20
  21. 21. S.Ducasse RMod Color gray - Color white = Color black 21
  22. 22. S.Ducasse RMod Color r: 0 g: 0 b: 1 is a keyword-based message 22
  23. 23. S.Ducasse RMod From Java to Smalltalk postman.send(mail,recipient); 23
  24. 24. S.Ducasse RMod Removing postman.send(mail,recipient); 24
  25. 25. S.Ducasse RMod Removing unnecessary postman send mail recipient 25
  26. 26. S.Ducasse RMod But without losing information postman send mail to recipient 26
  27. 27. S.Ducasse RMod postman send: mail to: recipient postman.send(mail,recipient); 27
  28. 28. S.Ducasse RMod Tamagotchi Small entity Its own night and day cycle Eating, sleeping, been hungry, been satisfied Changing color to indicate its mood 28
  29. 29. S.Ducasse RMod Class Object subclass: #Tamagotchi instanceVariableNames:‘tummy hunger dayCount isNight' classVariableNames: '' poolDictionaries: '' category: ’TOMA' 29
  30. 30. S.Ducasse RMod initialize “Initialize the internal state of a newly created tomagoshi” super initialize. tummy := 0. hunger := 2 atRandom + 1. self dayStart. self wakeUp dayStart night := false. dayCount := 10 30
  31. 31. S.Ducasse RMod timePass "Manage the night and day alternance and digestion" Beeper beep. dayCount := dayCount -1. dayCount isZero ifTrue:[ self nightOrDayEnd. dayCount := 10]. self digest digest "Digest slowly: every two cycle, remove one from the tummy” (dayCount isDivisibleBy: 2) ifTrue: [ tummy := tummy -1] 31
  32. 32. S.Ducasse RMod Self-described 32
  33. 33. S.Ducasse RMod Implemented totally in itself extensible... 33
  34. 34. S.Ducasse RMod Vocabulary points 34
  35. 35. S.Ducasse RMod External Languages Tools: make, flex, yacc Data: awk, sed, XPath, Regular Expressions, SQL + expressive, full control - expensive to implement, no tools, hard to pass data around 35
  36. 36. S.Ducasse RMod Internal Languages Ruby: rspec, rake JavaScript: jQuery Smalltalk: Mondrian, Seaside, PetitParser + easy to implement, tool support, easily mixable 36
  37. 37. S.Ducasse RMod Embedded Languages Language Workbenches: JetBrains MPS, Intentional Software + common infrastructure for different languages - new language, new tools, non-standard host language, targeted at domain experts (no programmers) 37
  38. 38. S.Ducasse RMod Mondrian metaphor: painting a view Composition with Red,Yellow and Blue Piet Mondrian (1921) 38
  39. 39. S.Ducasse RMod Mondrian a scriptable visualization “language” fast brainstorming of ideas interactive developed by Girba/Meer (SCG, Bern), maintained, optimized by Bergel (Pleaid, Santiago, Chile) heavily used by researchers in reengineering part of Moose 39
  40. 40. S.Ducasse RMod The view consists of nodes and edges view :=ViewRenderer new. view nodes: classes. view edges: classes from: [:each | each superclass] to: [:each | each]. view treeLayout. view open. 40
  41. 41. S.Ducasse RMod Visual representation is given by the shape view :=ViewRenderer new. view borderedRectangleShape height: [:each | each numberOfMethods]. view nodes: classes. view edges: classes from: [:each | each superclass] to: [:each | each]. view treeLayout. view open. 41
  42. 42. S.Ducasse RMod Blocks can be replaced by symbols view :=ViewRenderer new. view borderedRectangleShape height: #numberOfMethods. view nodes: classes. view edgesFrom: #superclass. view treeLayout. view open. 42
  43. 43. S.Ducasse RMod Nesting is done through blocks view :=ViewRenderer new. view borderedRectangleShape. view nodes: classes forEach: [:each | view nodes: each methods. view gridLayout]. view edgesFrom: #superclass. view treeLayout. view open. 43
  44. 44. S.Ducasse RMod What about interaction? 44
  45. 45. S.Ducasse RMod Interaction is scriptable, too view :=ViewRenderer new. view2 :=ViewRenderer new. view interaction onSelect: [:each | each viewOn: view2]. view interaction popupView: [:each :aView | each viewOn: aView]. view nodes: ... 45
  46. 46. S.Ducasse RMod Glamour Internal language to build data explorer/browser Component-based 46
  47. 47. S.Ducasse RMod 47
  48. 48. S.Ducasse RMod 49
  49. 49. S.Ducasse RMod browser := GLMTabulator new. browser column: #one; column: #two. browser showOn: #one; using: [ browser table column: 'Character' evaluated: [ :each | each asString ]; column: 'ASCII' evaluated: [ :each | each asInteger printString ]; act: [:tree | tree inspect ] on: $i entitled: 'Inspect'; icon: [:x | MenuIcons helpIcon ]]. browser showOn: #two; from: #one; using: [ browser text ]. 50
  50. 50. S.Ducasse RMod Seaside To build dynamic applications Applications in production since 2002 Natural Flow Reusable statefull components Secure by default Web 2.0 http://www.seaside.st 51
  51. 51. S.Ducasse RMod 53
  52. 52. S.Ducasse RMod value1 := self request:‘first number’. value2 := self request:‘second number’. self inform: value1 asNumber + value2 asNumber 54
  53. 53. S.Ducasse RMod 55 Not concerned about HTTP No manual request parsing No XML configuration files
  54. 54. S.Ducasse RMod Source:stock.xchng,AlNakib 56
  55. 55. S.Ducasse RMod html div id:‘list’; with: [ html span class:‘item’; with:‘Item 1’. html span class:‘item’; with:‘Item 2’ ] generates... <div id=”list”> <span class=”item”>Item 1</span> <span class=”item”>Item 2</span> </div> 57
  56. 56. S.Ducasse RMod html anchor callback: [ self inform:‘Hello World’ ]; with:‘Show Message’ Generates... <a href=”/seaside/example1 ?_s=Ru8ZKgqjy0uDX3kf &_k=K5EQyqKE &32”>Show Message</a> 58
  57. 57. S.Ducasse RMod 59
  58. 58. S.Ducasse RMod WAComponent subclass: #Example2 instanceVariableNames: 'english' classVariableNames: '' poolDictionaries: '' category: 'SeaExample' 60
  59. 59. S.Ducasse RMod renderContentOn: html html form: [ html button callback: [english := true]; text: 'english'. html button callback: [self inFrench]; text: 'french'. html submitButton callback: [ english ifFalse: [self inform: 'Bonjour'] ifTrue: [self inform: 'Hello'] ] ; text: 'Say Hello' ] 61
  60. 60. S.Ducasse RMod Full hot on the fly debug Full integration with javascript Handling of the back button ... 62
  61. 61. S.Ducasse RMod Slime Rule for checking validation of Seaside internal language 63
  62. 62. S.Ducasse RMod Mastering Embedded Languages 64 !" #"$%&
  63. 63. S.Ducasse RMod 65
  64. 64. S.Ducasse RMod change semantics introduce new syntax change syntax & semantics 66 Adopt, Extend, Overload
  65. 65. Package Name x = 1 y = 1 (2, 1) (2, 2)(1, 2) x = 2 y = 2
  66. 66. S.Ducasse RMod aBuilder row grow. aBuilder row fill. aBuilder column grow. aBuilder column fill. aBuilder x: 1 y: 1 add: (LabelShape new text: [ :each | each name ]; borderColor: #black; borderWidth: 1; yourself). aBuilder x: 1 y: 2 w: 2 h: 1 add: (RectangleShape new borderColor: #black; borderWidth: 1; width: 200; Package Name x = 1 y = 1 (2, 1) (2, 2)(1, 2) x = 2 y = 2 68
  67. 67. S.Ducasse RMod row = grow. row = fill. column = grow. column = fill. (1 , 1) = label text: [ :each | each name ]; borderColor: #black; borderWidth: 1. (1 , 2) - (2 , 1) = rectangle borderColor: #black; borderWidth: 1; width: 200; height: 100. Package Name x = 1 y = 1 (2, 1) (2, 2)(1, 2) x = 2 y = 2 69
  68. 68. S.Ducasse RMod shape { cols: #grow, #fill; rows: #grow, #fill; } label { position: 1 , 1; text: [ :each | each name ]; borderColor: #black; borderWidth: 1; } rectangle { position: 1 , 2; colspan: 2; borderColor: #black; borderWidth: 1; width: 200; Package Name x = 1 y = 1 (2, 1) (2, 2)(1, 2) x = 2 y = 2 70
  69. 69. S.Ducasse RMod Homogeneous Tools 71
  70. 70. S.Ducasse RMod Domain-Specific 72
  71. 71. Traditional Smalltalk Compiler Smalltalk Parser Semantic Analysis Bytecode Generation Executable Code Source Code
  72. 72. Traditional Smalltalk Compiler Smalltalk Parser Semantic Analysis Bytecode Generation Executable Code Source Code <parse> <transform> <attribute> <bytecode> Rules
  73. 73. Traditional Smalltalk Compiler Smalltalk Parser Semantic Analysis Bytecode Generation Executable Code Source Code <parse> <transform> <attribute> <bytecode> Rules <complete> <highlight> ......
  74. 74. Traditional Smalltalk Compiler Smalltalk Parser Semantic Analysis Bytecode Generation Executable Code Source Code <parse> <transform> <attribute> <bytecode> Rules Pidgin path Creole path <complete> <highlight> ......
  75. 75. S.Ducasse RMod Scannerless Parsers combine what is usually done by two independent tools (scanner and parser) into one. This makes writing a grammar much simpler and avoids common problems when grammars are composed. Parser Combinators are building blocks for parsers modeled as a graph of composable objects; they are modular and maintainable, and can be changed, recomposed, transformed and reflected upon. Parsing Expression Grammars (PEGs) provide ordered choice. Unlike in parser combinators, the ordered choice of PEGs always follows the first matching alternative and ignores other alternatives. Valid input always results in exactly one parse-tree, the result of a parse is never ambiguous. Packrat Parsers give linear parse time guarantees and avoid common problems with left-recursion in PEGs. 77
  76. 76. S.Ducasse RMod BNF ID ::= letter { letter | digit } ; Ometa2 id = letter (letter | digit)* PetitParser id := #letter asParser , ! (#letter asParser / #digit asParser) star 78
  77. 77. S.Ducasse RMod Smalltalk is a serious player in DSL Trivial model Trivial syntax Internal DSLs Embedded DSLs Full tool support Extensible (build your own) Executable 79
  78. 78. S.Ducasse RMod 80
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×