LLVM使ってみた。

昨日、xubuntu 14.4にclangをインストールした。
sudo apt-get install clang-3.5
と打ってインストール
なぜかインストールした全てのコマンド名の後ろに-3.5が付いていた。
3.5はLLVM及びclangのバージョンだ。
Javaみたいに中間言語ファイルを実行させるコマンドがある。
コマンド名はlli。(lli-3.5になっていたけど。)
中間言語の逆アセンブラもある。
test.cというソースを作って
clang-3.5 -O2 -emit-llvm -fno-exceptions -fno-vectorize -c test.c
と打つと test.bc という中間言語ファイルができる。
lli-3.5 test.bc
と打つと実行できた。
他の環境では多分-3.5は要らないと思う。
llvm-dis-3.5 test.bc
と打つとtest.llという仮想マシンのアセンブリ言語のようなソースを出力。
LLVMはマルチプラットフォーム。
中間言語ファイルをlliで実行してもGUI、グラフィックは使えないと思う。
コマンドラインのプログラムなら拡張子bcの中間言語ファイルがマルチプラットフォームのプログラムになるのかなと思った。
それを確かめるために、LLVM公式ページからWindows版のLLVM(clang)64ビット版のバイナリをダウンロードしてインストールしてみた。
だが、lliコマンドもllvm-disコマンドもない。
なんでかは知らない。
自分でソースからコンパイルしないと使えないと言うことらしい。
これでは中間言語ファイルをマルチプラットフォームとして使うことを普及させることは難しい。
おまけにWindows版のclangコマンドはLLVM公式からダウンロードしたものだけだとコンパイルできないような気が。
やはりJavaのように中間言語ファイルを実行させるのではなく、最後まで静的コンパイルして、ネイティブの実行ファイルを実行させる使い方がメインと考えているのだろう。
じゃあなぜ中間言語にする必要があるのかという点は、コンパイラを別のCPUに移植しやすいということだろうか?
Googleの「Portable Native Client」(PNaCl)はChromeウェブブラウザでJavascriptの代替となるネイティブコードを実行するようなことを言っているけど嘘だ。
ネイティブコードだとx86とARMでは互換性がなくなる。
だからLLVMのアセンブリ言語ソース(LLVM-IR)を読ませているらしいがこれはネイティブコードではない。
実行前にコンパイルして実行するからネイティブだと言いたいのかも知れないが、それってネイティブではなくJITでは。
LLVMの中間言語は逆コンパイルできるんだうか。
PNaClは今のところChromだけがやっていて普及しそうにない。
WebAssemblyは普及するかも知れない。
WebAssemblyとLLVMの関係がよく分からない。