Понимание правила "как будто": "Программа была выполнена как написано"

Я пытаюсь понять правило "как будто". Согласно cppreference:

Правило как будто
Позволяет любые и все преобразования кода, которые не изменяют наблюдаемое поведение программы

объяснение
Компилятору C++ разрешено вносить любые изменения в программу, если выполняется следующее: [...]

Мне трудно понять второй совет в разделе объяснений:

2) При завершении программы данные, записанные в файлы, выглядят так, как если бы программа была выполнена так, как написано.

Я просто не понимаю, что означает "программа была выполнена как написано".

Ответы

Ответ 1

В понедельник ваш босс приходит в ваш офис и говорит: "Мне нужно, чтобы файл А на моем столе к четвергу и файл В на моем столе в пятницу". Сначала он описывает, что он хочет в файле А и как он думает, что вы должны это делать, а затем описывает то, что он хочет в файле В.

В уме вашего босса вы сначала сделаете все для файла A, поместите этот файл на его стол в четверг, затем приступите к работе с файлом B и закончите в пятницу. Но вы понимаете, что было бы более разумно начать работу над файлом B раньше, чем даже перед файлом A. Нет никаких причин, по которым ваш босс должен знать - все, что его волнует, это получение А в четверг и В в пятницу. Вы также понимаете, что предложенный им способ может быть улучшен, поэтому вы применяете немного другой подход к получению необходимой информации.

В этой аналогии босс - это некоторый код C++, а вы - компилятор. Это допустимо для компилятора переупорядочивать операции (работать с файлами в другом порядке), если наблюдаемое поведение (размещение файлов на столе начальника) одинаково. Точно так же компилятор может выполнять любые преобразования (используя подход, отличный от описанного боссом) в коде, который сохраняет наблюдаемое поведение.

В частности, "как если бы программа была выполнена в письменном виде" означает "как если бы вы выполнили работу именно так, как сказал ваш начальник" (даже если вы сделали что-то другое).

Ответ 2

Важной особенностью процитированного правила является то, что оно задает минимальный набор требований для реализации, которая должна соответствовать, но никоим образом не подразумевает, что эти требования будут достаточными для любого конкретного приложения или что некоторым приложениям не понадобятся реализации, чтобы предлагать более сильные гарантии. Предположим, что процедура выполнения и записи результатов одного теста будет:

  1. Сделай эксперимент.
  2. Запишите результат измерения.
  3. Разблокировать сейф
  4. Положите бумагу с измерениями в сейф.
  5. Зафиксируйте сейф.

Если одному дано три теста для выполнения, можно выполнить пять вышеупомянутых шагов по порядку для каждого теста, но любая из следующих последовательностей шагов также может быть приемлемой:

  1. Сделать эксперимент # 1
  2. Запишите результат измерения на бумаге № 1
  3. Сделай эксперимент № 2
  4. Запишите результат измерения на бумаге № 2
  5. Сделай эксперимент № 3
  6. Запишите результат измерения на бумаге № 3
  7. Разблокировать сейф
  8. Положите бумагу № 1 в сейф
  9. Положите бумагу № 2 в сейф
  10. Положите бумагу № 3 в сейф
  11. Заблокировать сейф

или - чтобы избежать необходимости отслеживать три документа одновременно:

  1. Сделай эксперимент № 1
  2. Запишите результат измерения на бумаге № 1
  3. Разблокировать сейф
  4. Положите бумагу № 1 в сейф
  5. Сделай эксперимент № 2
  6. Запишите результат измерения на бумаге № 2
  7. Положите бумагу № 2 в сейф
  8. Сделай эксперимент № 3
  9. Запишите результат измерения на бумаге № 3
  10. Положите бумагу № 3 в сейф
  11. Заблокировать сейф

Если все пойдет так, как ожидается, все три подхода будут эквивалентны. Если, однако, второй эксперимент может пойти не так, как надо, и уничтожить все бумаги, которые лежат на столе, использование второго подхода может привести к потере результатов первого эксперимента - результата, который не произошел бы, если бы была детализирована полная процедура. последовало. Хуже того, если третий эксперимент окажется действительно неудачным и уничтожит все, что не заперто в сейфе, третий подход может привести к потере всего, что было в сейфе, даже содержимого, не связанного с экспериментами.

В некоторых случаях может быть уместен второй или третий подход. В некоторых это не так. Оценка того, являются ли эти подходы подходящими, потребует знания рисков, связанных с экспериментами, содержания сейфа и многих других факторов.

Авторы Стандарта не могут знать все необходимое, чтобы судить, какие гарантии будут необходимы для каких приложений. Вместо этого они полагаются на производителей и пользователей различных реализаций, чтобы признать, какие гарантии будут необходимы для безопасного и эффективного выполнения того, что необходимо сделать.