Clover2開発日誌

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

ちょっと無理してキャストのJIT化を大幅に進めました。

お題のとおりです。ちょっと疲れました。

キャスト命令の全体の1/2くらい進めた感じです。

後はのんびり進めます。

問題は速度が出るかですねぇ。演算子以外アセンブラで書かずに

C関数を呼んでいるだけの部分が多いので速くなるか謎です。

後家のサーバーは速いので測定が難しいかも。誤差があるでしょうから。

JITのオーバーヘットを考えると遅くなる場合もあるでしょうね。

そのあたりjit指定をユーザーに慎重に付けてもらったらいいなと思ってます。

 

話は変わりますが、だいぶ暑くなってきましたね。

夏は短いのですぐ終わりそうですが。

そろそろ梅雨入りですか。あんまり嬉しくないですね。

本格的な夏が来たら皆さんも夏バテしてないように気をつけてくださいね。

僕も気をつけます。

キャスト以外の命令のJIT化に成功

テストはいまいちやってませんが、一応動いています。

キャスト以外の命令のJIT化に成功してます。

後はキャスト命令のJIT化していきます。

まあ、凄い分量があるので、ぼちぼちですね。

やはり予定通りLLVMによるJITの完成は6月下旬になりそうです。

今日は区切りってことで、奥さんのハンバーグで晩酌します。

楽しみです。ビールを実家で貰ってこようかな、、、、。

キャスト以外の命令のJIT化がだいぶ進みました

お題のとおりです。明日以降キャスト以外の命令をJIT化してから、大量にあるキャスト命令のJIT化をしたいと思います。

山場だと思っていたOP_INVOKE_VIRTUAL_METHOD, OP_INVOKE_DYNAMIC_METHODなどはCの関数を呼ぶだけで簡単に実装できました。ブロックの呼び出しもJIT化されています。

あとはポインタ関係の命令がちょっとだけ残ってます。

それが終わればいよいよキャスト命令をJIT化して、フィナーレです。6月末までにはなんとかリリースに持っていきたいです。

お楽しみに。

全演算子をJIT化

タイトル通り全演算子JIT化できました。

ちょっとテストが足りていないので、バグがあるかもしれませんが、多分、大丈夫だと思います。

あとは山ほどあるキャストをJIT化していきます。

見るだけでゲンナリするほど量がありますが、少しずつ進めたいと思います。

 

あとはVIRTUAL_METHOD_CALLやDYNAMIC_METHOD_CALL辺りが山場かなと思います。まあ、単にCの関数を呼び出すだけになりますが。

 

とりあえずは、今日も晩酌して、全演算子JIT出来たことにほっとしてます。

 

LLVMについてですが、学ぶにはやっぱり検索エンジンが頼りになります。特にStack Over Flowで引っかかるページにはお世話になってます。書籍についてはですが、狐さんは買ったのですが、バージョンの違いもあり、読んでません。結局バージョンアップの速度が早すぎて書籍は陳腐化するのがLinux界隈やプログラミング界隈だと思います。書籍で学ぶには新刊を買ってからすぐ読むしか無いですね。そうしないと、すぐにバージョンが変わってしまい、内容が古くなってしまいます。結局のところコーディングするのに一番大事なのは英語力だというのが僕の持論です。何かフレームワークや言語を学ぶためには本家のマニュアルやチュートリアルを英語で読むのが一番確実だと思います。LLVMではKaleidoscopeというLLVMチュートリアルで説明されている実装が最初の取っ掛かりとしては良いんじゃないでしょうか。後は検索しながら書いているうちにここまで来ました。

 

LLVMについては英語だと書籍が一杯あるでしょうし、やっぱりプログラミングするためには英語が読めることが大事じゃないでしょうか。書籍や文章が日本語化された頃にはバージョンが変わっていて困ることになると思います。

 

でも、僕自身英語が得意かといわれれば、全然そうじゃなくて、ほんと困ってます。ソフトウェアは生き物なので、仕様がどんどん変わっていくものなので、今度始まるコーディングの義務教育化でも、先生方は困ると思います。取っ掛かりは教えることが出来ても、結局英語のマニュアルを自力で読んで自身で学んでいくしかないんじゃないでしょうか。

 

僕も英語がもっとできたらなといつも思っています。皆さんもそうじゃないではないですか?

JITで演算子の実装を進めました

今回の収穫はキャストの仕方がわかったことですね。

とりあえず、僕のVMにはキャストが山ほどあるので、それが山場だと思っていたので、それがなんとかなりそうだと分かり、ほっとしてます。

 

あとは道なりに全部の命令をJIT化していきます。

問題は速くなるかですが、LLVMの最適化を信じています。

とりあえず-O3で3倍程度に速くなるLLVMの最適化を見ると、速くなりそうでワクワクします。

 

Clover2は文字列処理が遅いのが弱点だったので、そこがなんとかなると嬉しいです。正規表現を使った大量の文字列処理だと遅いサーバー上で実行すると13秒とか「今時なにこれ?」みたいな時間をかかってたので。ただpcre自体が遅い場合はお手上げですが、、、、。

 

でも、速いサーバーではJITを使わなくても十分な速度がでます。とにかくClover2をJIT無しで使う場合はVPSには高いお金を払ってくださいとしか言えません。

 

どこぞの安い月500円のVPSでは兎に角遅かったです。

 

Clover2の開発中C++コンパイル速度が遅すぎて困っていたので月1000円程度のVPSに引越ししました。引っ越すと、C++コンパイル速度がびっくりするぐらい速くなりました。やっぱり、VPSはケチってはいけませんね。

 

まあ、そんな感じです。5月中は無理かもしれませんが、6月末にはJIT付きのClover2 versioin1.4がリリースできると思います。その後はSocketクラスや拡張ライブラリを作れるようにしたり、のんびり改良していきます。退役軍人みたいなもんですかね。リリースが楽しみです。

JITで補数の単項演算子を追加

JITで補数の単項演算子を追加しました。

だいたい全体の1/2くらいの進捗ですかね。

ぼちぼち残りの1/2やっていきます。

重要な命令はほとんどできているので、後はキャストやfloat, doubleの演算子辺りが山場ですかね。

大体来月末にはJIT付きのVMでversion 1.40がリリースできると思います。

速度がどれほど出るかですが、あまり自信はありません。とりあえず、組み込みのクラスのメソッドはほとんどJITにしてしまい、速度測定してみます。遅かった大量のテキストの処理が速くなっていればいいのですが、、、。

LLVM化は続く

とりあえず、byte,ubyte,short,ushort,int,uint,long,ulongの2項演算子は出来ました。全体の1/4か1/3くらいの進捗だと思います。

 

早ければ今月末か来月末には終えられると思います。

 

その後は拡張ライブラリを書くためにSystemクラスにLoadLibrary?でしたっけ。動的ライブラリをロードするシステムコールとnative methodに関数ポインタをマッピングするメソッドを追加したいと思います。

 

それでやりたいことはほとんど出来たかもしれません。

Socketクラスとかも欲しいですけど、ぼちぼちやっていきます。

Threadクラスは入れないと思います。たぶん、、、。

一時期LLVMを学んでいた頃はちょっと仕事が忙しかった時期と重なって大変でしたが、最近はLLVMもだいぶ理解できたので、ぼちぼちやってます。

LLVM化が完成したらversion 1.4としてリリースしたいと思います。