Clover2開発日誌

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

LLVMのリファクタリング

LLVMリファクタリングを行ってます。

しばらく時間がかかります。

developリポジトリで開発しています。

シンプルなソースにしたいと思います。

具体的にはLVALUEに格納している値の種類を追加しています。

そうするとだいぶソースが整理されるので。

今まで、かなりいい加減に処理していました。

それによってLLVMのスタックの値を表示してデバッグすることができるので、後々いいと判断したためです。

developリポジトリの方が安定したら、masterにmergeしたいと思います。

バグ修正中です。

JITでlist { 1, 2, 3 }.toString().println()が動きません。只今修正中です。

少しの間JITリファクタリングします。もう少し読みやすく整理しますね。リポジトリはdevelopで作業しています。

あとデバッグ時にスタックの値が表示できないのをなんとかしたいです。デバッグのしようがありません。

 

その後はKotlinの様に型推論の強化や簡略化された表記ができるように改良していきたいです。Kotlinには衝撃を受けてます。あれこそモダンな言語じゃないでしょうか、、、、。

 

それではenjoy programing!

言語仕様の変更点

ブロックが block { a := 123 } などから { a := 123 } に変更されています。ブロックは戻り値を返すようになりました。最後に実行された式の値がブロックの戻り値です。a := { 123 }; System.assert(a == 123)は真です。
ブロックの表記が変わったので配列の表記が変わってます。 { 1, 2, 3 }から[ 1, 2, 3 ]となっています。リストなどはlist { 1, 2, 3 }から変わっていません。
if文が戻り値を返すようになりました。a := if(true) { 123}; System.assert( a == 123 )は真です。
変更申し訳ないです。Kotlinが気に入ってましてClover2をKotlinの言語仕様に近づけるため、これからもしばらく言語仕様の変更があると思います。Kotlinのような表記ができるようになったら、version 5.0としてリリースして言語仕様を固定したいと思います。申し訳ないです。

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

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

 

> a := if(true) { 1 } else { 2 }

> a

1

となります。JITでも対応しています。

もちろん、インタプリタでは

> if(true) { "ABC" } else { "DEF" }.[TAB]

でString型のメソッド補完も行います。

 

次はブロックでの引数の省略を入れたいと思います。itってやつですね。ブロックの引数が複数あったら、it, it2, it3とかできれば良いなと思います。ただ、Clover2はブロックの引数の型が決まっていないとメソッド探索ができないかもしれないので、ちょっとむずかしいかもしれません。もちろん探せるように修正はできるので、なんとか、Kotlinのようにブロックの引数が省略できるようにしたいです。

 

それとreturn文が省略できるようにすればかなり、メソッドチェインでKotlinのような記述ができるようになると思います。

型推論辺りも強化しないとList.mapはKotlinのようにはならないと思いますが。

まあ、ぼちぼちKotlinのような簡略化した記述ができるように修正していきたいと思います。

 

しかし、今日は夜更かししてしまいました。

明日仕事中、眠いと思います。がくり。仕事に支障が無いようにぼちぼちコーディングしたいと思います。バグが出るとついムキになっちゃいますね。

反省。

明日は早く寝ると思います。

おやすみなさい。

 

それでは。

Kotlinショック

Kotlinのドキュメント読んでいます。素晴らしいです。表記がホント凄いですね、、、、。Swiftは出力するコードは速いと思いますが、ちょっと表記がイマイチですね。後発の割には。

Kotlinの表記を見習って幾つかClover2に改良を加えたいと思います。

 

Clover2ではlist { 1, 2, 3 }がリストのオブジェクト値の表現ですがKotlinではListOf(1,2,3)となっているのは本当に賢いなと思いました。そうか、newキーワードがなかったら、クラスを関数の様に呼んでしまえば、初期化できるんだ。と目から鱗が取れました。listという予約語も必要ないですし、素晴らしいですね、、、、。可変長引数さえClover2に入れればListOf(1,2,3)で実現できますね。本当にKotlinには参りました。

幾つか、Kotlinから表記をClover2に入れたいと思います。

if文が値を返すようにした方が良いですかね。あと関数やメソッドの最後の値がreturnされる。lambda式の第一引数の省略のitとか。

後は型推論が強力ですね。Kotlinは。目指せ、Kotlin!でいきたいと思います。

後方互換性はこの際あまり気にしないようにします。

既にユーザーの方には申し訳ないですが、、、変更点はwikiに書いていきます。

ごめんなさい。

インタプリタの方は大体出来上がっているので、次は言語機能の拡張の作業に移ります。

クラス名の補完

new, :の後にクラス名の補完をするようになりました。Generics対応です。

だいぶJavaIDEに近づいてます。

ちょっと外部コマンド名の補完がどこでも出来てしまうので、補完するときに邪魔になりますね。うーむ。ちょっと対策を考えます。

Clover2は実際そのようなコードが動いてしまうので、仕方が無いですが。どうしましょう、、、。

 

しかし、相変わらずmasterリポジトリで作業していて申し訳ないです。ブランチ切るのがめんどくさくて。特にスクリプトコンパイラの方には影響がないと思われるので、勘弁してください。すみません。

 

しばらくインタプリタの補完に注力します。

クラス名の補完

:のあとにクラス名の補完をするように修正しました。

 

あと昨日のgithubリポジトリへのプッシュでシェルモードで補完がエンバグしてました。修正しています。

 

あとはnew の後のクラス名の補完を入れたいのですが、まだ途中です。まあ、ぼちぼちやっていきます。

 

developのブランチを作って、そこで作業するべきなんですが、masterで作業しています。申し訳ないです。

 

今日はちょっともう寝ないとヤバイので寝ます。

しばらく朝が早いので。

まあ、ぼちぼち色んな場面で補完が効くように修正していきます。

補完のソースは、かなり乱雑なソース・ファイルになっています。なんか前もreadlineに対するソースファイルは酷かったので、補完というものはこういうものだと割り切って書いています。あまり読まないでください。

 

それでは enjoy programing!