Shiika進捗2020
このエントリは言語実装 Advent Calendar 2020の4日目のエントリです。昨日はmitsuchiさんのLLVM の Kaleidoscope を育てながら作るでした。
言語実装アドカレ、今年は全日埋まってるんですねえ。処理系Slackのおかげでしょうか?すごいなあ。
Shiikaは私が作っている、Ruby風の文法を持った静的型付けプログラミング言語です。Rubyのような手触りを保ちつつ、型をベースにしたプログラミングを楽しめる言語を目指しています。数年前から開発していて、昨年夏からはRust + LLVMによる処理系実装を始めました。
本記事では今年の主な成果を振り返ってみようと思います。
サンプルの追加
サンプルプログラムとしてマンデルブロー集合の描画、レイトレーシングを追加しました。いずれも、出力がおもしろいわりに比較的少ない言語仕様のみで記述することができ、処理系実装のサンプルとして楽しいものです。
ジェネリクス
基礎的なジェネリクスを実装し、これによってArrayクラスと配列リテラルが使えるようになりました。Hashクラスも欲しいのですけど、そこまで手が回ってません。誰か実装してくれー。
と言うだけでは何なので、shiikaの組み込みクラスの実装がどうなっているかを説明しましょう。Arrayクラスの場合はbuiltin/array.skに実装があります。builtin以下にはshiikaレベルで書かれた組み込みクラスが置いてあります。実装的には今のところ、shiika run a.sk
のようにプログラムを実行する場合、a.skの先頭にbuiltin/*.skをくっつけるという力技になっています。
shiikaレベルで書けない処理はsrc/corelib/*.rsで実装します。例えばgc_mallocメソッドはこうなっています。
無名関数
無名関数を実装しました。記法は fn(x: Int){ x + 1 }
とかですが、主な用途はこれではなく、Rubyでいうブロックを実現するのに使います。例えば def foo(f: Fn<Int, Int>)
というシグネチャのメソッドがあったとき、foo(fn(x: Int){ ... })
のシンタックスシュガーとしてfoo do |x: Int| ... end
と書けるようになっています。Swiftが確かこんな感じでしたよね。
理想的には|x: Int|
は単に|x|
と書きたいですよね。fooのシグネチャから推論できるはずなので、そのうちやりたいです。
仮想関数
仮想関数を実装しました。「仮想関数」という概念はRubyにはなくC++とかで使われる用語ですが、インタプリタでなくコンパイラを作る場合には気にする必要が出てきます。
例えばx.inspect
というメソッド呼び出しはxがIntならInt#inspect
、StringならString#inspect
メソッドの呼び出しになってほしいですよね。しかしコンパイラ方式の処理系でこれを実現するのは多少面倒です。というのは、xが何のオブジェクトか実行時まで決まらないケースがあるからです(例:Array<Object>
に数値や文字列が入っていて、一個ずつ順番にinspectしていくケース)。
これを効率よく実装する方法としてvtableという方式が知られています。vtableは「○○メソッドを呼び出したときはこの関数を実行する」というのを並べた配列で、例えばinspectメソッドならvtableの3番目、みたいに決まっています。各オブジェクトにこのvtableへの参照を持たせることで、inspectメソッドの呼び出しは「オブジェクトのvtableの3番目の関数を実行する」という処理で実現できます。
例としてIntのvtableは今こんな感じになっています。まだInt#inspect
を実装していないので、親クラスのメソッドObject#inspect
が使われることがわかりますね。
@vtable_Int = internal constant [32 x i8*] [i8* bitcast (void (%Object*, %Int*)* @"Object#exit" to i8*), i8* bitcast (void (%Object*)* @"Object#initialize" to i8*), i8* bitcast (%String* (%Object*)* @"Object#inspect" to i8*), (後略)
発表した
自作プログラミング言語の集い - connpassというイベントで発表させてもらいました(スライド)。また、依頼があってネットメディアに寄稿したりもしました。
Redditに載ったりもしましたね。まだ何も宣伝してない時だったのにどこから見つけたのか。そういえばgithubのexplore欄からたどってプルリクくれた人もいましたね。ありがたいことです。
おわりに
本稿ではShiikaの今年の進捗を振り返ってみました。今後やりたいことですが、12月ということでAdvent of codeをShiikaでやってみたいですねえ。まだ全然標準ライブラリが揃ってないので途中で詰まりそうですが、来年は全クリできるようになってるといいですね。
Shiikaの開発の様子はプログラミング言語処理系が好きな人の集まりというSlackワークスペースの#shiika
チャンネルで見ることができます。興味があればぜひ参加してみてください。