プログラムを終了する必要がありますか?言い換えれば、技術的に未定義の動作を永久に実行するプログラムですか?これは空のループについてではないことに注意してください。「もの」(つまり、観察可能な動作)を永遠に行うプログラムについて話す。
たとえば、次のようなもの:
int main()
{
while (true)
{
try
{
get_input(); // calls IO
process();
put_output(); // calls IO, has observable behavior
// never break, exit, terminate, etc
} catch(...)
{
// ignore all exceptions
// don't (re)throw
// never go out of loop
}
}
}
経験的にすべての正気なコンパイラは、上記の種類のプログラムに対して期待されるコードを生成するため(これは他のUBのソースがないことを前提としています)、これはより学術的な質問です。そしてもちろん、終了しないプログラム(OS、埋め込み、サーバー)はたくさんあります。しかし、標準は時々風変わりなので、質問です。
接線:「アルゴリズム」の多くの(一部の?)定義では、アルゴリズムを終了する必要があります。つまり、終了しない一連の操作はアルゴリズムとは見なされません。
接線。停止問題は、任意のプログラムが入力に対して終了するかどうかを判別するアルゴリズムが存在できないことを示しています。ただし、この特定のプログラムの場合、メインから抜け出す原因となる分岐がないため、コンパイラーはプログラムが終了しないことを容易に判別できます。質問は言語弁護士なので、これは無関係です。