Clover2開発日誌

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

LLVMのリファクタリング

LLVMのリファクタリングを行ってます。 しばらく時間がかかります。 developリポジトリで開発しています。 シンプルなソースにしたいと思います。 具体的にはLVALUEに格納している値の種類を追加しています。 そうするとだいぶソースが整理されるので。 今ま…

バグ修正中です。

JITでlist { 1, 2, 3 }.toString().println()が動きません。只今修正中です。 少しの間JITをリファクタリングします。もう少し読みやすく整理しますね。リポジトリはdevelopで作業しています。 あとデバッグ時にスタックの値が表示できないのをなんとかした…

言語仕様の変更点

ブロックが block { a := 123 } などから { a := 123 } に変更されています。ブロックは戻り値を返すようになりました。最後に実行された式の値がブロックの戻り値です。a := { 123 }; System.assert(a == 123)は真です。ブロックの表記が変わったので配列の…

if文が戻り値を返すようになってます。

if文が戻り値を返すようになってます。JIT対応。 > a := if(true) { 1 } else { 2 } > a 1 となります。JITでも対応しています。 もちろん、インタプリタでは > if(true) { "ABC" } else { "DEF" }.[TAB] でString型のメソッド補完も行います。 次はブロック…

Kotlinショック

Kotlinのドキュメント読んでいます。素晴らしいです。表記がホント凄いですね、、、、。Swiftは出力するコードは速いと思いますが、ちょっと表記がイマイチですね。後発の割には。 Kotlinの表記を見習って幾つかClover2に改良を加えたいと思います。 Clover2…

クラス名の補完

new, :の後にクラス名の補完をするようになりました。Generics対応です。 だいぶJavaのIDEに近づいてます。 ちょっと外部コマンド名の補完がどこでも出来てしまうので、補完するときに邪魔になりますね。うーむ。ちょっと対策を考えます。 Clover2は実際その…

クラス名の補完

:のあとにクラス名の補完をするように修正しました。 あと昨日のgithubのリポジトリへのプッシュでシェルモードで補完がエンバグしてました。修正しています。 あとはnew の後のクラス名の補完を入れたいのですが、まだ途中です。まあ、ぼちぼちやっていきま…

ローカル変数名の補完、シェルモードのバグを修正

ローカル変数名の補完を入れました。 ほとんどJavaのIDEのような使い心地になってます。 たぶん。大体の場所で補完は効きます。 ただ、変数のクラス名の補完などはまだ入れてません。 > a:Inte[TAB] > a:Integer なんていうやつは入ってません。それをまた入…

ブロック内でメソッド名の補完ができるようになりました。

ブロック内でメソッド名の補完ができるようになりました。 とりあえず、補完はほぼ完成しています。 後はローカル変数名の補完ですかね。足りないのは。それを明日以降追加したいと思います。大体は補完が効くのでJavaのIDEにだいぶ近づいた感じです。 しば…

カレントプログラムの実行をシェルモードに追加。String.clcの見直し。

カレントプログラムの実行をシェルモードに追加しました。 > ./configure --prefix=$HOME --with-optmize などがシェルモードで動きます。これで一応僕が普段実行するコマンドは全部動くようになりました。現在はClover2をiclover2上で開発しています。 iclo…

splitのバグを修正。シェルモードで引数のグロブのバグを修正。シェルモードに環境変数の展開を追加

splitのバグを修正。シェルモードで引数のグロブのバグを修正。シェルモードに環境変数の展開を追加 とりあえず、シェルモードの使い勝手を上げています。自己満ですが、インタラクティブに基礎ライブラリのバグのチェックもできますし、やっぱり自分でも使…

シェルモードの改良

シェルモードの改良をしています。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に…