Deriving a compiler and interpreter for a Multi-level
1. Deriving a Uniform
Compiler and VM
with
Low-Level Code
Generation
Jaiyalas
2. Term
evaluator Term
Val
Val
Defunctionalizing
Continuations
eval appK appC Cont
Compt
Term
VM
Val eval appK for
Low-Level Code Generation
Cont Term
Val
Currying &
Primitive Recursive Evaluator eval appK appC Cont
Term Compt
Defunctionalizing
Val eval appK Run-Time Computation
Cont
3. Term
evaluator Term
Val
Val
Defunctionalizing
Continuations
eval appK appC Cont
Compt
Term
VM
Val eval appK for
Low-Level Code Generation
Cont Term
Val
Currying &
Primitive Recursive Evaluator eval appK appC Cont
Term Compt
Defunctionalizing
Val eval appK Run-Time Computation
Cont
4. Term
evaluator Term
Val
Val
Defunctionalizing
Continuations
eval appK appC Cont
Compt
Term
VM
Val eval appK for
Low-Level Code Generation
Cont Term
Val
Currying &
Primitive Recursive Evaluator eval appK appC Cont
Term Compt
Defunctionalizing
Val eval appK Run-Time Computation
Cont
5. Term
evaluator Term
Val
Val
Defunctionalizing
Continuations
eval appK appC Cont
Compt
Term
VM
Val eval appK for
Low-Level Code Generation
Cont Term
Val
Currying &
Primitive Recursive Evaluator eval appK appC Cont
Term Compt
Defunctionalizing
Val eval appK Run-Time Computation
Cont
6. Term
evaluator Term
Val
Val
Defunctionalizing
Continuations
eval appK appC Cont
type Compt = Compt
Term
Int -> Env -> Cont -> Val
VM
Val eval appK for
Low-Level Code Generation
Cont eval :: Term -> Compt Term
appK :: Cont -> Val -> Val Val
Currying &
Primitive Recursive Evaluator eval appK appC Cont
Term Compt
Defunctionalizing
Val eval appK Run-Time Computation
Cont
7. Term
evaluator Term
Val
Val
Defunctionalizing
Continuations
eval appK appC Cont
Compt
Term
VM
Val eval appK for
Low-Level Code Generation
Cont Term
Val
Currying &
Primitive Recursive Evaluator eval appK appC Cont
Term Compt
Defunctionalizing
Val eval appK Run-Time Computation
Cont
8. Term
evaluator Term
Val
type Compt = [Inst] Val
Defunctionalizing
Continuations
eval appK appC Cont
data Inst = Number Int Compt
Term | Access Int
VM
Val eval appK | Lambda Compt for
Low-Level Code Generation
Cont
| Push Compt Term
| Enter
Val
Currying & | Leave
Primitive Recursive Evaluator eval appK appC Cont
Term Compt
Defunctionalizing
Val eval appK Run-Time Computation
Cont
9. Term
evaluator Term
Val eval Source Code Val
Defunctionalizing
Continuations
eval appK appC Cont
VM Instructions
Compt
Term
appC High-Level Code appK VM
Val eval appK for
Low-Level Code Generation
Cont Term
Val
Currying &
Primitive Recursive Evaluator eval appK appC Cont
Term Compt
Defunctionalizing
Val eval appK Run-Time Computation
Cont
10. Term
evaluator Term
Val
Val
Defunctionalizing
Continuations
eval appK appC Cont
Compt
Term
VM
Val eval appK for
Low-Level Code Generation
Cont Term
Val
Currying &
Primitive Recursive Evaluator eval appK appC Cont
Term Compt
Defunctionalizing
Val eval appK Run-Time Computation
Cont
11. Term
evaluator Term
Val
Val
Defunctionalizing
Continuations
eval appK appC Cont
Compt
Term
VM
Val eval
eval appK
Source Code for
Low-Level Code Generation
Cont Term
VM Instructions Val
Currying &
eval
Primitive Recursive Evaluator appK appC Cont
appC VM Instructions appK
Term Compt
Defunctionalizing
Val eval appK Run-Time Computation
Cont
12. eval Source Code
VM Instructions
(Run-Time Computation)
Level
Environment appC VM Instructions appK
Continuation
VM Instructions
(Run-Time Computation)
Level
Environment appC VM Instructions appK
Continuation
13. Demo
feval3.hs
compile exp6
run $ compile exp6
run $ compile $ deq $ run $ compile exp6
feval42.hs
compile exp6
run $ compile exp6
run $ deq $ run $ compile exp6
14. Non-Uniform
Compilation
and
Failure of Low-Level
Code Generation
15. eval Source Code, Level
VM Instructions
(Run-Time Computation)
Level
Environment appC VM Instructions appK
Continuation
VM Instructions
(Run-Time Computation)
Level
Environment appC VM Instructions appK
Continuation
16. Term
evaluator Uniform Term
Val
Val
Defunctionalizing
Continuations
eval appK appC Cont
type Compt = Compt
Term
Int -> Env -> Cont -> Val
VM
Val eval appK for
Low-Level Code Generation
Cont eval :: Term -> Compt Term
appK :: Cont -> Val -> Val Val
Currying &
Primitive Recursive Evaluator eval appK appC Cont
Term Compt
Defunctionalizing
Val eval appK Run-Time Computation
Cont
17. Term
evaluator Term
Val
Non-Uniform Val
Defunctionalizing
Continuations
eval appK appC Cont
Compt
Term type Compt = VM
Val eval appK -> Cont -> Val
Env for
Low-Level Code Generation
Cont eval :: Term -> Int ->Compt Term
appK :: Cont -> Val -> Val Val
Currying &
Primitive Recursive Evaluator eval appK appC Cont
Term Compt
Defunctionalizing
Val eval appK Run-Time Computation
Cont
18. Term
evaluator Term
Val
Val
Defunctionalizing
Continuations
eval appK appC Cont
Compt
Term
VM
Val eval appK for
Low-Level Code Generation
Cont Term
Val
Currying &
Primitive Recursive Evaluator eval appK appC Cont
Term Compt
Defunctionalizing
Val eval appK Run-Time Computation
Cont
19. Term type Compt = [Inst]
evaluator Term
Val data Inst = Number Int Val
| Access Int
Defunctionalizing eval appK appC Cont
Continuations
| Lambda Compt
| Push Compt Compt
Term
| Enter L = 0 VM
Val eval LeaveappK for
| Low-Level Code Generation
Cont | Plus Compt Term
| QLit Int Val
Currying &
Primitive|Recursive Evaluator
QVar Int eval appK appC Cont
| PushQAbs Compt Int L > 0
Term | PushQApp Compt Compt
Val eval | PushQNextappK Defunctionalizing
Run-Time Computation
| PushQPrev
Cont | PushQAdd Compt
20. Enter compiler Next , 0
PushQNext compiler Next , 1
21. Enter compiler
o r m
Next , 0
n if
n - U
PushQNext
N o compiler Next , 1
23. VM Instructions
appC appCQ
appK appKQ
Interpretation Compilation VM
24. Demo
Jainon/nonnifeval3.hs
compile exp6
run $ compile exp6
run $ compile $ deq $ run $ compile exp6
25. Term
evaluator Term
Val
Val
Defunctionalizing
Continuations
eval appK appC Cont
Compt
Term
VM
Val eval appK for
Low-Level Code Generation
Cont Term
Val
Currying &
Primitive Recursive Evaluator eval appK appC Cont
Term Compt
Defunctionalizing
Val eval appK Run-Time Computation
Cont
26. Term
evaluator Term
Val
Val
Defunctionalizing eval appK appC Cont
?
Continuations
Compt
Term
VM
Val eval appK for
Low-Level Code Generation
Cont Term
Val
Currying &
Primitive Recursive Evaluator eval appK appC Cont
Term Compt
Defunctionalizing
Val eval appK Run-Time Computation
Cont
27. compiler Source Code, Level
L=0 L>0
VM Instructions
VM
| QLit Int
L>0 | QVar Int
| PushQAbs Compt Int
| PushQApp Compt
| PushQNext
| PushQPrev
| PushQAdd Compt
28. compiler Source Code, Level
L=0 L>0
VM Instructions
VM
o r m
n if | QLit Int
| QVar Int
U L>0
| PushQAbs Compt Int
| PushQApp Compt
| PushQNext
| PushQPrev
| PushQAdd Compt
29. data Inst = Lv0Numer Int
| Lv0Access Int
| Lv0Lambda Compt
| Lv0...
| Lv1Number Int
| Lv1Access Int
| Lv1...
| ...
| LvnNumber Int
| Lvn ...
30. data Inst = Lv0Numer Int
| Lv0Access Int
| Lv0Lambda Compt
| Lv0...
| Lv1Number Int
| Lv1Access Int
| Lv1...
| ...
| LvnNumber Int
| Lvn ...
32. Term
evaluator Term
Val
Val
Defunctionalizing
Continuations
eval appK appC Cont
Compt
Term
VM
Val eval appK for
Low-Level Code Generation
Cont Term
Val
Currying &
Primitive Recursive Evaluator eval appK appC Cont
Term Compt
Defunctionalizing
Val eval appK Run-Time Computation
Cont
34. (Next (Next (Add (Lit 2) (Lit 3))))
Compiler
[Enter,PushQNext,PushQAdd [QLit 2],QLit 3]
VM
? ? ?
l =
v e
e
Quot [PushQNext,PushQAdd [QLit 2],QLit 3]
L