LLVMをCMakeを使ってビルドする。あとexampleのbrainfuck実装を動かしてみる。

Building LLVM with CMake — LLVM 7 documentationを読めばできると思います。

~ $ wget http://llvm.org/releases/2.7/llvm-2.7.tgz
~ $ tar zxf llvm-2.7.tgz
~ $ cd llvm-2.7
~/llvm-2.7 $ mkdir build
~/llvm-2.7 $ cd build
~/llvm-2.7 $ cmake .. -i
Windows版のCMakeはかっちょいいGUI版があるけど、ないので-iで。なんか色々聞かれる。
Variable Name: CMAKE_INSTALL_PREFIX
Description: Install path prefix, prepended onto install directories.
Current Value: /usr/local
New Value (Enter to keep current value): /home/hogelog/local

Variable Name: LLVM_BUILD_EXAMPLES
Description: Build LLVM example programs.
Current Value: OFF
New Value (Enter to keep current value): BrainF

Variable Name: LLVM_TARGETS_TO_BUILD
Description: Semicolon-separated list of targets to build, or "all".
Current Value: Alpha;ARM;Blackfin;CBackend;CellSPU;CppBackend;Mips;MBlaze;MSIL;MSP430;PIC16;PowerPC;Sparc;SystemZ;X86;XCore
New Value (Enter to keep current value): CBackend;CppBackend;X86

だけ設定、他デフォルトのまま。
...
~/llvm-2.7/build $ make -j 5
5並列ビルド。数字は適当。
...
~/llvm-2.7/build $ make install

llvmの色々な物がインストールされる。BrainFことbrainfuckをビルドして試してみる。

~/llvm-2.7/build $ make BrainF
~/llvm-2.7/build $ cp bin/BrainF ~/local/bin
~/llvm-2.7/build $ cd /tmp
/tmp $ wget http://esoteric.sange.fi/brainfuck/utils/mandelbrot/mandelbrot.b
/tmp $ ./bin/BrainF mandelbrot.b
/tmp $ ./bin/lli mandelbrot.b.bc
下の画像。


で、速いの?

/tmp $ time lli mandelbrot.b.bc >/dev/null

real    0m7.974s
user    0m7.960s
sys     0m0.012s
/tmp $ opt -O3 mandelbrot.b.bc -o mandelbrot.b.opt.bc
/tmp $ time lli mandelbrot.b.opt.bc >/dev/null

real    0m11.357s
user    0m11.337s
sys     0m0.020s

おいどうしたんだ、最適化したら遅くなったぞ!

自分でxbyak使って書いてみたbf-jitと比較してみる。

/tmp $ time bf-jit <mandelbrot.b >/dev/null

size of x86-code: 22442

real    0m3.887s
user    0m3.888s
sys     0m0.000s

おいどうしたんだLLVM

このように! LLVMを使って言語処理系を実装すると、今どきの言語処理系にはあってて当然くらいのノリで求められるけど実装が大変なJITや最適化が可能になりました! すべての言語処理系はLLVMに帰結する時代だ!!!

自作bf-jitは「どうせbrainfuckで書くプログラムなんてそんな長くならねえし最初に全部機械語まで落としこんでいいだろ」という前提で書いてあったり、そもそもbrainfuckという言語で書かれたプログラムは一般的なプログラムの性質に合わないところが多く、そういう一般的なプログラムが高速に動くようなLLVMの最適化がbrainfuckでうまく動かなくてもそんなに不思議は無いと思います。しかし世の中にあふれるスクリプト言語のような人達は、LLVMにおける最適化にうまく一致するような性質を抱いているのか、そしてLLVMにうまくはまるようにその言語のLLVMフロントエンドを実装することというのはその言語で動くようなJITコンパイラを1から書くことと比べ本当に楽なのだろうか、そんな辺りが疑問です。luajitというLua言語の処理系がllvm-luaというllvmを利用した処理系を凌駕する性能を示しているのは、たまたまそっちを実装している人の腕が良かったからなのか、なんなのか。誰かよく調べて考えて、ブログの記事か何かにまとめておいてください。

test