Clover2開発日誌

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

version 3.1.4リリース

クラスの自動コンパイル機能を入れました。クラス名をファイル名に持つクラスは自動的にコンパイルされます。 例えば

> vim Hello.clcl
class Hello {
    def hello() {
       println("HELLO WORLD");
    }
}
> vim hello.cl
Hello.hello();
> clover2 hello.cl
HELLO WORLD

のような感じです。クラス名はファイル名と同じにしておくほうが自動的コンパイルされるので便利かもしません。あとコメントを日本語で書き始めました。そのほうがしっくりきました。Clover2は日本人向けに作っていきたいと思います。

version 3.1.2リリース


Darwinコンパイルとテストしました。一応動いている様子です。深くはチェックしません。その時クラスフィールドやクラスメソッドを呼び出すとき小文字で始まるクラスはクラスフィールドやクラスメソッドは呼べなくしました。ちょっと色々ありまして。OSXはファイル名で大文字と小文字を区別しないので、list.headなどがListというクラスのフィールドだと勘違いしてしまうバグと出くわしたので。まあ、普通クラス名は大文字から始まると思うので、このような変更を加えました。一応小文字から始まるクラスは定義はできます。小文字から始めるクラス名のクラスのクラスフィールドとクラスメソッドが呼び出せないだけです。

SystemクラスのnativeメソッドでNull pointerのチェックが甘くセグメンテーション違反してましたが、全部チェックするようになりました。と言ってもNull Pointer Exceptionが起こるようになっただけですけどね。ユーザーには何が起こったのか分かるだけでもまだマシですね。ああ、そうだ。他のnative methodのNull pointer Exceptionのチェックしてませんね、、、今からします。

version 3.1.1リリース

version 3.1.1 リリース 2017/11/14

ナルエイブルを入れました。

a:String = null;   # コンパイルエラー

b:String? = null;   # nullは代入できる。bは空だということでnullを代入している。
                    # ただし、bはnullが入っているかどうか注意してコーディングしないといけない

 

3.0.8リリース

スクリプトの自動コンパイル機能を入れました。clファイルはコンパイルせずに直接clover2で実行できます。

> vim HelloWorld.cl
println("HELLO WORLD");
> clover2 HelloWorld.cl
HELLO WORLD

拡張子の変更。 
普通のソースファイル cl --> cl
クラスのソースファイル clc --> clcl
普通のソースファイルのコンパイル結果 clo --> ocl
クラスファイル clcl --> oclcl

大きな変更です。すみません。お手数ですが手元のソースファイルの拡張子も変更してください。拡張子を変えたのは出力ファイルをrm *.o*などと一括で消せるようにするためです。そのような要望があったので。

3.0.7リリース

Anonymousクラスにisメソッドを作りました。以下のように使います。

a:Anonymous = "ABC";

if(a.is("Integer")) {
#aはInteger
}
elif(a.is("String")) {
#aはString
}

#aはanonymous

 

です。ちょっとプルリクエストがありましたが、マージすると謎のバグにエンバグしたので上書きしてpushしてます。またプルリクエストの修正分は自分で書いてみます。あと拡張子を変えてほしいとissueがあったので、変更があると思います。

一応考えているのは

クラスのソース -> clcl

ソース -> cl

クラスファイル -> oclcl

ソースのコンパイル結果 -> ocl

を考えてます。

出力をrm *.o*と出来て便利じゃないかという提案でした。

すみませんが、次のリリースで、そのように変更します。

あとプルリクエストでソースファイルがコンパイルせずに

そのまま実行できるようになっていたので、その変更も施します。

> vim hello.cl

println("HELLO WORLD");

> clover2 hello.cl

HELLO WORLD

みたいな感じですね。今からその作業をします。プルリクエストありがとうございました。

version 3.0.6 リリース 2017/11/12

メソッドブロック関連のメモリのバグを修正しています。稀にセグメンテーション違反が起きる致命的なバグなのでダウンロードをお願います。
JITでメソッドのreturn文の省略が可能になりました。
これで知っているバグは全部修正できました。3.0.6を安定版とします。

 

メモリのバグはrealloc関連でした。allocしたメモリのオフセットをローカル変数に保持していて、reallocが起こる関数を呼び出した後に、そのローカル変数のメモリがおかしくなるというものでした。reallocは稀にしか起こらないので発見しづらいってやつですね。このバグはもう3,4回経験しているので、慣れたもんです。reallocは色々と危険ですね。まあ、知ってれば、怖くはないですけどね、、、。

 

とりあえず、知っているバグは全部修正しました。3.0.6を安定版とします。Kotlinのis演算子は入れたいと思ってます。後はちまちまKotlinの機能を実装していきます。

version 3.0.5d リリースしました。

やっぱりこっちもリリース情報書いておきます。twitterとの連携が便利なので。

 

REPLでほとんど期待通りの補完が行われます。メソッドブロックの型推論も含めて。結構便利なので、使ってみてください。

 

でも、まだバグがあるかもしれません。readlineのプログラミングは難しく、確認もテストを作って確認と言うより動かしてみないと分からないので。ほとんどパターンは確認したつもりですが、自分ひとりではどうしようもありません。もし、バグを見つけたら、報告が貰えると嬉しいです。連絡先はtwitterの@ab25cq宛で。

 

後確認しているバグはJITした時にメソッドの戻り値でreturn文の省略が出来ないことです。JIT無しだと省略できるんですが、JITをつけると省略できません。近いうちに修正します。

 

とりあえず、REPLが期待通りに動いて嬉しいです。例えば

slist{1,2,3}.map { it.toString().toCommand() }.each { it.less() }

なんてコードでも補完が効いちゃいます。結構凄いでしょう。

まあ、当たり前といえば当たり前ですが。動いたときは「ちょっとすごいもの作っちゃったな」なんて思ったりしましたw

 

それでは。

enjoy programing!