Rustのコンパイルの流れメモ
参考:https://rustc-dev-guide.rust-lang.org/overview.html
他のコンパイラと大きく異なる部分
クエリシステム
借用チェッカー
Lexer
主にトークン化を行う
Parser
主にASTを作る
AST lowering
AST → HIR → MIR の順で抽象度を下げていく過程のこと
HIR
脱糖(糖衣構文を元に戻す)
型推論
型チェック
トレイト解決
THIR
Typed High-level Intermediate Representation
HIRからさらに脱糖された表現
MIR
多くの最適化が行われる
借用チェックはこの段階
LLVM-IR
LLVMコンパイラへの入力の標準形式
クエリシステム
https://rustc-dev-guide.rust-lang.org/queries/query-evaluation-model-in-detail.html
コンパイラの主要なステップはクエリシステムを使用している(全てではない)
例
型を要求するクエリ
関数の最適化されたMIRを要求するクエリ
増分コンパイルとの関係
クエリの結果はディスクにキャッシュされる
クエリの結果が変更されたかを確認して、同じだったらキャッシュを使用する