HaskellでLuaVMのbytecode生成
やりたいこと
- 処理系の開発メモ
- 字句解析、構文解析、意味解析→bnfcかhaskellで自作
- 中間言語としてGC(Guarded Command)を出し、それをLuaのbytecodeとして出力(Luaはメンテされたいい感じのVMだから)
- よさげなライブラリ: https://github.com/ajnsit/luachunk
- Luaの実行系でbytecodeを走らせる(クロスプラットフォーム!)
LuaVMについて
LuaJitのbytecodeについて
fact.lua
#!/usr/bin/env lua function fact(n) if n == 0 then return 1 else return n * fact(n - 1) end end print("enter a numbrer: ") a = io.read("*number") print(fact(a))
これを、こうやると実行できる
$ lua fact.lua enter a numbrer: 3 6
ではbytecodeは
$ luac -l fact.lua main <fact.lua:0,0> (17 instructions at 0x7faa11406390) 0+ params, 3 slots, 1 upvalue, 0 locals, 7 constants, 1 function 1 [1] VARARGPREP 0 2 [9] CLOSURE 0 0 ; 0x7faa11406540 3 [3] SETTABUP 0 0 0 ; _ENV "fact" 4 [11] GETTABUP 0 0 1 ; _ENV "print" 5 [11] LOADK 1 2 ; "enter a numbrer: " 6 [11] CALL 0 2 1 ; 1 in 0 out 7 [12] GETTABUP 0 0 4 ; _ENV "io" 8 [12] GETFIELD 0 0 5 ; "read" 9 [12] LOADK 1 6 ; "*number" 10 [12] CALL 0 2 2 ; 1 in 1 out 11 [12] SETTABUP 0 3 0 ; _ENV "a" 12 [13] GETTABUP 0 0 1 ; _ENV "print" 13 [13] GETTABUP 1 0 0 ; _ENV "fact" 14 [13] GETTABUP 2 0 3 ; _ENV "a" 15 [13] CALL 1 2 0 ; 1 in all out 16 [13] CALL 0 0 1 ; all in 0 out 17 [13] RETURN 0 1 1 ; 0 out function <fact.lua:3,9> (13 instructions at 0x7faa11406540) 1 param, 3 slots, 1 upvalue, 1 local, 1 constant, 0 functions 1 [4] EQI 0 0 0 2 [4] JMP 3 ; to 6 3 [5] LOADI 1 1 4 [5] RETURN1 1 5 [5] JMP 7 ; to 13 6 [7] GETTABUP 1 0 0 ; _ENV "fact" 7 [7] ADDI 2 0 -1 8 [7] MMBINI 0 1 7 0 ; __sub 9 [7] CALL 1 2 2 ; 1 in 1 out 10 [7] MUL 1 0 1 11 [7] MMBIN 0 1 8 ; __mul 12 [7] RETURN1 1 13 [9] RETURN0