Luaと協調するマルチステージ言語 Terra (1)

今年5月ごろに公開されて、Twitterではちょっとは流れてきたのだけれども、日本語の情報が全然流れないままのTerraという言語があって、ちょっと気が向いたのでもう一度調べてみることにした。

Terra

どんな言語なのか

説明によれば、TerraはLuaと同時に使えるローレベルシステムプログラミング言語で、C言語のようにシンプルで、静的型付けで、手動メモリー管理の言語なのだけれども、Cとは違って構文はLua風だし、Luaと協調して働くので、マルチステージプログラミングを行うための強大な力を手にしている。これはC言語の貧弱なマクロとは比べ物にならない。

公式ページには、こんなことに使えると書いてある。

高性能な拡張を伴ったスクリプト言語
静的型を持っていてLLVMでコンパイルする言語なので、C言語並の実行速度が期待できる。
自作言語のための埋め込みJITコンパイラ
メタプログラミング機構によって、自作のDSLも実行時コンパイルできる。
スタンドアロンのローレベル言語
Luaへの依存が無いオブジェクトファイルや実行ファイルを出力できるから、スタンドアロン向けにも使える。

こんなん聞いたら、マジかよヤベーってなるでしょ。そんな言語、難解なんじゃないの? って思っちゃうけど、とりあえず、ちょっと見てみよう。

スタンドアロン版ハローワールド

無難に、ハローワールドから。Terra公式のトップのコードとほとんど変わらないけど、もうちょっと単純にしてある。

-- hello.t
print("Hello from Lua!")

stdio = terralib.includec("stdio.h")

terra hello(argc : int, argv : &rawstring)
    stdio.printf("Hello from Terra!\n")
    return 0
end

terralib.saveobj("helloterra", { main = hello })

Terraのソースコードは、構文が拡張されたLuaソースコードだ。terraというキーワードから始まる、Terra関数定義文が追加されている。Terra関数はterralib.saveobjという関数で、オブジェクトファイルに書きだすことができる。

hello.tをterraコマンドに渡すと、Luaで書かれた地の文がその場で実行される。

terra$ terra hello.t 
Hello from Lua!

そして、カレントディレクトリにhelloterraという実行ファイルが生成される。これを実行すると、定義したhello関数が実行される。

terra$ ./helloterra 
Hello from Terra!
terra$ ldd helloterra 
	linux-vdso.so.1 =>  (0x00007fffff1fe000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f4b4177a000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f4b41b91000)

依存しているライブラリも、C言語と同様の最小限のものであり、ランタイム環境などは含んでいない。調べたところ、この実行ファイルのサイズは8557バイトで、C言語で書かれたハローワールドをビルドしたものとほとんど同じサイズであった。

(気があれば続く)