Clover2開発日誌

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

インタプリタの補完のバグを修正

上記のとおりです。概ねインタプリタの補完のバグは修正できました。ただ、ソースがあまりにも酷いのでバグがあるとは思います。(src/interpreter.c) 後、ブロックの引数に対する補完ができません。これはバグというより放置している問題ですが。 やっぱりpa…

クロージャーのバグ修正

クロージャーで親の変数が間違った値に変更されるバグを修正しました。make testで検出できてませんでした。一応テストを追加しておきました。 これで、めぼしいバグは大体修正できました。 僕が見つけているバグはもう無いです。 Clover2の開発にiclover2を…

1行でのシェル風の記述に補完を入れました。

上記の通りです。 > ls -al src/m[TAB] > ls -al src/main.c みたいな感じです。まんまシェルですね。 個人的にもユーザーインターフェースとして使い始めてます。シェルの代りに使えるようなREPLを目指してます。 注意してほしいのは一行での記述の場合のみ…

シェルのような記述

Commandクラスのメソッドが一つだけの場合シェルのような記述を許すようにしました。 > ls -al src/main.c -rw-rw-r--. 1 ab25cq ab25cq 1098 9月 18 08:01 src/main.c > vim src/main.c などです。まだiclover2でのファイル名の補完は出来ませんが明日以降…

メソッドの引数になるブロックオブジェクトの糖衣構文を入れました。

3.times() { println("HO!"); } sum := 0; list { 1,2,3 }.each() { |n:Integer| sum += n } などを入れました。

型推論

ブロックオブジェクトで戻り値の型を省略した場合、returnされる値によって型推論されるようになりました。ただ、Clover2の場合boxingやunboxing、プリミティブ型やユーザークラスなどがあるので、それほど便利ではありません。例えばList.mapメソッドのブロ…

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

メインスクリプトやメソッドの中などで、def fun(a:int): int { return a * 2 } などと書くと関数が定義できます。 内部的には単にブロックオブジェクトをローカル変数funに代入しただけのものです。特に関数オブジェクトってわけじゃないです。単なるlambda…

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

dlopen, dlsym, dlcloseなどダイナミックライブラリ関連のシステムコールを用意しました。クラスのinitialize():staticで、これらとnative methodの登録用のメソッドを使うと拡張ライブラリが作れます。 詳しくはwikiに書きますので見てください。もしくはco…

対話的なプログラムの実行で複数行対応

> 1+1; 2*3 2 6 などと期待通りに動くようになりました。(今までは1行のみしか対応していなかった)

JITでインタプリタ

./configure --with-jit --with-interpreterでバグがあったので修正しました。 インタプリタでもJITできます。すみません。バグに気づきませんでした。

JITで3倍速を実現しました。version 3.0.0リリース

ついにやりました。JITで高速化が成功しました。 JIT無しで3秒かかっていた処理がJITによって1秒になっています。 やりました。 高速化の秘密はコンパイル時にClover2のバイトコードをLLVMによってネイティブコードにコンパイルしている点です。ネイティブコ…

Clover2のソースファイルコンパイル時にbcファイルの出力と実行時にbcファイルの実行が可能になりました。

Clover2のソースファイルコンパイル時にbcファイルの出力と実行時にbcファイルの実行が可能になりました。32bitでも動きます。 とりあえず、bit-compilerブランチにpushしています。masterへのマージはもう少し待ってください。bcファイルをコンパイル時にア…

JITのソースファイルの分割

現在bit-compilerブランチで開発しています。 JITのソースファイルが大きすぎてあまりにもコンパイル速度が遅いため、分割しました。かなりいい加減な分割の仕方で綺麗なソースとは言い難いですが、とりあえず、分割はできました。 LLVMの32bit対応ですが、…

bit-compilerブランチの方では32bit CPUにVMは対応しました。

現在はbit-compilerブランチで開発しています。 いくらかmasterの方のバグも見つかっており修正しているので、早くmasterの方にマージしたいんですが、まだまだ先になりそうです。 bit-compilerブランチではVMが32bitに対応しています。後はJITの方を32bitに…

32bit対応

現在は32bitのCPUでコンパイルが通るようにコーディングしています。 とりあえず、LLVMは一休みしています。 LLVMの目標はbcファイルをコンパイル時にダイナミックライブラリにコンパイルしてしまい、実行時にロードしてクラスのメソッドとして使えるように…

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型への変換が終わりました。 後晩にももう少し進めたいと思います。