FreeStyleWiki

HaskellでLuaVMのbytecode生成

このエントリーをはてなブックマークに追加

[Haskell,Lua]

HaskellでLuaVMのbytecode生成

やりたいこと

  • Z言語の仕様をベースとしたZ/Object-Zのサブセットを目指す
    • 代数計算と仕様記述ができる言語
    • Z言語のmain関数って定義あるのかね、ないなら作るが
  • 処理系の開発メモ
    • 字句解析、構文解析、意味解析→bnfcかhaskellで自作
    • 中間言語としてGC(Guarded Command)を出し、それをLuaのbytecodeとして出力(Luaはメンテされたいい感じのVMだから)
    • 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