Clover2開発日誌

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

JIT高速化の続き。

現在./configure --with-jitは動きません。

 

まだキャスト以外の命令が残ってました。今度こそ残りはキャスト命令のみとなります。

7月末までにはリリースできそうです。それで、本当にのらプログラマー引退すると思います。拡張ライブラリを書けるようにしたり、ソケットクラスを作ったりはすると思いますけど、ご隠居がメンテナンスしているという感じでコーディングしたいと思います。

もし、Clover2が広く使われるなら、もう少し改良などしたいと思います。

あとはザウルスで動かしたいですね。ちょっとザウルスのgccは古いしザウルスは32bit CPUなので、ソースの変更をしないといけませんが、LLVM以外はすんなりと動くと思います。まあ、32bit  + gccという環境もサポートしないといけませんし。そんな感じですかね。

まあ、ぼちぼちやっていきます。

LLVM高速化の続き

現在./confiugre --with-jitは動きません。

 

とりあえず、だいぶ進んでます。キャスト以外の命令はほとんど終わりですかね。後はアドレスを取る命令辺りかな。

OP_INVOKE_DYNAMIC_METHODも動いてます。

今回のJITVMのスタックを使わずにLLVM用のスタックを使っているので、凄く命令が短くなっています。最適化もフルでONになっています。

どれくらい速くなるか楽しみです。

3秒かかっていた命令が1秒以下になったりして、、、わくわくします。

Clover2の利点ですが、とりあえず、オープンクラスとmixin-layersによる差分プログラミングです。組み込みのクラスさえも機能拡張することができます。欠点は継承が無い所かもしれません。

継承あんまり好きじゃないんですよね。無いお陰で凄くスッキリした仕様になってます。その代わりインターフェースとモジュールがあるので似たようなことはしようと思えばすることはできます。

ちょっとモジュールとインターフェースを使ったポリモフィズムのソースはダサい感じになりますが、、、やっぱり継承の方がスッキリしたソースになりますね、、、。うーん。

インタフェースとモジュールを組み合わせて、なんか作りますかね。

実装付きインタフェースですかね。class A implements IntegerfaceWithModuleみたいな感じかなぁ、、、。

JIT高速化の続き

OP_INVOKE_VIRTUAL_METHODを実装しました。インタフェースのメソッドの実行ができます。

先日後は膨大なキャスト命令だけだと書きましたが、大事なのを忘れてました。

あとはOP_INVOKE_DYNAMIC_METHODもまだなので、今日の晩辺り、それを書いておきます。

とりあえず、キャスト命令以外を実装していきますね。しばらく。

その後キャスト命令を一気に終えたいと思います。

高速化ができるかどうかですが確実に速くなると思います。

VM用のスタックにいちいち値を書き込んでいた頃より出力するコードの量が凄く減っています。LLVM用のスタックをJIT時に用意したので。

最適化もフェーズ全てONにして動いています。出力されるコードは本当に最適化が凄くかかって、短いコードとなってます。

やっぱり、僕はとりあえず手探りで書いて、その後もう一回書き直す方法でコーディングしないと駄目みたいで。一発で良いものは作れませんね。もし、プログラマーを仕事にすることがあれば、おんなじように2回書くようにしないと駄目だろうと思います。プロトタイプを作るってやつですかね。とりあえず、プロトタイプを書いてから、本番って感じで書くのが癖みたいです。

だって最初は使う命令を調べながら書くから、どうもわからないことだらけで、正解のコードは書けそうにないのですもの。

実際のプロはどうしているかは知りませんけど、僕のやり方は大体決まってきたかなと思います。

 

LLVM楽しいです。ホント作者って凄い人だと思います。gccの頃は一部のマニアだけのものだったネイティブコードの世界をオープンにしてくれたというか。JIT付きのインタプリタとかコンパイラとか、すごく簡単に作れるようになりました。Linuxより凄い業績じゃないかなぁ。コンピュータの世界にノーベル賞はないですけど、ほんとノーベル賞並の功績だと思います。尊敬します。

JITの高速化の続き

とりあえず、演算子は全てサポートしたはずです。

ただテストがまだです。

前書いたものから基本的にはコピーアンドペーストしただけでしたので、量だけ多くて疲れました。

ポインタ関係の演算と浮動小数点の演算辺りにバグがありそうです。ポインタを使った演算のテストはmake testすれば、デバッグできるので、そのときにデバッグとテストをしたいと思います。

LLVMでポインタと普通の数値の加算ってOKなんだろうか。OKでないとセグフォするはずです。

ちょっと今からテストだけしておきますかね。気になります。

後は膨大にあるキャスト群の高速化だけでほぼ終わりです。

私事ですが、来月の半ばから一月休みがあるので、そのときに終わらせたいと思います。リリースは8月15日あたりですかね。遅くても。version 2.0としたいと思います。version 2.0がリリースされれば高速化されていてもされてなくても、もう「のらプログラマー」を引退すると思います。

ただ引退後も細々とClover2の改良とデバッグ、ソースの整理などは行っていきたいと思います。機能追加は拡張ライブラリを書けるようにするだけですね。ソケットクラスは作るかどうか迷ってます。それだけしておくかもしれません。スレッドはサポートしません。デバッグに苦労した覚えがあるので。あんまりスレッド好きじゃなくて。

JITの高速化の続き

フィールドのロードができるようになりました。

まだまだ道のりは長いです。

 

LLVMにもようやく慣れてきたところです。

結構使いやすいかもしれません。セグフォが出るとバグを探すのが難しいですが。エラーメッセージ出してくれればいいんですが

大体セグフォが出てデバッグに苦労します。

JITの高速化の続き

現在./configure --with-jitは動きません。

 

ローカル変数が定数として扱われていたため最適化がかかりfor文などが動かなかったバグがありましたが、修正しています。

ローカル変数はマシーンスタックに確保するようにしました。

 

LLVMって最適化が凄くて出力するコードが生き物みたいです。

作者って天才って言っても、いいんじゃないでしょうか。

兎に角Linux並に衝撃があるソフトウェアだと思います。

コンピュータの歴史を変えたと思います。

凄いなぁ、、、。