JIT高速化の続き
現在./configure --with-jitは有効ではありません。
キャスト命令のJIT化をはじめました。LLVM上では複数の命令が同じ命令として扱えるので、かなり早く終わりそうです。
来週中?現職を辞める前には終わるかもしれません。
来週は忙しいですが、コーディングする時間を作って、終わらせたいと思います。
キャスト命令が終わればmake testやらテストをしてデバッグして安定すればversion 2.0としてリリースします。
まあ、リリースと行ってもgithub上でしか配布していないので、単にpushするだけですが。
version 2.0がリリースできれば、かなり高速化される予定なので使ってやってください。うりはmixin-layersによる差分プログラミングです。まあ、僕のアイデアじゃないですけどね。10年くらい前にアスペクト指向が流行ったときに出てきた日本人の先生のアイデアです。C++でもmixin-layersが使える実装があったはずです。そちらで試してもらってもいいですけどね、、、。オリジナルはJVM上で動くMix-Juese(ミックスジュース。綴あっているかな?)って言う実装です。今も開発されているかは知りませんが。
差分プログラミングは僕自身が使ってみたかったので入れてます。大規模なソフトウェアでは有効な考え方で、もっと注目されてもいいと思います。
JIT高速化の続き。
現在./configure --with-jitは動きません。
まだキャスト以外の命令が残ってました。今度こそ残りはキャスト命令のみとなります。
7月末までにはリリースできそうです。それで、本当にのらプログラマー引退すると思います。拡張ライブラリを書けるようにしたり、ソケットクラスを作ったりはすると思いますけど、ご隠居がメンテナンスしているという感じでコーディングしたいと思います。
もし、Clover2が広く使われるなら、もう少し改良などしたいと思います。
あとはザウルスで動かしたいですね。ちょっとザウルスのgccは古いしザウルスは32bit CPUなので、ソースの変更をしないといけませんが、LLVM以外はすんなりと動くと思います。まあ、32bit + gccという環境もサポートしないといけませんし。そんな感じですかね。
まあ、ぼちぼちやっていきます。
LLVM高速化の続き
現在./confiugre --with-jitは動きません。
とりあえず、だいぶ進んでます。キャスト以外の命令はほとんど終わりですかね。後はアドレスを取る命令辺りかな。
OP_INVOKE_DYNAMIC_METHODも動いてます。
今回のJITはVMのスタックを使わずに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の改良とデバッグ、ソースの整理などは行っていきたいと思います。機能追加は拡張ライブラリを書けるようにするだけですね。ソケットクラスは作るかどうか迷ってます。それだけしておくかもしれません。スレッドはサポートしません。デバッグに苦労した覚えがあるので。あんまりスレッド好きじゃなくて。