Luaと協調するマルチステージ言語 Terra (2)
実行時コンパイル
LuaからTerraの関数を呼べるし、TerraからLuaの関数を呼べる。
-- hello2.t stdio = terralib.includec("stdio.h") function hello_lua() print("Hello from Lua!") end terra hello_terra() stdio.printf("Hello from Terra!\n") end terra hello() hello_lua() hello_terra() end hello()
このコードをterraコマンドに渡すと、そのまま実行される。
terra$ terra hello2.t Hello from Lua! Hello from Terra!
Terraの関数は、呼び出された時にコンパイルされる。
terraコマンドに-iオプションをつけると、実行後にREPLに入る。
Terra関数をプリティプリントしたり、逆アセンブルすることができる。
terra$ terra -i hello2.t Hello from Lua! Hello from Terra! Terra -- A low-level counterpart to Lua Stanford University zdevito@stanford.edu > hello:printpretty() hello1 = terra() : {} r0x418c0060 = <lua cdata<void (*)()>: 0x7fa4f4657008>() r0x418c4c20 = hello_terra0() end > hello:disas() definition {}->{} define void @hello1() { entry: tail call void @1() %puts.i = tail call i32 @puts(i8* getelementptr inbounds ([18 x i8]* @str, i64 0, i64 0)) ret void } assembly for function at address 0x7fa4f4585070 0x7fa4f4585070(+0): push RAX 0x7fa4f4585071(+1): movabs RAX, 140346451652616 0x7fa4f458507b(+11): call RAX 0x7fa4f458507d(+13): movabs RAX, 140346433084944 0x7fa4f4585087(+23): movabs RDI, 140346451587088 0x7fa4f4585091(+33): pop RDX 0x7fa4f4585092(+34): jmp RAX