読者です 読者をやめる 読者になる 読者になる

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