Clover2開発日誌

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

JIT高速化第3弾。

とりあえず、出力するアセンブラの型が厳密になりました。

コンパイルに関してはb.clcのテストも通ってます。

後基礎ライブラリも正しいアセンブラを出力している様子です。

この後はコンパイルされたアセンブラのコードを読み込む部分になります。LLVMに付属するlli.cppを参考に読み込めるようにしたいと思います。読み込み実行することが出来たら、make testを実行してみます。

 

しかし、動かなくて愕然することになりそうですが。

まあ、ぼちぼち一歩ずつですね。

 

完成すればJust In Compileとは呼べなくなります。実行時にはコンパイルしていないので。どちらかとちうとネイティブコードを出力するコンパイラに近くなります。Clover2もネイティブコードを出力するコンパイラの仲間入りです。完成が楽しみです。

LLVM高速化第3弾

始めています。githubではブランチを切ったので、前の高速化を行ったときのコードは普通にgit clone https://github.com/ab25cq/clover2.gitでダウンロードできます。

 

第3弾ではコンパイル時にビットコードにコンパイルしています。この間のバグではバージョンを疑いましたが(そのようなエラーメッセージをLLVMが出していたので)違いました。単に出力しているbitcodeがおかしかっただけでした。bitcodeにコンパイルすると型チェックが厳しくなるみたいで、出力はできてもロードが出来ないことがLLVMにある様子です。

LLVMで出力されているコードが正しいかどうかですが、llvm-dis a.bcなどとするとチェックすることが出来ます。bcファイルへの出力はllvm::WriteBitcodeToFileですることが出来ます。

あとLLVM4.0をもとに作っていましたが、多くのディストリビューションでサポートされているLLVM3.8でコンパイルできるように修正しています。大して変わっていない様子で3.8対応はすんなりと出来ました。

LLVMのプログラミングですがmodule->dumpをして出力されているコードをllvm-as, llvm-disなどを使い正しいかどうかチェックしていく方法が一番いいと思います。このあたり手探りでしていくしかありません。

 

しかし、LLVMはなかなか手ごわいです。僕はreadline, oniguruma, pcre, terminfo, curses辺りのシンプルなライブラリしか使ったことがありませんでしたが、LLVMのような大きなフレームワークを使うのは初めてで、なかなか慣れません。

自分でしかコードを書いていないとシンプルでアートのようなコードを書くことが出来ますが、フレームワークを使うときは泥臭いコードを躊躇なく使うことが求められると思います。後は書籍を読んだりググったりして概念を少しずつ学んでいくことですね。

なかなかに勉強になりました。

また、ぼちぼちやっていきます。完成したらmasterにマージしたいと思います。

まだだ、まだ終わらんよ

現在更なるJITの高速化を目指してコーディング中です。

コンパイル時にLLVMのbitcodeにClover2のバイトコードコンパイルしてしまおうという考え方です。

 

作業中のコードはgithubでブランチを作っています。bit-compilerがそのコードです。ただバグが出ていて正しく動きません。bitcodeを作ることは出来ましたが、正しくロードすることが出来ません。LLVMのバージョンの問題が怪しいので、明日以降LLVMをソースからビルドしてみます。

JITの高速化完成。

ついにJITが動きました。

--with-jit指定を付けるとJITが有効になります。まだ処理速度がどれくらい速くなったか試してませんが、とりあえず完成です。

あと--with-optimizeでセグメンテーション違反が出てましたが修正しています。

JIT付きの準現代風、コンパイラ仮想マシンです。ぜひ、試してください。準現代風と書いたのはすでに出ているSwiftやKotlinの方がかなり便利さで進んでいるためです。型推論やnull代入安全性など、オブジェクト指向の使い勝手がSwiftやKotlinの方がだいぶ上です。

これからはClover2をSwiftやKotlinの使い勝手に近づけてノラプログラマーとしての余生を過ごしたいと思います。

たまにパソコンのしすぎで怒られてましたが、僕を支えてくれた妻に感謝したいと思います。

それでは、enjoy programing!

JIT高速化の続き

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

 

とりあえず、b.clのテストは全部通ってます。後はmake testを全てJITで通せば、終わりです。

クロージャーのJIT化には苦労しました。バグにバグを重ねなんとか動くところまで辿り着きました。

一応b.clはmake testでも前回JIT化するときに通らなかったコードを選んでテストしているので、それが通ったってことはmake testのテストを通すのもそんなに苦労しないと思います。

でも、まだバグはあると思います。なんとか無事make testを通して完成させたいと思います。

すんなりいけば明日にはテストが通るかもしれません。そんなに甘くはない予感がしてますが、、、、。

今日は夜更かししてしまいました。夜更かしのコーディングは進捗が良いですが、次の日の進捗が悪いので、あまり良いことだとは思いません。皆さんもよく寝て、日中に進捗を出すことに集中してくださいね。それでは。

JIT高速化の続き

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

 

だいぶ大物バグを修正できました。一つのバグに2,3日はかかった気がします。かなりの数のバグが有りました。バグの修正にまたバグが有ったりして、かなり苦労しました。やっぱり調子が悪いときにはコーディングしないに限ります。バグが出て余計に時間が取られます。ぼちぼち調子がいいときに書いていくのが一番ですね。みなさんも、無理しないようにしてください。

何かどうでも良い話ですがお腹が減っているときに進捗がいいですね。デバッグに集中できます。

まあ、介護の仕事でもお腹が減っているときはよく動いて良い介護ができるので、お昼とかあまり食べないようにしています。

その割にはお腹は出てますが。

代わりに夜はたくさん食べます。

でも、若い頃はこんなことはなかったんですけどね。よく食べても動けました。歳のせいですかね。

 

まあ、とりあえず、8/31日でJITが動くようになったらversion 2.0としてリリースできるように頑張ります。

私事ですが、9/1に職場を変えるので、それまでにはリリースしたいですね。JITが完成したら、SwiftやらKotlinとか現代風の言語に改良していって余生を過ごしたいと思います。

型推論ですかね。ほしいのはあとはNullの代入の安全性とか、SwiftとKotlinを研究して、同じような機能を入れたいと思います。ただ残念ですがThreadは入れる予定はありません。Thread好きじゃないんですよ。入れるとデバッグに凄く時間が取られそうなので、そんな時間を過ごすくらいなら型推論とか入れたいと思います。

お楽しみに。

JITのデバッグ

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

 

だいぶデバッグも進んできました。今日やった分では概ね動く様子です。

基礎ライブラリを動かすにはいくつかバグがありそうですが、そんなに大物バグが無いような気がします。

とりあえず、命令個別のテストが全部終わったら基礎ライブラリをJITで動かしてみます。

たぶん、いくつかバグが見つかると思いますが、ぼちぼちやっていきます。

今月末には完成しているかもしれません。すんなり行けば。

夜にももう少しやってみます。では。