Clover2開発日誌

Clover2というJavaのように静的な型を持つRubyのようなコンパイラ+仮想マシンの開発日誌です。LLVMでJITもします。https://github.com/ab25cqにて開発しています。

LLVM高速化第3弾

始めています。githubではブランチを切ったので、前の高速化を行ったときのコードは普通にgit clone https://github.com/ab25cq/clover2.gitでダウンロードできます。

 

第3弾ではコンパイル時にビットコードにコンパイルしています。この間のバグではバージョンを疑いましたが(そのようなエラーメッセージをLLVMが出していたので)違いました。単に出力しているbitcodeがおかしかっただけでした。bitcodeにコンパイルすると型チェックが厳しくなるみたいで、出力はできてもロードが出来ないことがLLVMにある様子です。

LLVMで出力されているコードが正しいかどうかですが、llvm-dis a.bcなどとするとチェックすることが出来ます。bcファイルへの出力はllvm::WriteBitcodeToFileですることが出来ます。

あとLLVM4.0をもとに作っていましたが、多くのディストリビューションでサポートされているLLVM3.8でコンパイルできるように修正しています。大して変わっていない様子で3.8対応はすんなりと出来ました。

LLVMのプログラミングですがmodule->dumpをして出力されているコードをllvm-as, llvm-disなどを使い正しいかどうかチェックしていく方法が一番いいと思います。このあたり手探りでしていくしかありません。

 

しかし、LLVMはなかなか手ごわいです。僕はreadline, oniguruma, pcre, terminfo, curses辺りのシンプルなライブラリしか使ったことがありませんでしたが、LLVMのような大きなフレームワークを使うのは初めてで、なかなか慣れません。

自分でしかコードを書いていないとシンプルでアートのようなコードを書くことが出来ますが、フレームワークを使うときは泥臭いコードを躊躇なく使うことが求められると思います。後は書籍を読んだりググったりして概念を少しずつ学んでいくことですね。

なかなかに勉強になりました。

また、ぼちぼちやっていきます。完成したらmasterにマージしたいと思います。