LLVM で hello, world した記録。とても簡単でした。
LLVM は http://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 というからには Java や Flash のようなバーチャルマシンだと思ったら、人によっては新しい C コンパイラの事だったり、最適化ツールの事だったりします。実際自分で試して一番興味を惹かれたのは、ポータブルなアセンブラとしての LLVM です。文法も分かりやすいし、標準的なアセンブラとして今後教科書なんかで使われるようになるんじゃないかと思いました。
あと、Mac OS X の XCode には、最初から llvm-gcc や clang が付いてきます。これを使って C ソースから LLVM のバイトコードを作る事が出来ますが、他のアセンブラ llvm-as や JIT コンパイラ lli などの面白いツールが無いので LLVM 本体をソースから入れました。逆に言うと、llvm-gcc front end を入れる必要は無かったです。
LLVM で hello world の記事はググると山ほどありますが、割と専門的な事まで書いてあって難しかったので、最低限の事だけ書いてみました。
参考
- ツールの使い方: http://llvm.org/docs/GettingStarted.html#tutorial
- LLVM Language Reference Manua: http://llvm.org/docs/LangRef.html
- Hello World in LLVM: http://ecksit.wordpress.com/2011/01/01/hello-world-in-llvm/
- LLVM for Beginners (Windows): http://adrianboeing.blogspot.com/2009/05/llvm-for-beginners-windows.html
- LLVMのアセンブリコードによるプログラム: http://safx-dev.blogspot.com/2011/01/llvm.html
- LLVM で Hello, World の puts 関数: http://www.metareal.org/2007/07/22/hello-world-llvm-and-runtime-libraries/
- まずは: http://d.hatena.ne.jp/ytqwerty/20070912#p1