てがみ: qatacri at protonmail.com | 統計 | 2022

202212401

最近のプログラミング言語は通常のコードを (制限つきで) コンパイル時に実行できる、コンパイル時定数(式|関数|...)を言語仕様として持っているものが多くある。これはコンパイラのどの段階に実装されているんだろう。初期の C++ constexpr なんかは非常に限定的で、 AST の段階で簡単に処理できるし、たぶんそういう実装を想定した仕様になっている。 C++20 になると言語仕様のかなりの部分がコンパイル時実行できて、どう実装されることを想定しているのかよく分からない。なにかうまいトリックがあるんだろうか。

テンプレート引数にコンパイル時定数が使えることを考えると、コードを完全に中間表現に落とした後に処理することは不可能に思える。たとえ可能だったとして、定数畳み込み最適化がコンパイラ実装依存であるように、コンパイル時定数として評価可能な範囲が中間表現に依存してしまわないのか。謎。

c++ - How are constexpr functions implemented by compilers? - Stack Overflow

clang では現在 AST evaluator として実装されていて、バイトコードを出力するインタプリタも試験的に入っているらしい。本筋のコード生成とは独立に実装されているのか。ひぇー。

clang: lib/AST/ExprConstant.cpp Source File