Правило «как если бы» подпадает под следующие правила:
Наименьшие требования к соответствующей реализации:
Доступ к изменчивым объектам оценивается строго по правилам абстрактной машины.
При завершении программы все данные, записанные в файлы, должны быть идентичны одному из возможных результатов, которые могло бы дать выполнение программы в соответствии с абстрактной семантикой.
Динамика ввода и вывода интерактивных устройств должна происходить таким образом, чтобы вывод подсказки фактически доставлялся до того, как программа ожидает ввода. Что представляет собой интерактивное устройство, определяется реализацией.
Все вместе они называются наблюдаемым поведением программы.
... Доступ к объекту, обозначенному изменчивым значением glvalue (3.10), изменение объекта, вызов функции ввода-вывода библиотеки или вызов функции, которая выполняет любую из этих операций, - все это побочные эффекты, которые представляют собой изменения в состоянии среда исполнения. ...
Но возьмем такую программу:
while (1) { }
// or
for (;;) { }
Дело в том, что нет никаких объектов или вызовов функций и, следовательно, нет побочных эффектов и, следовательно, нет изменений в состоянии среды выполнения. Что мешает компилятору скомпилировать этот код в
xorl %eax, %eax
retq
Неужели все это недетерминировано? Бесконечный цикл - это, по сути, метка, переходите к ней снова и снова и продолжайте, пока компьютер не выключится. Код не делает ничего интересного, никаких вычислений, никаких операций ввода-вывода и т. Д.
В коде ядра интересен бесконечный цикл. Но в коде пользовательского пространства бесконечный цикл обычно является признаком плохо написанной программы. Так в чем же изъян моей логики?