言語ゲーム

とあるエンジニアが嘘ばかり書く日記

Twitter: @propella (MF東京 8/3,4)

LLVM で hello, world

LLVM で hello, world した記録。とても簡単でした。

LLVMhttp://llvm.org/releases/2.8/llvm-2.8.tgz からダウンロードしました。コンパイルの仕方は普通に

$ ./configure
$ make
$ sudo make install

です。結構時間がかかります。LLVM のプログラムは LLVM assembly language で書きます。

; hello.ll

@hello = internal constant [13 x i8] c"hello, world\00"

declare i32 @puts(i8*)

define i32 @main() {
start:
  %0 = call i32 @puts(i8* getelementptr inbounds ([13 x i8]* @hello, i32 0, i32 0))
  ret i32 0
}

気を付ける点は、文字列定数と型の文字数をあわせる事。値には必ず型を付ける事くらいです。アセンブルllvm-as を使います。hello.ll をコンパイルすると hello.bc が出来ます。

$ llvm-as hello.ll

実行は lli を使います。

$ lli hello.bc 
hello, world

感想

LLVM は分かりにくいプロジェクトです。LLVM というからには JavaFlash のようなバーチャルマシンだと思ったら、人によっては新しい C コンパイラの事だったり、最適化ツールの事だったりします。実際自分で試して一番興味を惹かれたのは、ポータブルなアセンブラとしての LLVM です。文法も分かりやすいし、標準的なアセンブラとして今後教科書なんかで使われるようになるんじゃないかと思いました。

あと、Mac OS XXCode には、最初から llvm-gcc や clang が付いてきます。これを使って C ソースから LLVMバイトコードを作る事が出来ますが、他のアセンブラ llvm-as や JIT コンパイラ lli などの面白いツールが無いので LLVM 本体をソースから入れました。逆に言うと、llvm-gcc front end を入れる必要は無かったです。

LLVMhello world の記事はググると山ほどありますが、割と専門的な事まで書いてあって難しかったので、最低限の事だけ書いてみました。