Clover2開発日誌

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

JIT高速化第3弾。

とりあえず、出力するアセンブラの型が厳密になりました。 コンパイルに関してはb.clcのテストも通ってます。 後基礎ライブラリも正しいアセンブラを出力している様子です。 この後はコンパイルされたアセンブラのコードを読み込む部分になります。LLVMに付…

LLVM高速化第3弾

始めています。githubではブランチを切ったので、前の高速化を行ったときのコードは普通にgit clone https://github.com/ab25cq/clover2.gitでダウンロードできます。 第3弾ではコンパイル時にビットコードにコンパイルしています。この間のバグではバージ…

まだだ、まだ終わらんよ

現在更なるJITの高速化を目指してコーディング中です。 コンパイル時にLLVMのbitcodeにClover2のバイトコードをコンパイルしてしまおうという考え方です。 作業中のコードはgithubでブランチを作っています。bit-compilerがそのコードです。ただバグが出てい…

JITの高速化完成。

ついにJITが動きました。 --with-jit指定を付けるとJITが有効になります。まだ処理速度がどれくらい速くなったか試してませんが、とりあえず完成です。 あと--with-optimizeでセグメンテーション違反が出てましたが修正しています。 JIT付きの準現代風、コン…

JIT高速化の続き

現在./configure --with-jitは動きません。 とりあえず、b.clのテストは全部通ってます。後はmake testを全てJITで通せば、終わりです。 クロージャーのJIT化には苦労しました。バグにバグを重ねなんとか動くところまで辿り着きました。 一応b.clはmake test…

JIT高速化の続き

現在./configure --with-jitは動きません。 だいぶ大物バグを修正できました。一つのバグに2,3日はかかった気がします。かなりの数のバグが有りました。バグの修正にまたバグが有ったりして、かなり苦労しました。やっぱり調子が悪いときにはコーディング…

JITのデバッグ

現在./configure --with-jitは動きません。 だいぶデバッグも進んできました。今日やった分では概ね動く様子です。 基礎ライブラリを動かすにはいくつかバグがありそうですが、そんなに大物バグが無いような気がします。 とりあえず、命令個別のテストが全部…

JITのデバッグ

現在./configure --with-jitは動きません。 デバッグもだいぶ進んできました。キャストは問題なく動いている様子です。 あとは基礎ライブラリをJITで動かしていきます。 すんなり行かないと思いますが、まあ、ぼちぼちやっていきます。 あと、2,3個大物バグ…

JITのデバッグの続き

現在./configure --with-jitは動きません。 手強い例外処理のバグを修正しました。ネストするtryはできなくなりましたが、とりあえずバグを修正できました。 tryのネストができないのは仕様にするかもしれません。 後は、キャスト関連で変数を全部64bitで扱…

JIT高速化の続き

色々とちゃんとした処理になおしています。 OP_LOAD, OP_LOAD_FIELD, OP_LOAD_CLASS_FIELDでは全部64bitで処理されてましたが、ちゃんと型を設定するようにしました。 キャストの処理もそのせいでバグが見つかって直しています。 後は手強い例外処理にまたバ…

JIT高速化の続き

現在./configure --with-jitは動きません。 とりあえず、全命令JIT化したのは良いですが、バグがあります。 現在基礎ライブラリを全てJITで動かすのを目標にデバッグしてます。 その次はmake testをJITで動かします。 それで完成ですね。 今日は例外のバグを…

JIT高速化の続き

現在./configure --with-jitは動きません。 とりあえず、キャスト命令のJIT化は全部終わったはずです。確認はしていませんが。一応全部の命令のJIT化は終わったと思います。 明日以降確認してみます。後はテストですね。デバッグがあります。 全ての基礎ライ…

JIT高速化の続き

現在./configure --with-jitは動きません。 とりあえず、キャスト命令もあとはラッパークラスからプリミティブ型へのキャストのみとなりました。 問題はテストが通るかどうかですが。 明日は夜勤なので、昼間にちょっとコーディングしようと思います。 速度…

JIT高速化の続き

現在./configure --with-jitは動きません。 ようやくキャスト命令の3/4くらいが終わりました。 キャスト命令さえ終われば、高速化も終わりです。 後はmake testなどテストをしてデバッグが上手く行けばversion 2.0としてリリースしたいと思います。 7月中に…

JIT高速化の続き。

現在./configure --with-jitは動きません。 キャスト命令のJIT化をしています。だいぶ進んでます。 FloatとDouble型への変換が終わりました。 後晩にももう少し進めたいと思います。

JIT高速化の続き

現在./configure --with-jitは有効ではありません。 キャスト命令のJIT化をはじめました。LLVM上では複数の命令が同じ命令として扱えるので、かなり早く終わりそうです。 来週中?現職を辞める前には終わるかもしれません。 来週は忙しいですが、コーディン…

JIT高速化の続き。

現在./configure --with-jitは動きません。 まだキャスト以外の命令が残ってました。今度こそ残りはキャスト命令のみとなります。 7月末までにはリリースできそうです。それで、本当にのらプログラマー引退すると思います。拡張ライブラリを書けるようにした…

JIT高速化の続き。

現在./connfigure --with-jitは動きません。 とりあえず、キャスト命令以外のJITの命令は終わりました。 結構多かったです。 後はぼちぼち膨大な数があるキャスト命令を終えていきます。 どれくらい速くなっているか、楽しみです。

LLVM高速化の続き

現在./confiugre --with-jitは動きません。 とりあえず、だいぶ進んでます。キャスト以外の命令はほとんど終わりですかね。後はアドレスを取る命令辺りかな。 OP_INVOKE_DYNAMIC_METHODも動いてます。 今回のJITはVMのスタックを使わずにLLVM用のスタックを…

JIT高速化の続き

OP_INVOKE_VIRTUAL_METHODを実装しました。インタフェースのメソッドの実行ができます。 先日後は膨大なキャスト命令だけだと書きましたが、大事なのを忘れてました。 あとはOP_INVOKE_DYNAMIC_METHODもまだなので、今日の晩辺り、それを書いておきます。 と…

JITの高速化の続き

とりあえず、演算子は全てサポートしたはずです。 ただテストがまだです。 前書いたものから基本的にはコピーアンドペーストしただけでしたので、量だけ多くて疲れました。 ポインタ関係の演算と浮動小数点の演算辺りにバグがありそうです。ポインタを使った…

JITの高速化の続き

フィールドのロードができるようになりました。 まだまだ道のりは長いです。 LLVMにもようやく慣れてきたところです。 結構使いやすいかもしれません。セグフォが出るとバグを探すのが難しいですが。エラーメッセージ出してくれればいいんですが 大体セグフ…

JITの高速化の続き

現在./configure --with-jitは動きません。 ローカル変数が定数として扱われていたため最適化がかかりfor文などが動かなかったバグがありましたが、修正しています。 ローカル変数はマシーンスタックに確保するようにしました。 LLVMって最適化が凄くて出力…

JITの高速化の続き

現在./configure の--with-jitは有効じゃありません。 とりあえず、今回の収穫はLLVMでのグローバル変数のアクセスの仕方がわかったことと、構造体のフィールドのアクセスの仕方がわかったことです。 高速化は順調です。だいぶ速くなると思います。6月末ま…

JITのルーチンの書き直し中

現在JITは有効ではありません。--with-jitは./configureに付けないでください。 LLVM用のスタックを用意してLLVMの最適化がかかるように改造中です。今のところ、メソッドコールと一部の演算子、throwなどは動いてます。 一度書いたルーチンを流用してでの書…

LLVMのルーチンを書き直してます

高速化のためにLLVMのJITのルーチンを書き直しています。 完全にフルスクラッチからではありませんが、スタックの値をVMのスタックではなくLLVMのスタックを用意して、そこの値を使っています。1+1など単純な計算は最適化されて2とされるでしょう。 今のまま…

まだだ、まだ終わらんよ。

やっぱり、放っておけなくて速度アップのための処理を書いています。 これで速くならなかったら、本当に諦めます。 処理の結果を毎回VMのスタックに書き込むのをやめて、LLVM用のスタックを用意して、そこに書き込むようにしています。 VMのスタックの値が必…

version 1.5リリース

JITが完成しています。メソッド名にjit指定はいりません。内部的に何回か呼ばれたメソッドはJITされます。 ただし、速度の向上は微妙に速くなった程度です。あまり期待しないでください。 さて、やけ酒飲んで。明日からまた仕事に備えるか。 まあ、僕の冒険…

JITいらないです。

--with-optimizeの方が重要です。--with-debugだと17秒かかる処理が--with-optimizeで3秒程度になります。この処理の場合、とりあえず、JITしても速度は変わりません。ループ以外のところだと逆に実行時のコンパイルに時間がかかり遅くなります。 ループで非…

JITのデバッグが終了しました。

JITのデバッグが終了しました。バグは多分無いと思います。 デバッグに2週間、作成に2ヶ月半くらいなので、3ヶ月でLLVMでのJITが成功しました。思ったよりは時間がかからなかったですね。 LLVMに関してはまだまだ発展中なので、なかなか使いこなすのが難…

まだJITにバグがあります

まだまだです。6月末までにはなんとかしたいと思います。

バグフィックスは続く

メソッドコールとif文のバグを直しました。 String.equalsはとりあえず、JIT化出来て動いています。 徐々に基礎ライブラリをJIT化して、ついでにバグフィックスしていきたいと思います。

まだまだJITにバグが見つかってます

とりあえず、基礎ライブラリをJIT化していってバグをなくしたいと 思います。 すごくたくさん、バグが出てます。メソッドをjit指定するたびに バグが出る感じです。 申し訳ないですが、JIT無しでとりあえず、使ってみてください。

JITのバグを修正。

if文とかfor文とかをネストすると落ちるバグを修正。 まだJITにはバグがあると思いますので、ぼちぼちデバッグしていきます。 しばらくはバグが有ることを許してください。 申し訳ないです。JITなしだと、とりあえず安定しているので JIT無しで使っていただ…

LLVMによるJITが完成しました。

ついにやりました。全VMの命令をJIT化しています。 処理速度はまだ測ってませんが、だいぶ速くなると思います。 良かったら、試してください。 今日は奥さんの料理で打ち上げします。楽しみです。 贅沢に本物のビール2本飲もうかな。明太子も出してもらおう…

いよいよJIT化のフィナーレです

LLVMによるJIT化があと少しで終わります。 膨大なキャスト命令をだいぶJIT化しました。 ほとんどvimのコピペとマクロで作ってます。うーむ、vimは便利。 後はアセンブラでキャストする部分だけですね。 終わったら、家族に言って、打ち上げしてもらいます。 …

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

お題のとおりです。ちょっと疲れました。 キャスト命令の全体の1/2くらい進めた感じです。 後はのんびり進めます。 問題は速度が出るかですねぇ。演算子以外アセンブラで書かずに C関数を呼んでいるだけの部分が多いので速くなるか謎です。 後家のサーバーは…

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

テストはいまいちやってませんが、一応動いています。 キャスト以外の命令のJIT化に成功してます。 後はキャスト命令のJIT化していきます。 まあ、凄い分量があるので、ぼちぼちですね。 やはり予定通りLLVMによるJITの完成は6月下旬になりそうです。 今日は…

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

お題のとおりです。明日以降キャスト以外の命令をJIT化してから、大量にあるキャスト命令のJIT化をしたいと思います。 山場だと思っていたOP_INVOKE_VIRTUAL_METHOD, OP_INVOKE_DYNAMIC_METHODなどはCの関数を呼ぶだけで簡単に実装できました。ブロックの呼…

全演算子をJIT化

タイトル通り全演算子をJIT化できました。 ちょっとテストが足りていないので、バグがあるかもしれませんが、多分、大丈夫だと思います。 あとは山ほどあるキャストをJIT化していきます。 見るだけでゲンナリするほど量がありますが、少しずつ進めたいと思い…

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

今回の収穫はキャストの仕方がわかったことですね。 とりあえず、僕のVMにはキャストが山ほどあるので、それが山場だと思っていたので、それがなんとかなりそうだと分かり、ほっとしてます。 あとは道なりに全部の命令をJIT化していきます。 問題は速くなる…

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

JITで補数の単項演算子を追加しました。 だいたい全体の1/2くらいの進捗ですかね。 ぼちぼち残りの1/2やっていきます。 重要な命令はほとんどできているので、後はキャストやfloat, doubleの演算子辺りが山場ですかね。 大体来月末にはJIT付きのVMでversion …

LLVM化は続く

とりあえず、byte,ubyte,short,ushort,int,uint,long,ulongの2項演算子は出来ました。全体の1/4か1/3くらいの進捗だと思います。 早ければ今月末か来月末には終えられると思います。 その後は拡張ライブラリを書くためにSystemクラスにLoadLibrary?でした…

LLVM化進んでます

VMの命令を上から順番にLLVMに移植しています。 intからbyteへのキャストなどアラインメントが小さくなるキャストは意味がないとやっと気づいたので消去しました。 少し速くなったかもしれません。コンピュータに対する無知が知れてしまい恥ずかしい思いです…

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

TRY文に対応しました。とりあえず、制御構文は対応できました。 あとは順次VMにある命令の上から一つづつLLVMに対応してます。 夏の終わり頃には終わるのではと言ってましたが、もしかしたら、春の終わりにはLLVMでのJITに対応できるかもしれません。 LLVM化…

JITで制御構文全部に対応

とりあえず、tryも動いています。tryがネスト出来ない問題は放置してますが。for, while, ifは多分大丈夫です。まだテストが足りない気がしますが。 まあ、ぼちぼちデバッグやらテストやら、やっていきます。 とりあえずは対応できたということで。 次は演算…

JITでfor文のテストが動きました

とりあえず、for文だけテストしました。最初動かなかったのですが、修正しました。tryとかもかなり動かないっぽいですけど、明日以降修正します。while文とif文は多分大丈夫だと思います。

JITでtry文、for文、while文など制御構文に対応

とりあえずは書きました。テストやデバッグはまだです。try文は動くか自信がありません。if文は動いているっぽいですがelifなどは動いているか謎です。明日以降テストとデバッグをする予定です。すんなり動けば良いのですが。ただ、try文はかなりいい加減な…

JITでif文やwhile文に対応

とりあえずは動いてます。まだテストは不十分です。一応githubにはアップロードしておきました。break文とtry文がまだです。 それが終われば、一応制御構文はできあがります。 まあ、まだまだ道のりは長いです。ただ、一年間の時間をかけるつもりでしたが、…

Clover2の開発日記開始

はじめまして。Clover2という、コンピュータ言語を作っている湊(みなと)と申します。この度、はてなブログに開発日記を書こうと思ってます。いつまで続くか、分かりませんが、頑張って書いていこうと思います。 Clover2は以下のURLにあります。 github.com …