Rust で LLVM やってみる
Rust と LLVM やってみたくなってやってる. llvm-sys という LLVM の Rust バインディングのライブラリを使って LLVM 動かしてみた話と自分用メモ.
きつねさんでもわかるLLVMを読んでからやるかと思ったが,5章以降はちょっと自分には合わなかったのでブログ探して、それをやりながら参照程度に狐さんを見るという作戦でいった.
環境設定
何とかして Rust を入れる. これを真似すればだいたい行ける.
気付いたらRustの環境構築がかなり楽になってた | κeenのHappy Hacκing Blog
後は LLVM を入れてpathを通す.
brew install llvm export PATH="`brew --prefix llvm`/bin:$PATH"
やったこと
- LLVM IR の雰囲気を知りたかったので幾つかサンプル書いてみた.
playground/rust/llvm-example at master · ganmacs/playground · GitHub
llvm*.rsは上の方に動かしたい擬似コードを書いてある. codegen*.rs は AST ができてる体でそれを LLVM IR に変換するコードをかいた.
ほとんど Rust かいた経験がないため,色々おかしいところがありそう. マクロかけるようにするかってところで気持ちが終わり,LLVMバックエンドにリプレイスとかやってる.
参考になったブログとコード
llvm の公式のサイト.実際 LLVM IR 書いてる(実際に書いてるのはRustのラッパーだけど)と使い方がわからず,ググると大抵これしかヒットしないので一生懸命これを読む.
Rust で llvm-sys.rs を使って 数字を出すところから phi 関数(というのがある) を使って if 式を作ることまでやってる.
Go 言語用のバインディングもあるようでそれを使って,加算するところまでやってる.序盤の説明が分かりやすかった.
LLVM の外観をつかむのには良かった. ただ,読み進めてるといきなり Pass の話をしだすので,LLVM IR について知りたい場合は序盤だけ読んで,後半は後で読むと良さそう.
LLVM のチュートリアルを Rust でやってる. この作者が作った iron-llvm という llvm-sys.rs をラップしたライブラリを使って LLVM を触っているのでいきなりこれを見ること混乱するかもしれない. 最初はむしろ iron-llvm のコードを読んで llvm-sys.rs の使い方の雰囲気をつかむのが良い.
きつねさんでもわかる LLVM のサンプルコードのリポジトリ.割りと大きめのコードなので実際に真似しやすい. 構文の定義( https://github.com/Kmotiko/DummyCCompiler/blob/master/dummyC_ebnf.txt )を読めばどんな言語かわかるので本の方は読まなくてもだいたい分かると思う.