LLVMが楽しい
LLVMが普及しつつあるけど実際どうなのか
ふと思いついてLLVMについて調べ始めた。 世間ではGoogle ChromeのPNaCLとかemscriptenやasm.jsが実用的に使われる気配が見えてきた。 AppleのMacOS XやFreeBSDのLLVMへの傾倒を見ると、そろそろどんなものか知りたくなってきた。 なぜか昔から自分はCross Platformの話題が好きなようで、i386で動くLinuxのエミュレーターをJavaで書いたこともある。(完全に黒歴史…)
LLVM-IR
Cross Platformerとしての興味の対象はLLVM-IRなので、まずはここから。 LLVM-IRの言語仕様を調べたりclangの出力するLLVM-IRのコードを眺めてみたりした。 clangの最適化オプションを -O0 から -O3 にしてどれくらい最適化されるのかを眺めたり。 LLVM-IRの抽象度は非常に高く読みやすく(読むものでは無いだろが)Cross Platformな話題が好きな自分にはかなり楽しそう。 挙句の果てには、LLVM-IRのコードをEmacsLispで動かせないかと実験をしてみたりした。
LLVM-IRをEmacsLispに翻訳
可能性を探るためにちょっとやってみたのだが、LLVM-IRのインタプリタlliコマンド の 約1000倍の実行時間がかかることがわかった。 ということでこれで思考実験は終わり。
このようなCプログラムをclangでコンパイルし、LLVM-IRを翻訳したEmacsLispで動かしてみた。
#include <stdio.h>
int main(void)
{
int total = 0;
volatile int i;
for( i = 0 ; i < (1000000 * 1000) ; i++ ) {
total += i+1;
}
printf( "total = %d\n", total );
return 0;
}
“clang -O0 -S -emit-llvm loop.c” で出力したLLVM-IRコードもあわせて見るにはこちら。 simple loop program.
つぎに愚直にEmacsLispに翻訳してみたのが loop1.el 手でちょっとだけ最適化してみたのが loop2.el Translate to Elisp from LLVM-IR code
LLVM-IRをSchemeに翻訳
愚直にSchemeに翻訳してGaucheで動かしてみたのがこちら。 lliの100倍の時間がかかる。しかしGaucheは速い。 Translate to Scheme from LLVM-IR code
cmigemoをEmacsLispで走らせられないか(妄想)
cmigemoを1000倍非力なCPUで動かすとどれくらい使えないかを測ってみた。 cmigemoの検索クエリから正規表現への展開は1000回実行しても100ms程度で、実用的な範囲。 しかし、mcigemoが辞書をロードする時間は1000回実行すると3分もかかる。これは実用にならない。
っと、ここで夢から覚めて我に返った(←イマココ) いやー妄想って楽しいもんです。