Clover2開発日誌

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

型推論

ブロックオブジェクトで戻り値の型を省略した場合、returnされる値によって型推論されるようになりました。ただ、Clover2の場合boxingやunboxing、プリミティブ型やユーザークラスなどがあるので、それほど便利ではありません。例えばList.mapメソッドのブロックオブジェクトの戻り値にAnonymousクラスと記述しないと、boxingされません。結局toIntegerなどと型変換のスペシャルメソッドを呼ばないといけないため期待されるほど記述が減るわけでは無いです。まあ、とりあえず、入れただけです。

 

後はAnonymousクラスにはcast("bool")などキャストスペシャルメソッドを作りました。ちょっと自分でClover2を使ってみたんですがAnonymousクラスが使いづらかったためです。

 

テスト中仮想マシンがSegmentation Faultするなど、まだまだシステムが不安定なため、しばらく機能拡張よりもデバッグに専念します。

 

ユーザーの皆様も、もしバグを見つけたらgithubのab25cq宛にメッセージを送っていただけると助かります。すぐに対応させて貰いたいと思います。フィードバックよろしく、お願いします。

 

自分で使ってみた印象ですが、ブロックオブジェクトを書くのが凄くめんどくさいため、ブロックオブジェクトが一つだけの引数の場合Rubyのような記述ができるような糖衣構文を入れたいと思います。

今日中にやってしまうかもしれません。

 

3.times() { println("HO!"); }

3.times(lambda() { println("HO!") });

と同じ記述ってことにしますかね。そのままRubyですが、、、、。

 

引数がある場合もRubyと同じ記述にしていまいます。

あとlist { 1, 2, 3 }とかもかなり記述が面倒くさいんですよね。Ruby風の方が良いんでしょうね。

なんか全体的に記述が面倒くさい気がします。

型チェックの厳密性はそのままにもう少し記述が楽にできるように工夫してみます。型チェックの厳密性は維持します。型チェックを甘くするとシステムが不安定になるので。

それだけ今日やってみますかね。

関数が定義できるようになりました。

メインスクリプトやメソッドの中などで、def fun(a:int): int { return a * 2 } などと書くと関数が定義できます。

 

内部的には単にブロックオブジェクトをローカル変数funに代入しただけのものです。特に関数オブジェクトってわけじゃないです。単なるlambdaブロックオブジェクトです。

拡張ライブラリを作れるようになりました。

dlopen, dlsym, dlcloseなどダイナミックライブラリ関連のシステムコールを用意しました。クラスのinitialize():staticで、これらとnative methodの登録用のメソッドを使うと拡張ライブラリが作れます。

詳しくはwikiに書きますので見てください。もしくはcode/ext.clcとcode/ext.cl, ext/hello.cを見てください。C言語での関数の書き方はsrc/class_system.cが参考になると思います。

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!