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を利用した処理系を凌駕する性能を示しているのは、たまたまそっちを実装している人の腕が良かったからなのか、なんなのか。誰かよく調べて考えて、ブログの記事か何かにまとめておいてください。