1. ホーム
  2. c++

[解決済み] C++の関数が特定の変数の値を変更するかどうかを判断できるコンパイラを構築することが不可能なのはなぜですか?

2022-11-03 18:58:06

疑問点

ある本でこのような一節を読みました。

C++の関数が値を変更するかどうかを実際に判断できるコンパイラを構築することは、証明不可能である。 C++関数が特定の変数の値を変更するかどうかを決定できるコンパイラを構築することは、証明不可能である。 を変更するかどうかを決定できるコンパイラを構築することは証明不可能です。

このパラグラフでは、なぜコンパイラがconst-nessをチェックするときに保守的になるのかについて話していました。

なぜそのようなコンパイラを作ることは不可能なのでしょうか?

コンパイラは、変数が再代入されているか、その変数に対して非定数関数が呼び出されているか、非定数パラメータとして渡されているか...を常にチェックすることができます。

どのように解決するのですか?

なぜそのようなコンパイラを作ることができないのですか?

任意のプログラムが終了するかどうかを決定するプログラムを書くことができないのと同じ理由です。これは 停止問題 と呼ばれ、計算不可能なものの1つです。

はっきり言って、ある関数が変数を変更すると判断できるコンパイラを書くことはできます。 いくつかの場合において しかし、可能性のあるすべての関数について、関数が変数を変更するかしないか (または停止するか) を確実に伝えるものを書くことはできないのです。

簡単な例を挙げます。

void foo() {
    if (bar() == 0) this->a = 1;
}

コンパイラは、このコードを見ただけで、どのようにして foo が変更されるかどうか a ? 変更するかしないかは、この関数の外部条件、すなわち bar . ハルティング問題が計算可能でないことの証明にはそれ以上のものがありますが、それはリンク先のWikipediaの記事で(そしてすべての計算理論の教科書で)すでにうまく説明されているので、ここで正しく説明しようとするのはやめておきます。