implementing programming languages for fun and proï¬t with
TRANSCRIPT
![Page 1: Implementing Programming Languages for Fun and Proï¬t with](https://reader030.vdocuments.us/reader030/viewer/2022020703/61fb2a402e268c58cd5aebc9/html5/thumbnails/1.jpg)
Implementing Programming Languages for Fun and Profit with
OMetaAlessandro Warth
Viewpoints Research Institute & UCLA
![Page 2: Implementing Programming Languages for Fun and Proï¬t with](https://reader030.vdocuments.us/reader030/viewer/2022020703/61fb2a402e268c58cd5aebc9/html5/thumbnails/2.jpg)
Who am I?
![Page 3: Implementing Programming Languages for Fun and Proï¬t with](https://reader030.vdocuments.us/reader030/viewer/2022020703/61fb2a402e268c58cd5aebc9/html5/thumbnails/3.jpg)
NOT David Simmons
![Page 4: Implementing Programming Languages for Fun and Proï¬t with](https://reader030.vdocuments.us/reader030/viewer/2022020703/61fb2a402e268c58cd5aebc9/html5/thumbnails/4.jpg)
NOT Billy Idol
![Page 5: Implementing Programming Languages for Fun and Proï¬t with](https://reader030.vdocuments.us/reader030/viewer/2022020703/61fb2a402e268c58cd5aebc9/html5/thumbnails/5.jpg)
!
!
!!
!
!
!
!
!
!
!
!
!
"#$%$&'(!)$!*+,!!
-#'.)/0!$.!1232&)!456!7889!!
!1('.!:';6!<'.!=.3'((&6!>$&?@A@!B&?@C'6!='.!"@2C'#)'6!'.0!1.0#/'&!
D''E!
!
!
!
!
!
!
!
!!
!
!
F"D=!D/&/'#G?!*$)/!D*H7889H887!
"#$%&'#()*!+$*$,-./!0(*)#)1)$2!3456!7-,(8!9$()-,:!;<$(1$2!7:$(8,:$2!9;!63453!!!)=!>?3?@!AA4BA553!!C=!>?3?@!4DDB6EF3!
programming languages
![Page 6: Implementing Programming Languages for Fun and Proï¬t with](https://reader030.vdocuments.us/reader030/viewer/2022020703/61fb2a402e268c58cd5aebc9/html5/thumbnails/6.jpg)
STEPS... toward the reinvention of programming
![Page 7: Implementing Programming Languages for Fun and Proï¬t with](https://reader030.vdocuments.us/reader030/viewer/2022020703/61fb2a402e268c58cd5aebc9/html5/thumbnails/7.jpg)
The STEPS Project
• Goal: To create a highly useful end-user system including...
• operating system
• programming environment
• “applications”
• graphics, sound } personal computing
![Page 8: Implementing Programming Languages for Fun and Proï¬t with](https://reader030.vdocuments.us/reader030/viewer/2022020703/61fb2a402e268c58cd5aebc9/html5/thumbnails/8.jpg)
... in under 20,000 LOC!
![Page 9: Implementing Programming Languages for Fun and Proï¬t with](https://reader030.vdocuments.us/reader030/viewer/2022020703/61fb2a402e268c58cd5aebc9/html5/thumbnails/9.jpg)
Windows XP~40 million LOC
![Page 10: Implementing Programming Languages for Fun and Proï¬t with](https://reader030.vdocuments.us/reader030/viewer/2022020703/61fb2a402e268c58cd5aebc9/html5/thumbnails/10.jpg)
Squeak~200 thousand LOC
![Page 11: Implementing Programming Languages for Fun and Proï¬t with](https://reader030.vdocuments.us/reader030/viewer/2022020703/61fb2a402e268c58cd5aebc9/html5/thumbnails/11.jpg)
Why?
• To put people in charge of their own SW destinies
• No single person can understand 40,000,000 LOC (~library)
• You can “own” 20,000 LOC (~book)
![Page 12: Implementing Programming Languages for Fun and Proï¬t with](https://reader030.vdocuments.us/reader030/viewer/2022020703/61fb2a402e268c58cd5aebc9/html5/thumbnails/12.jpg)
![Page 13: Implementing Programming Languages for Fun and Proï¬t with](https://reader030.vdocuments.us/reader030/viewer/2022020703/61fb2a402e268c58cd5aebc9/html5/thumbnails/13.jpg)
Why? (cont’d)
• Didactic value
• a curriculum for university students to learn about powerful ideas
• may even be good for AP C.S.
![Page 14: Implementing Programming Languages for Fun and Proï¬t with](https://reader030.vdocuments.us/reader030/viewer/2022020703/61fb2a402e268c58cd5aebc9/html5/thumbnails/14.jpg)
Programming Languages
• STEPS: code size, understandability
• Choice of programming language has a big impact on both
• What’s the right one for STEPS?
![Page 15: Implementing Programming Languages for Fun and Proï¬t with](https://reader030.vdocuments.us/reader030/viewer/2022020703/61fb2a402e268c58cd5aebc9/html5/thumbnails/15.jpg)
![Page 16: Implementing Programming Languages for Fun and Proï¬t with](https://reader030.vdocuments.us/reader030/viewer/2022020703/61fb2a402e268c58cd5aebc9/html5/thumbnails/16.jpg)
Long Lines...
• It takes lots of time and effort to implement a programming language
• limits how much experimenting we can do
![Page 17: Implementing Programming Languages for Fun and Proï¬t with](https://reader030.vdocuments.us/reader030/viewer/2022020703/61fb2a402e268c58cd5aebc9/html5/thumbnails/17.jpg)
• Traditional PL implementations are BIG
• only have 20k LOC for the whole thing!
Big and Bad
![Page 18: Implementing Programming Languages for Fun and Proï¬t with](https://reader030.vdocuments.us/reader030/viewer/2022020703/61fb2a402e268c58cd5aebc9/html5/thumbnails/18.jpg)
![Page 19: Implementing Programming Languages for Fun and Proï¬t with](https://reader030.vdocuments.us/reader030/viewer/2022020703/61fb2a402e268c58cd5aebc9/html5/thumbnails/19.jpg)
OMeta
![Page 20: Implementing Programming Languages for Fun and Proï¬t with](https://reader030.vdocuments.us/reader030/viewer/2022020703/61fb2a402e268c58cd5aebc9/html5/thumbnails/20.jpg)
OMeta
an OO language for pattern matching
![Page 21: Implementing Programming Languages for Fun and Proï¬t with](https://reader030.vdocuments.us/reader030/viewer/2022020703/61fb2a402e268c58cd5aebc9/html5/thumbnails/21.jpg)
ometa
![Page 22: Implementing Programming Languages for Fun and Proï¬t with](https://reader030.vdocuments.us/reader030/viewer/2022020703/61fb2a402e268c58cd5aebc9/html5/thumbnails/22.jpg)
JavaScript (OMeta/Squeak)
![Page 23: Implementing Programming Languages for Fun and Proï¬t with](https://reader030.vdocuments.us/reader030/viewer/2022020703/61fb2a402e268c58cd5aebc9/html5/thumbnails/23.jpg)
Sun’s Lively Kernel (OMeta/COLA)
![Page 24: Implementing Programming Languages for Fun and Proï¬t with](https://reader030.vdocuments.us/reader030/viewer/2022020703/61fb2a402e268c58cd5aebc9/html5/thumbnails/24.jpg)
Toylog
• Front-end to Prolog for children
• Runs on Squeak
• ~70 LOC
Homer is Bart’s father.Marge is Bart’s mother.x is y’s parent if x is y’s father or or x is y’s mother.x is Bart’s parent?
![Page 25: Implementing Programming Languages for Fun and Proï¬t with](https://reader030.vdocuments.us/reader030/viewer/2022020703/61fb2a402e268c58cd5aebc9/html5/thumbnails/25.jpg)
Toylog Demo
![Page 26: Implementing Programming Languages for Fun and Proï¬t with](https://reader030.vdocuments.us/reader030/viewer/2022020703/61fb2a402e268c58cd5aebc9/html5/thumbnails/26.jpg)
What can OMeta do for you?
• Make your life easier with DSLs
• good DSLs come from people who need them
• not PL people
• Make your apps scriptable by end-users
• ... without making them learn Smalltalk
![Page 27: Implementing Programming Languages for Fun and Proï¬t with](https://reader030.vdocuments.us/reader030/viewer/2022020703/61fb2a402e268c58cd5aebc9/html5/thumbnails/27.jpg)
Roadmap
• A brief overview of OMeta
• pattern matching
• OO features
• ...
• OMeta/JS
![Page 28: Implementing Programming Languages for Fun and Proï¬t with](https://reader030.vdocuments.us/reader030/viewer/2022020703/61fb2a402e268c58cd5aebc9/html5/thumbnails/28.jpg)
Traditional PL Implementation
![Page 29: Implementing Programming Languages for Fun and Proï¬t with](https://reader030.vdocuments.us/reader030/viewer/2022020703/61fb2a402e268c58cd5aebc9/html5/thumbnails/29.jpg)
lex,for lexical analysis
yacc,for parsing
visitors,for
AST transformationsand code generation
Traditional PL Implementation
![Page 30: Implementing Programming Languages for Fun and Proï¬t with](https://reader030.vdocuments.us/reader030/viewer/2022020703/61fb2a402e268c58cd5aebc9/html5/thumbnails/30.jpg)
Pattern Matching:A Unifying Idea!
• lexical analysis: characters → tokens
• parsing: tokens → parse trees
• constant folding and other optimizations: parse trees → parse trees
• code generation: parse trees → code
![Page 31: Implementing Programming Languages for Fun and Proï¬t with](https://reader030.vdocuments.us/reader030/viewer/2022020703/61fb2a402e268c58cd5aebc9/html5/thumbnails/31.jpg)
Why use PM for everything?
• Simplicity
• Less stuff to learn (lowers learning curve)
• Great for extensibility
• trad. impls hard to extend
• OMeta: every part of PL impl. (e.g., parsing, tree traversals, codegen) can be extended using same mechanism
![Page 32: Implementing Programming Languages for Fun and Proï¬t with](https://reader030.vdocuments.us/reader030/viewer/2022020703/61fb2a402e268c58cd5aebc9/html5/thumbnails/32.jpg)
Pattern Matching
• Other langs have PM, do we need OMeta?
• ML-style pattern matching
• great for tree transformations
• not good for lexing/parsing
• “That’s what ML-lex and ML-yacc are for!”
• OMeta is based on PEGs
![Page 33: Implementing Programming Languages for Fun and Proï¬t with](https://reader030.vdocuments.us/reader030/viewer/2022020703/61fb2a402e268c58cd5aebc9/html5/thumbnails/33.jpg)
Parsing Expression Grammars(PEGs)
• Recognition-based foundation for describing syntax
• Only prioritized choice
• no ambiguities
• easy to understand
• Backtracking, unlimited lookahead
• Semantic predicates, e.g., ?[x == y]
[Ford, ‘04]
![Page 34: Implementing Programming Languages for Fun and Proï¬t with](https://reader030.vdocuments.us/reader030/viewer/2022020703/61fb2a402e268c58cd5aebc9/html5/thumbnails/34.jpg)
dig ::= $0 | ... | $9
num ::= <num> <dig> | <dig>
expr ::= <expr> $+ <num> | <num>
PEGs, OMeta style
![Page 35: Implementing Programming Languages for Fun and Proï¬t with](https://reader030.vdocuments.us/reader030/viewer/2022020703/61fb2a402e268c58cd5aebc9/html5/thumbnails/35.jpg)
( ):d
:n :d
:e :n
dig ::= $0 | ... | $9
num ::= <num> <dig> | <dig>
expr ::= <expr> $+ <num> | <num>
PEGs, OMeta style
![Page 36: Implementing Programming Languages for Fun and Proï¬t with](https://reader030.vdocuments.us/reader030/viewer/2022020703/61fb2a402e268c58cd5aebc9/html5/thumbnails/36.jpg)
( ):d
:n :d
:e :n
=> [d digitValue]
=> [n * 10 + d]
=> [{#plus. e. n}]
dig ::= $0 | ... | $9
num ::= <num> <dig> | <dig>
expr ::= <expr> $+ <num> | <num>
PEGs, OMeta style
![Page 37: Implementing Programming Languages for Fun and Proï¬t with](https://reader030.vdocuments.us/reader030/viewer/2022020703/61fb2a402e268c58cd5aebc9/html5/thumbnails/37.jpg)
Increasing Generality
• PEGs operate on streams of characters
• OMeta operates on streams of objects
• anything matches any one object
• strings, e.g., ‘hello’
• symbols, e.g,. #ans
• numbers, e.g., 42
• “listy” objects, e.g., {‘hello’ #ans 42 {}}
![Page 38: Implementing Programming Languages for Fun and Proï¬t with](https://reader030.vdocuments.us/reader030/viewer/2022020703/61fb2a402e268c58cd5aebc9/html5/thumbnails/38.jpg)
Example: evaluating parse trees
eval ::= {#plus <eval>:x <eval>:y} => [x + y]
| <anything>:n ?[n isNumber] => [n]
{#plus. {#plus. 1. 2}. 3} → 6
![Page 39: Implementing Programming Languages for Fun and Proï¬t with](https://reader030.vdocuments.us/reader030/viewer/2022020703/61fb2a402e268c58cd5aebc9/html5/thumbnails/39.jpg)
dig ::= ($0 | ... | $9):d => [d digitValue]
num ::= <num>:n <dig>:d => [n * 10 + d] | <dig>
expr ::= <expr>:e $+ <num>:n => [{#plus. e. n}] | <num>
![Page 40: Implementing Programming Languages for Fun and Proï¬t with](https://reader030.vdocuments.us/reader030/viewer/2022020703/61fb2a402e268c58cd5aebc9/html5/thumbnails/40.jpg)
OMeta is Object-Oriented
dig ::= ($0 | ... | $9):d => [d digitValue]
num ::= <num>:n <dig>:d => [n * 10 + d] | <dig>
expr ::= <expr>:e $+ <num>:n => [{#plus. e. n}] | <num>
![Page 41: Implementing Programming Languages for Fun and Proï¬t with](https://reader030.vdocuments.us/reader030/viewer/2022020703/61fb2a402e268c58cd5aebc9/html5/thumbnails/41.jpg)
OMeta is Object-Oriented
dig ::= ($0 | ... | $9):d => [d digitValue]
num ::= <num>:n <dig>:d => [n * 10 + d] | <dig>
expr ::= <expr>:e $+ <num>:n => [{#plus. e. n}] | <num>
MyLang
![Page 42: Implementing Programming Languages for Fun and Proï¬t with](https://reader030.vdocuments.us/reader030/viewer/2022020703/61fb2a402e268c58cd5aebc9/html5/thumbnails/42.jpg)
anything ::= ...
...OMeta
OMeta is Object-Oriented
dig ::= ($0 | ... | $9):d => [d digitValue]
num ::= <num>:n <dig>:d => [n * 10 + d] | <dig>
expr ::= <expr>:e $+ <num>:n => [{#plus. e. n}] | <num>
MyLang
![Page 43: Implementing Programming Languages for Fun and Proï¬t with](https://reader030.vdocuments.us/reader030/viewer/2022020703/61fb2a402e268c58cd5aebc9/html5/thumbnails/43.jpg)
anything ::= ...
...OMeta
OMeta is Object-Oriented
dig ::= ($0 | ... | $9):d => [d digitValue]
num ::= <num>:n <dig>:d => [n * 10 + d] | <dig>
expr ::= <expr>:e $+ <num>:n => [{#plus. e. n}] | <num>
MyLang
expr ::= <expr>:e $- <num>:n => [{#minus. e. n}] | <super #expr>MyLang++
![Page 44: Implementing Programming Languages for Fun and Proï¬t with](https://reader030.vdocuments.us/reader030/viewer/2022020703/61fb2a402e268c58cd5aebc9/html5/thumbnails/44.jpg)
Parameterized rules
digit ::= $0 | $1 | $2 | $3 | $4 | $5 | $6 | $7 | $8 | $9
![Page 45: Implementing Programming Languages for Fun and Proï¬t with](https://reader030.vdocuments.us/reader030/viewer/2022020703/61fb2a402e268c58cd5aebc9/html5/thumbnails/45.jpg)
Parameterized rules
digit ::= $0 | $1 | $2 | $3 | $4 | $5 | $6 | $7 | $8 | $9
range :a :b ::= <anything>:x ?[x >= a] ?[x <= b] => [x]
![Page 46: Implementing Programming Languages for Fun and Proï¬t with](https://reader030.vdocuments.us/reader030/viewer/2022020703/61fb2a402e268c58cd5aebc9/html5/thumbnails/46.jpg)
Parameterized rules
digit ::= $0 | $1 | $2 | $3 | $4 | $5 | $6 | $7 | $8 | $9
digit ::= <range $0 $9>
range :a :b ::= <anything>:x ?[x >= a] ?[x <= b] => [x]
![Page 47: Implementing Programming Languages for Fun and Proï¬t with](https://reader030.vdocuments.us/reader030/viewer/2022020703/61fb2a402e268c58cd5aebc9/html5/thumbnails/47.jpg)
Higher-order rules
formals ::= <name> ($, <name>)*args ::= <expr> ($, <expr>)*
![Page 48: Implementing Programming Languages for Fun and Proï¬t with](https://reader030.vdocuments.us/reader030/viewer/2022020703/61fb2a402e268c58cd5aebc9/html5/thumbnails/48.jpg)
Higher-order rules
formals ::= <name> ($, <name>)*args ::= <expr> ($, <expr>)*
listOf :p ::= <apply p> ($, <apply p>)*
![Page 49: Implementing Programming Languages for Fun and Proï¬t with](https://reader030.vdocuments.us/reader030/viewer/2022020703/61fb2a402e268c58cd5aebc9/html5/thumbnails/49.jpg)
Higher-order rules
formals ::= <name> ($, <name>)*args ::= <expr> ($, <expr>)*
formals ::= <listOf #name>args ::= <listOf #expr>
listOf :p ::= <apply p> ($, <apply p>)*
![Page 50: Implementing Programming Languages for Fun and Proï¬t with](https://reader030.vdocuments.us/reader030/viewer/2022020703/61fb2a402e268c58cd5aebc9/html5/thumbnails/50.jpg)
OMetaJS = OMeta + JavaScript
OMetaParser
JSParser
![Page 51: Implementing Programming Languages for Fun and Proï¬t with](https://reader030.vdocuments.us/reader030/viewer/2022020703/61fb2a402e268c58cd5aebc9/html5/thumbnails/51.jpg)
OMetaJS = OMeta + JavaScript
OMetaParser
JSParser
OMetaJS Parser
![Page 52: Implementing Programming Languages for Fun and Proï¬t with](https://reader030.vdocuments.us/reader030/viewer/2022020703/61fb2a402e268c58cd5aebc9/html5/thumbnails/52.jpg)
OMetaJS = OMeta + JavaScript
OMetaParser
JSParser
OMetaJS Parser
![Page 53: Implementing Programming Languages for Fun and Proï¬t with](https://reader030.vdocuments.us/reader030/viewer/2022020703/61fb2a402e268c58cd5aebc9/html5/thumbnails/53.jpg)
OMetaJS = OMeta + JavaScript
OMetaParser
JSParser
OMetaJS Parser
![Page 54: Implementing Programming Languages for Fun and Proï¬t with](https://reader030.vdocuments.us/reader030/viewer/2022020703/61fb2a402e268c58cd5aebc9/html5/thumbnails/54.jpg)
OMetaJS = OMeta + JavaScript
OMetaParser
JSParser
OMetaJS Parser
• duplicated effort
• versioning problem
![Page 55: Implementing Programming Languages for Fun and Proï¬t with](https://reader030.vdocuments.us/reader030/viewer/2022020703/61fb2a402e268c58cd5aebc9/html5/thumbnails/55.jpg)
Foreign rule invocation
• Lend input stream to another grammar
• Compose multiple grammars w/o worrying about name clashes
ometa OMetaJSParser { ometajs ::= <foreign OMetaParser #grammar> | <foreign JSParser #stmt>}
![Page 56: Implementing Programming Languages for Fun and Proï¬t with](https://reader030.vdocuments.us/reader030/viewer/2022020703/61fb2a402e268c58cd5aebc9/html5/thumbnails/56.jpg)
This OMeta, That OMeta
• Several versions of OMeta:
• OMeta/Squeak
• OMeta/COLA
• OMeta/JS
• ...
• Slightly different syntaxes
• Use different languages for semantic actions and predicates
![Page 57: Implementing Programming Languages for Fun and Proï¬t with](https://reader030.vdocuments.us/reader030/viewer/2022020703/61fb2a402e268c58cd5aebc9/html5/thumbnails/57.jpg)
OMeta/JS
![Page 58: Implementing Programming Languages for Fun and Proï¬t with](https://reader030.vdocuments.us/reader030/viewer/2022020703/61fb2a402e268c58cd5aebc9/html5/thumbnails/58.jpg)
JavaScript Workspace
• Takashi Yamamiya’s handy work
• Inspiration for OMeta/JS
• Workspace-style interface for JavaScript
• Runs inside the web browser,works like a Wiki
![Page 59: Implementing Programming Languages for Fun and Proï¬t with](https://reader030.vdocuments.us/reader030/viewer/2022020703/61fb2a402e268c58cd5aebc9/html5/thumbnails/59.jpg)
JavaScript
• Dynamic language
• First-class functions (closures)
• Late-bound
• eval()
• Huge performance improvements lately
• new webkit runs at “.5 Squeaks”
![Page 60: Implementing Programming Languages for Fun and Proï¬t with](https://reader030.vdocuments.us/reader030/viewer/2022020703/61fb2a402e268c58cd5aebc9/html5/thumbnails/60.jpg)
Plus...
IT’S EVERYWHERE!
![Page 61: Implementing Programming Languages for Fun and Proï¬t with](https://reader030.vdocuments.us/reader030/viewer/2022020703/61fb2a402e268c58cd5aebc9/html5/thumbnails/61.jpg)
ASSEMBLYLANGUAGE
![Page 62: Implementing Programming Languages for Fun and Proï¬t with](https://reader030.vdocuments.us/reader030/viewer/2022020703/61fb2a402e268c58cd5aebc9/html5/thumbnails/62.jpg)
![Page 63: Implementing Programming Languages for Fun and Proï¬t with](https://reader030.vdocuments.us/reader030/viewer/2022020703/61fb2a402e268c58cd5aebc9/html5/thumbnails/63.jpg)
Switch to web
browser
![Page 64: Implementing Programming Languages for Fun and Proï¬t with](https://reader030.vdocuments.us/reader030/viewer/2022020703/61fb2a402e268c58cd5aebc9/html5/thumbnails/64.jpg)
![Page 65: Implementing Programming Languages for Fun and Proï¬t with](https://reader030.vdocuments.us/reader030/viewer/2022020703/61fb2a402e268c58cd5aebc9/html5/thumbnails/65.jpg)
OMeta/JS
Forget Guitar Hero... I could be the next Dan
Ingalls!
![Page 66: Implementing Programming Languages for Fun and Proï¬t with](https://reader030.vdocuments.us/reader030/viewer/2022020703/61fb2a402e268c58cd5aebc9/html5/thumbnails/66.jpg)
For more info...
• DLS’07 Paper
• OMeta Mailing Listhttp://vpri.org/mailman/listinfo/ometa
• OMeta/JS wikihttp://jarrett.cs.ucla.edu/ometa-js
• Ask questions now
![Page 67: Implementing Programming Languages for Fun and Proï¬t with](https://reader030.vdocuments.us/reader030/viewer/2022020703/61fb2a402e268c58cd5aebc9/html5/thumbnails/67.jpg)
THE END
![Page 68: Implementing Programming Languages for Fun and Proï¬t with](https://reader030.vdocuments.us/reader030/viewer/2022020703/61fb2a402e268c58cd5aebc9/html5/thumbnails/68.jpg)
Selected Related Work
• Parsing Expression Grammars [Ford, ‘04]
• LISP70 Pattern Matcher [Tesler et al., ‘73]
• Parser combinator libraries [Hutton, ‘92], [Bracha’07]
• “Modular Syntax” [Grimm, ’06]