Korielのパーサを書いた話
自作の関数プログラミング言語Malgoの処理系では、**Koriel**と名付けた中間言語を使っている。
C言語、あるいはC言語の呼出規約で書かれた関数の呼び出し をもつ、A正規形に近いラムダ計算の拡張となっている。現状、KorielはLLVM IRへのバックエンドを持っている。 Korielのフロントエンドとして新たな言語を開発する、あるいはKorielの新たなバックエンドを開発するため、Korielにテキスト表現を与えた。
元々S式としてプリティプリンタを実装していた。それをパースできるようなパーサを実装した。 S式のプリティプリンタ/パーサはどんな言語でも(比較的)簡単に書ける。
様々な言語で簡単にKorielのフロントエンド/バックエンドを実装できるといいなぁ、と思いながら設計した。
Rustを使いたいなぁ、と思っている。
code:koriel.example.lisp
(let
(($let_10_1a (sum (Tuple#))
(pack (sum (Tuple#)) (Tuple#))))
(= $cast_12_1b (cast Any# $let_10_1a)
(= $d_13_1c (call $gblcls_getContents_d $cast_12_1b)
(= $d_14_1d (cast Any# $d_13_1c)
(= $d_15_1e (call $gblcls_putStr_a $d_14_1d)
(cast (sum (Tuple#)) $d_15_1e)))))))
今後の展望
クロージャやカリー化された関数をいかに効率よく扱うかが関数プログラミング言語コンパイラの肝の一つ。現状のKorielバックエンドはかなり素朴なので改善していきたい。
cast命令が多い。LLVMではbitcastを減らすような改良(opaque pointer)が入った。Korielも同じような戦略を取るといいかも?
変数に型を紐付けず、各命令で各引数の型を記述するような設計になりそう。
GCとかも色々やりたい(曖昧)
コンパイラの実装そのものを楽にする仕組み?に興味があって考え中