Clover2開発日誌

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

2017-09-01から1ヶ月間の記事一覧

シェルモードの改良

シェルモードの改良をしています。make && make installなどシェルモードで&&と||が動きます。 あとはCommandクラスにまだバグがあったので修正。SIGPIPEのブロックをしていなかったため存在しないコマンド名を実行するとパイプのwriteでシステムが落ちてい…

シェルモードの改良

シェルモードの改良をしています。make && make installなどシェルモードで&&と||が動きます。 あとはCommandクラスにまだバグがあったので修正。SIGPIPEのブロックをしていなかったため存在しないコマンド名を実行するとパイプのwriteでシステムが落ちてい…

Commandクラスのバグを修正

ちょっとCommandクラスが不安定だったので修正しました。 そのためmbstowcsの仕様が少し変わってます。必ずnull-terminatedされます。引数の数も変わってます。 後はシェルモードでls -al | less, egrep ^p src/*.cなどが動くようになりました。内部的には単…

文字列への式の埋め込み

文字列への式の埋め込みを入れました。 > a := 123 123 > println("abc\{a.toString()}def"); abc123def のようになります。Rubyの#{}じゃなくてSwiftの\{}を使っています。いろいろ考えましたけどクォートができる方が良いなと思いまして。 正規表現、Path,…

cd, fg, jobsを入れました。

タイトルの通りです。 シェルっぽくなってきました。 後個人的な不満は make && make install && make test egrep str src/*.c ./configure --prefix=$HOME の3つが通らないところですね。 上記の3つはClover2の構文では実行することが出来ます。 make && ma…

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

上記のとおりです。概ねインタプリタの補完のバグは修正できました。ただ、ソースがあまりにも酷いのでバグがあるとは思います。(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ファイルをコンパイル時にダイナミックライブラリにコンパイルしてしまい、実行時にロードしてクラスのメソッドとして使えるように…