定数評価
定数評価とは、コンパイル時に値を計算するプロセスです。特定のアイテム(定数/static/配列長)については、そのアイテムの MIR が借用検査され、最適化された後にこれが行われます。多くの場合、アイテムを定数評価しようとすると、その MIR の計算が初めてトリガーされます。
代表的な例は次のとおりです。
staticの初期化子- 配列長
- スタックまたはヒープ領域を確保するために既知である必要があります
- Enum バリアントの判別子
- 2 つのバリアントが同じ判別子を持つことを防ぐために既知である必要があります
- パターン
- 重複するパターンをチェックするために既知である必要があります
さらに定数評価は、複雑な操作をコンパイル時に事前計算し、その結果だけを格納することで、実行時のワークロードやバイナリサイズを削減するために使用できます。
定数評価のすべての用途は、「型システムに影響する」もの(配列長、Enum バリアントの判別子、const ジェネリックパラメーター)か、実行時に使用される式を事前計算するためだけに行われるもののいずれかに分類できます。
定数評価は、TyCtxt の const_eval_* 関数を呼び出すことで実行できます。これらは const_eval クエリのラッパーです。
const_eval_global_id_for_typeckは定数を valtree に評価するため、結果の値をコンパイラがさらに検査できます。const_eval_global_idは定数を、その最終的な値を含む「不透明な blob」に評価します。 これはコード生成バックエンドと CTFE 評価エンジン自体にのみ有用です。eval_static_initializerは static の初期値を具体的に計算します。 Static は特殊です。他のすべての関数は static を正しく表現しないため、 static に対して使用されることを防ぐアサーションがあります。
const_eval_* 関数は、定数が評価される環境(たとえば、その定数が使用される関数)の ParamEnv と GlobalId を使用します。GlobalId は、定数または static を参照する Instance、または関数の Instance とその関数の Promoted テーブルへのインデックスから構成されます。
定数評価は、型システムの定数については EvalToValTreeResult を、またはエラーもしくは評価済み定数の表現である valtree または MIR 定数値 のいずれかを持つ EvalToConstValueResult を、それぞれ返します。