Shiika進捗(2024)
このエントリは言語実装 - Qiita Advent Calendar 2024 - Qiitaの24日目の記事です。
Shiikaとは
Shiikaは私が作っている、Ruby風の文法をもつ静的型付け言語です。
昨年まででInteger/String/Arrayなどの基本的なところは実装したのですが、そのあとIO機能を実装するところで、これは先に並行性のサポートについてちゃんと考えておかないとなと気付き、今年はその作業をしていました。
(たとえば後から並行性のサポートを無理やり入れたため、Fileのreadとread_asyncが両方あって使い分けないといけない…みたいなことは避けたいなという話です。
並行性
いろいろ考えましたが、流行りのasync/awaitではなく、GoのようにIO等のタイミングで自動的に処理が切り替わるというのを考えています。ただGoのようなマルチスレッドではなく、Node.jsのようにシングルスレッド方式とすることで、より気軽に並行処理を書けるようにしたいと思っています。
この場合CPUヘビーな処理が書けなくなりますが(その間他のタスクも止まってしまうため)、もともと性能最重視の言語ではないので、ジョブキューのような形で複数プロセスを使って並列化するか、そういうところは別の言語で書く、ということになると思います。ただ可能なら一部の処理だけ切り出して単独のスレッドを割り当てるとかできるといいですね。
CPS変換
平行性の実装ですが、Shiikaの関数(メソッド)をCPS変換した形のLLVM IRを吐き、Rustのtokioの上で動かすというのを考えています。これを実験していたのが以下のリポジトリです。
https://github.com/yhara/milika
(この頃はついでにMLIRを使う実験もしていたのですが、最終的には、MLIRは使わないことに決めました。上記のようなレイヤーの処理をするにはあまり向かなそうとわかったからです。GPU上で動かす言語を作るとかならとても便利だと思います。)
実装にあたってはraviqqeさんのPen言語という先人の知恵に助けられました。ありがとうございます。
バックポート
ということでなんとなく動きそうというのがわかったので、その後は実験結果を本体にマージする作業を進めています。ifやwhileなど単純なものは既に動いていますが、メソッド呼び出し、型推論、クロージャあたりを統合する作業がけっこう面倒かもしれません。まあ来年もぼちぼちやっていきます。