LLVM LLにコンパイルされるC風言語を作っています
2016-10-16
TechLLVMを利用した言語実装の練習として、C風文法の言語を作っています。kaleidoscopeのマンデルブローのサンプルが動くところまでを目標にしています。
実装はRuby + Raccです。.llの出力はruby-llvm gemを使おうかと思いましたが、更新が止まっているようなので、とりあえず文字列処理で頑張っています。
https://github.com/yhara/kareido
kaleidoscopeはLLVMオフィシャルの言語実装チュートリアルで(日本語訳)、Kareidoとは以下のような違いがあります。
- kaleidoscopeはREPLがあるが、Kareidoは1ファイルのコンパイルのみをサポートする
- kaleidoscopeには独自演算子の定義があるが、Kareidoでは演算子は組み込みのもののみ
- kaleidoscopeはパーサが手書きだが、Kareidoはパーサジェネレータ(Racc)を使っている
要するにサンプルなのだからできるだけ凝ったことをせず、普通にしようということです。
.llを文字列で出力することの是非
いまのところkareidoは.ll (LLVMの中間コードファイル) を文字列として出力し、実行はそれをlliコマンドなりに食わせるという形になっています。このためLLVMのバインディングがない言語にも、Kareidoを移植することは比較的容易だと思います。
一方でLLVMのIRBuilder APIを使わないことによるデメリットがどのようなものかはまだ分かっていません。最悪実装が頓挫するパターンまであると思っていますが、まあそのときはそのときで…。