JITで3倍速を実現しました。version 3.0.0リリース
ついにやりました。JITで高速化が成功しました。
JIT無しで3秒かかっていた処理がJITによって1秒になっています。
やりました。
高速化の秘密はコンパイル時にClover2のバイトコードをLLVMによってネイティブコードにコンパイルしている点です。ネイティブコードはダイナミックライブラリに保存しています。それを実行時に読み込み実行時には全くコンパイルせずにネイティブコードで動いています。もうJITとは呼べないかもしれません。単にネイティブコードコンパイラと言ってもいいかもしれません。
ただし、注意点があります。環境変数LD_LIBRARY_PATHに~/.clover2を追加してください。基礎ライブラリは~/.clover2に置いてあるので、soファイルが~/.clover2にあります。ダイナミックライブラリの検索パスに~/.clover2を追加してください。それで実行時にダイナミックライブラリが読み込まれてネイティブコードでClover2のコードは実行されます。ユーザーが作ったクラスを~/.clover2に追加する場合はclclファイルだけでなくso, so.1.0.0ファイルも~/.clover2に追加する必要があります。
あとはLLVM3.8でしか実行をためしていないので、LLVM3.8以外では動かないかもしれません。ただ、単にbcファイルしか出力していないので、他のLLVMのバージョンでも動くかもしれません。また試しておきます。
bit-compilerブランチとして開発していましたが、version3.0としてmasterにマージしています。git clone https://github.com/ab25cq/clover2.gitでソースファイルがダウンロードできます。インストール方法はwikiを見てください。wikiの方も新しい情報に今から更新しておきます。
今日はビールと日本酒で祝杯をあげます。
優しく見守ってくれた奥さんに感謝したいと思います。
Clover2のソースファイルコンパイル時にbcファイルの出力と実行時にbcファイルの実行が可能になりました。
Clover2のソースファイルコンパイル時にbcファイルの出力と実行時にbcファイルの実行が可能になりました。32bitでも動きます。
とりあえず、bit-compilerブランチにpushしています。masterへのマージはもう少し待ってください。bcファイルをコンパイル時にアセンブラにしてダイナミックライブラリを作り、実行時はbcファイルのコンパイル無しで動かしたいので。それがJITでは最速の方法でしょう。今のところ実行時のbcファイルのコンパイルが遅くて、JITは前より遅くなっています。
LLVMは前は4.0で開発していましたが、現在は3.8で開発しています。masterにマージしたら、その旨をwikiに書きたいと思います。
今日はまだ休みでまだ時間があるので、ダイナミックライブラリ化ができるかもしれません。llvm-asしてダイナミックライブラリを作り、load_class時にダイナミックライブラリを読み込むだけでいいので、簡単です。どれほどの速度が出るか、ワクワクします。それでClover2もネイティブコンパイラの仲間入りです。もしかしたらJava様より速いかも、、、。LLVMのおかげです。クリス・ラトナーさんに感謝です。彼はコンピュータの世界に革命を起こしました。
乱筆乱文失礼。1週間ほどバグに悩んでいて解決したので。ちょっと興奮気味です。
それでは、enjoy programing!
JITのソースファイルの分割
現在bit-compilerブランチで開発しています。
JITのソースファイルが大きすぎてあまりにもコンパイル速度が遅いため、分割しました。かなりいい加減な分割の仕方で綺麗なソースとは言い難いですが、とりあえず、分割はできました。
LLVMの32bit対応ですが、思ったよりはすんなり終わりそうです。LLVM自体64bit, 32bitの両方に対応できるように作られている様子なので。
32bit対応が終わってJITのバグを幾つか修正できれば、JIT高速化第3弾を再開します。masterにマージできる日は9月末も厳しいかもしれません。10月に入るかもしれません。まあ、ぼちぼちやっていきたいと思います。
今日は明日が休みなので夜更かししてしまいました。睡眠時間を削ると次の日の休みが台無しになるので、結局効率は良くないんですけどね。まあ、たまにはいいでしょう。皆さんは早く寝て、早く起きて無理せずに生活してくださいね。僕もあまり夜更かししないようにしたいと思います。明日はせっかくの休みなのに睡眠時間が少ないので堪えるでしょうね。とほほ。僕は生活のリズムが決まっていて遅く寝ても早く起きちゃうんですよね。気をつけたいと思います。
bit-compilerブランチの方では32bit CPUにVMは対応しました。
現在はbit-compilerブランチで開発しています。
いくらかmasterの方のバグも見つかっており修正しているので、早くmasterの方にマージしたいんですが、まだまだ先になりそうです。
bit-compilerブランチではVMが32bitに対応しています。後はJITの方を32bitに対応したいと思います。それは明日以降。
後はJITの方の高速化第3弾が完成したら、ようやくmasterにマージが出来ます。たぶん、9月末になるんじゃないでしょうか。
JITの方はかなりバグが見つかっており、修正に追われそうです。
masterの方はとりあえずは動く状態になっており、ダウンロードするならmasterの方が無難です。ただ、masterにもバグが有り環境によっては動かないと思います。
早く修正してmasterにマージしたいと気が焦るのですが、ぼちぼちやっていきたいと思います。あのSwiftでさえ4年かかったらしいので、僕はまだ1年半くらいですし。気長に待っててください。すみません。最終的にはSwift並の完成度を持つ本格的なオブジェクト指向言語を考えています。速度もダイナミックライブラリを使ってネイティブコンパイル言語並の速度をJITで出したいと思います。お楽しみに。
JIT高速化第3弾。
とりあえず、出力するアセンブラの型が厳密になりました。
コンパイルに関してはb.clcのテストも通ってます。
後基礎ライブラリも正しいアセンブラを出力している様子です。
この後はコンパイルされたアセンブラのコードを読み込む部分になります。LLVMに付属するlli.cppを参考に読み込めるようにしたいと思います。読み込み実行することが出来たら、make testを実行してみます。
しかし、動かなくて愕然することになりそうですが。
まあ、ぼちぼち一歩ずつですね。
完成すればJust In Compileとは呼べなくなります。実行時にはコンパイルしていないので。どちらかとちうとネイティブコードを出力するコンパイラに近くなります。Clover2もネイティブコードを出力するコンパイラの仲間入りです。完成が楽しみです。
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にマージしたいと思います。