8

コンパイル時関数評価 (CTFE) はどのように機能しますか? コンパイラが実行中に、存在しないもの (関数など) を作成して実行する方法を理解しようとしています。私は、コンパイルによってソース コードがバイナリ ファイルになり、そのバイナリが実行されるという考えに慣れています。では、コンパイラの実行中にソース コードが実行可能になり、実行できるようになるにはどうすればよいでしょうか。関数は本当に作成されて実行されるのでしょうか、それとも関数呼び出しの単なるエミュレーションですか?

4

2 に答える 2

11

CTFE は、コンパイラに組み込まれているインタープリターを使用します。これは、Python などのインタープリター言語に期待されるものとよく似ています。このようなものをコンパイルすると:

bool not(bool arg) {
    return !arg;
}
void main() {
    enum compileTime = not(true); // not() called at compile time
    bool runTime = not(true);     // not() called at runtime
}

コンパイラは、トークン化/字句解析/解析などの通常の段階を経ます。enum compileTime (またはコンパイル時の値を必要とするその他の構造) に遭遇すると、式の右側にあるものを評価しようとします。定数の場合、期待どおりのことを行い、定数を格納します。関数呼び出しが発生すると、CTFE インタープリターが開始されます。与えられた例では、引数が何であるか、関数内のステートメントが何をするかを知っており、段階的に進み、それぞれを解釈します。コンパイル時にステートメントを解釈できない場合、コンパイル時エラーが発生します。この単純な例では、パラメーターを否定するだけですが、CTFE は構造体、クラス、ループなどを解釈できます。.

于 2012-04-22T14:53:05.853 に答える
1

これは基本的に、コンパイラが使用される値を計算しようとする高度な形式の定数折りたたみであるため、実行時に発生する必要はありません (コンパイル時に発生できない操作 (IO、メモリ割り当てなど) によって失敗する可能性があります)。 )

enumCTFE は、(たとえば、に割り当てることによって) 明示的にすることができ、ユーザー定義関数を評価しようとするという点で特別です。

実際には、これはコンパイラーのインタープリター・ビルドによって行うことができます

于 2012-04-23T17:35:48.157 に答える