The LLVM Compiler Infrastructure Project

JavaVMとかドットネットのCLR(Common Language Runtime)は、性能と引きかえに「安全性」や「利便性」を手に入れる仕組みです。一番大きいのは、こういうやり方でプログラムを動かすとウィルスが原理的に作れないということ。こういうご時世ですから、これは重要です。他にも、ひとつのプログラムが複数の環境(OS,CPU)で使えるといういい所もあります。

そのかわり、これで動かすプログラムは昔のやり方よりは少し遅くなる。これはしょうがないから基本的にはあきらめるんですが、そういう作る側の事情なんか知ったこっちゃないエンドユーザは容赦なく文句を言うので、やはりそれなりに早くする努力もしなくちゃいけない。

「遅い遅い」と言われて、仮想マシンの中の人もいろいろ悩みました。悩んで悩んで、ふとあることに気がついて叫びました。「そうだ!俺には武器があったんだ!」つまり、仮想マシンは、「動的プロファイル」という他の処理系が持ってない重要な情報を持っているんです。

「動的プロファイル」というのは、プログラムの中で実際に忙がしく動いているのはどこかという情報。プログラムというのは、実は本当に働いているのは全体のうちのほんのわずか。どこの会社もそうでしょうが、大半の社員は一日じゅうサボっていて、真面目に仕事しているのはごく一部なんです。誰が本当によく働いているのか、仮想マシンだけが知っている。

それである時から、仮想マシンはこれをフルに活用して、よく働いている人に手厚いボーナスをあげるようになったんです。プログラムの断片に最適化というご褒美をあげると、喜んじゃってよく働くんです。昔の方法では、このボーナスを全員に均等に配るしかなかった。コンパイル時に出すしかないんで、誰が本当に仕事するのかまだよくわからないんです。だからコード全体に最適化をするしかない。それでは、がんばっている奴がむくわれないで、どうでもいい奴ばっかり最適化の恩恵を亨受して全体としてはあまり性能があがらない。しかし、「動的プロファイル」を使うとこれを有効活用できるので、全体としてのスピードがかなり上がってくる。

具体的にはJava仮想マシンで「ホットスポット」という名前の動的最適化の機能が追加されてから、Javaはかなり早くなりました。

しかし、これはもともと遅いものがだいぶ早くなって、昔のC言語のスピードに追いついたということで、やってることは凄いんですけど、結果として目に見えるものが「もとどおり」では面白くない。

だいぶ、前置きが長くなりましたが、JavaVMで有効性が証明されつつある「動的最適化」という技術を抜き出して、そこだけをとことん追求したのがこのLLVMというプロジェクト。これが実に面白そうです。

これは、基本的にはこれまで仮想マシンという名前で呼ばれていた技術の延長線上にあるのですが、「安全性」を捨てています。つまりC#Javaと違って、やり方によってはウィルスができちゃう。そのリスクとひきかえにスピードを徹底的に追求しています。実行時最適化に従来のコンパイル時の最適化を統合して、トータルで最適な性能を追求する、さらには、使ってない時にこっそり最適化なんて技も使う。

「使ってない時」っていうのが重要で、前回起動した時に誰がよく働いたかを覚えているんです。それで、動的最適化のように仕事のあいまにやっつけ仕事でボーナスをやろうということではなくて、仕事が終わってから静的にじっくりとことん最適化する。静的最適化と動的最適化のいいとこどりです。使いこんでから一晩寝かしておくと、小人さんのおかげで翌日にはプログラムが早くなってる。そういう魔法のような機能です。

具体的には、CやC++でプログラムを組んで、このLLVM用のGCCコンパイルをする。そうするとexeができるんですが、このexeはドットネットのexeやJavaのclassファイルと同じで、仮想マシン用の中間コードになっているわけです。そして、これをランタイムがかなりこねくり回してから内部で機械語にして動かす。こねくり回した結果、JavaC#はもちろんCで書いた普通のEXEよりも早くなってしまうということです。

「今時、CPUが速過ぎて使い道がないくらいなのに、何をそんなに急ぐ必要があるのか?」という疑問もあるでしょう。実際、JavaC#で大抵のプログラムは書けるし、性能が問題になることもそれほどありません。いったい何に使うのか?

簡単に言えば、JavaC#で書けないもの。そんなプログラムはほとんどないんですが、ゼロではない。ごく一部ですが、そういうプログラムが残っていて、それはすごく重要なものです。

ひとつは、JavaVMやCLRに相当するレイヤーをこれで書くということ。(Low Levelという名前の由来は、どうもそこにあるようです)もうひとつは、OS自身をこれで動かすということ。

それが次の項目につながります。