読者です 読者をやめる 読者になる 読者になる

Clover2開発日誌

Clover2というJavaのように静的な型を持つRubyのようなインタプリタの開発日誌です。https://github.com/ab25cqにて開発しています

キャスト以外の命令の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としてリリースしたいと思います。

LLVM化進んでます

VMの命令を上から順番にLLVMに移植しています。

intからbyteへのキャストなどアラインメントが小さくなるキャストは意味がないとやっと気づいたので消去しました。

少し速くなったかもしれません。コンピュータに対する無知が知れてしまい恥ずかしい思いです。

まだまだコンピュータのことが分かってませんね。

逆にbyteからintへのキャストはスタックに確保するサイズによってはSegment faultが起こったり正しい値が得られないことは分かってましたけどね。

後リトルエンディアンとビッグエンディアンも詳しくは理解していません。値に対するメモリの上位バイトと下位バイトの格納の順番が違うとは分かってますがあまり意識して書いてません。もしかしたらClover2はINTELのプロセッサ以外では動かないかもしれません。INTELは確かリトルエンディアンですね。ビッグエンディアンでは動かないかもしれません。ARMはビッグエンディアンでしたっけ。まあ、googleで調べてみますが。後、Clover2は64bitのCPUでしか動きません。確かポインタの値が64bitだということを仮定していて、そこさえ修正すれば32bitのCPUでも動かせるとは思いますが、あまり古いCPUで動かしてもらえることは想定していません。今風のubuntuFedoraで動かしてください。Debian, CentOSでもいいですが。まあ、遊びのコンパイラなので、新し目のOSでVPSでも自宅の自作PCでもなんでも良いので気楽に試してもらえれば嬉しいです。

LLVM化もだいぶ慣れてきました。

TRY文に対応しました。とりあえず、制御構文は対応できました。

あとは順次VMにある命令の上から一つづつLLVMに対応してます。

夏の終わり頃には終わるのではと言ってましたが、もしかしたら、春の終わりにはLLVMでのJITに対応できるかもしれません。

LLVM化にもだいぶ慣れてきて、大抵のしたいことはソースコードからコピーアンドペーストするだけで、実現してしまってます。

関数化しればいいですが、LLVMのコードは関数にしづらいのでコピーアンドペーストすることが多いです。

速度の方はでの程度速くなるかは分かりません。あまり期待はしないでください。VMのスタックに直接値を入れる方式を取っているので、思ったよりは速度アップにはつながらないかもしれません。

LLVM用にスタックを作れば速度アップは望めますが、そこまではできなかったので。

まあ、ぼちぼちVMから命令をJITの方に移植して言います。