Shiika進捗(2018)
この記事は言語実装 Advent Calendar 2018 - Qiitaの3日目の記事です。
Shiikaはyharaが開発しているプログラミング言語です。
class Pair<S, T>
def initialize(@a: S, @b: T)
end
def fst -> S; @a; end
def snd -> T; @b; end
end
Pair<Int, Bool>.new(1, true).fst
Ruby風の構文ですが静的型で、今のところ「Ruby文法のJava」に近いですが、徐々に機能を足してScala/Swift/Kotlinあたりの感じに寄せていく予定です。特に野心的な言語機能とかはなくて、自分が使いたいものを作るという方針です。
処理系は今はRuby製のインタプリタですがいずれはRustかGoあたりを使ってllvm irへのコンパイラにしたいと思っています。
静的型付けのRubyというとCrystal言語が思い当たりますが、Crystalがなるべく明示的な型を書かせない方針なのに対し、Shiikaはメソッドの引数くらいは型が書いてあったほうが読むときに楽だよねという立場なのが相違点です。
2018年の進捗
今年の進捗ですが(こういう時CHANGELOG書いてると便利)、6月しかまともに作業してないことがわかります。一般に作業をしないと進捗が出ないことが知られています。
内容としてはジェネリクスを入れたというのが大きいです。というのはRubyっぽいものを作るにはArrayクラスやHashクラスが必要ですが、どちらも型パラメータを取るのでジェネリクス(か何か)が必要になるためです。
ところでRubyの世界観を受け継ぐ場合は、「クラスもオブジェクトである」ということになるので、A<String>
はクラスなのかとかを真面目に考える必要があって大変です。Shiikaではいまのところクラスである(SkSpecializedClass)ということになっています。
でその後は可変長引数を実装しました。これは配列リテラルを実装したい→配列リテラルはArray.newの呼び出しである→Array.newは可変個の引数をとる、という流れによります。yak shavingですね。
あとはsubtyping関係(継承)の実装を途中までやりました。これもCHANGELOGを見るだけでどこまでやったのか分かるのでやはりCHANGELOG便利。
来年の抱負
モダンっぽい機能としてOption型を入れたいと思っていますが、まず型システム上どう表現するかという話があり(これについてはSwiftのenumみたいのを入れるという方向が有力)、次いでその場合の構文をどうするかという問題があります。構文についてはshiika-memoというリポジトリの方に落書き帳的なものがあります。
来年もやっていきましょう。