Как сказано в названии,
Типичный ответ, который можно получить:
Правило, разрешающее любые преобразования кода, которые не изменяют наблюдаемое поведение программы.
Время от времени мы получаем поведение от определенных реализаций, которые приписываются этому правилу. Много раз ошибочно. Итак, что же это за правило. В стандарте это правило четко не упоминается как раздел или параграф, так что же именно подпадает под действие этого правила? Мне это кажется серой зоной, которая детально не определяется стандартом. Может кто-нибудь уточнить детали, ссылаясь на ссылки из стандарта?
Примечание. Обозначьте это как C и C ++, потому что это относится к обоим языкам.
Ответы:
Что такое правило « как если бы »?
Правило « как если бы » в основном определяет, какие преобразования разрешено выполнять реализации в законной программе на C ++. Короче говоря, все преобразования, которые не влияют на « наблюдаемое поведение » программы (точное определение см. Ниже), разрешены.
Цель состоит в том, чтобы дать реализациям свободу выполнять оптимизацию, пока поведение программы остается совместимым с семантикой, определенной стандартом C ++ в терминах абстрактной машины.
Где Стандарт вводит это правило?
Стандарт C ++ 11 вводит правило « как если бы » в параграфе 1.9 / 1:
Также в пояснительной сноске добавлено:
Что именно предписывает правило?
Пункт 1.9 / 5 дополнительно уточняет:
Стоит подчеркнуть, что это ограничение применяется только при «выполнении хорошо сформированной программы» , и что возможные результаты выполнения программы, которая содержит неопределенное поведение, не ограничены. Это также ясно указано в параграфе 1.9 / 4:
Наконец, что касается определения " наблюдаемого поведения ", пункт 1.9 / 8 гласит следующее:
Есть ли ситуации, когда это правило не применяется?
Насколько мне известно, единственным исключением из правила « как если бы » является исключение копирования / перемещения, которое разрешено, даже если конструктор копирования, конструктор перемещения или деструктор класса имеют побочные эффекты. Точные условия для этого указаны в Пунктах 12.8 / 31:
источник
В C11 правило никогда не называется этим именем. Однако C, как и C ++, определяет поведение в терминах абстрактной машины. Правило как если бы находится в C11 5.1.2.3p4 и p6 :
источник
В C, C ++, Ada, Java, SML ... на любом языке программирования, хорошо определенном путем описания (обычно многих возможных, недетерминированных) поведения (й) программы (подверженной серии взаимодействий на портах ввода-вывода) , четкого правила «как если бы» не существует .
Примером особого правила является то, что деление на ноль вызывает исключение (Ada, Caml) или разыменование нуля вызывает исключение (Java). Вы можете изменить правило, указав что - то еще, и в итоге вы получите другой язык (который некоторые люди предпочли бы называть «диалектом» (*). Существует отдельное правило, чтобы указать некоторые различные варианты использования языка программирования, такие как отдельный грамматические правила охватывают некоторые синтаксические конструкции.
(*) Диалект, по мнению некоторых лингвистов, - это язык с «армией». в этом контексте это может означать язык программирования без комитета и конкретную отрасль редакторов компиляторов.
Правило «как если бы» не является отдельным правилом ; оно не распространяется на какую-либо конкретную программу и даже не является правилом, которое можно было бы обсуждать, удалять или изменять каким-либо образом : так называемое «правило» просто повторяет, что семантика программы определена и может быть только переносимой (универсально) определяется в терминах видимых взаимодействий выполнения программы с «внешним» миром.
Внешний мир может быть интерфейсами ввода-вывода (stdio), графическим интерфейсом пользователя, даже интерактивным интерпретатором, который выводит результирующее значение на чистом прикладном языке. В C и C ++ это включает (неопределенно определенный) доступ к изменчивым объектам, что является еще одним способом сказать, что некоторые объекты в данной точке должны быть представлены в памяти строго в соответствии с ABI (двоичный интерфейс приложения), без явного упоминания ABI.
Определение того, что является следом выполнения , также называемым видимым или наблюдаемым поведением, определяет, что подразумевается под «правилом как если бы». Правило «как если бы» пытается объяснить это, но тем самым сбивает с толку людей больше, чем проясняет вещи, поскольку дает выражение того, что оно является дополнительным семантическим правилом, дающим больше свободы для реализации.
Резюме:
источник