Справочник по Ada (Ada 2022)
11.6 Исключения и оптимизация
Этот подраздел разрешает реализации выполнять определённые «оптимизации», которые не обязательно сохраняют каноническую семантику.
Динамическая семантика
Остальная часть этого Справочника (вне этого подраздела) определяет каноническую семантику языка. Каноническая семантика заданного (допустимого) программы определяет набор возможных внешних эффектов, которые могут возникнуть в результате выполнения программы с заданными входными данными.
Как поясняется в 1.1.3, «Соответствие реализации», внешний эффект программы определяется в терминах её взаимодействия с внешней средой. Следовательно, реализация может выполнять любые внутренние действия в любом порядке или параллельно, при условии, что внешний эффект выполнения программы соответствует канонической семантике или правилам данного подраздела.
Разрешения для реализации
Реализации предоставляются следующие дополнительные разрешения:
- Реализация может отказаться от повышения исключения, когда проверка, определённая языком, завершается с ошибкой. Вместо этого операция, которая завершилась с ошибкой, может просто дать неопределённый результат. Исключение требуется для повышения реализацией только в том случае, если в отсутствие повышения значения этого неопределённого результата имели бы влияние на внешние взаимодействия программы. При определении этого реализация не должна предполагать, что неопределённый результат имеет значение, принадлежащее его типу подтипа, или даже основанию диапазона его типа, если тип скалярный. Убрав повышение исключения, каноническая семантика, как правило, позволит реализации пропустить код проверки и часть или все операции.
- Если исключение возбуждается из-за сбоя проверки, определённой языком, то при достижении соответствующего обработчика_исключений (или завершения задачи, если он отсутствует), внешние взаимодействия, которые произошли, должны отражать только то, что исключение было возбуждено где-то в пределах выполнения последовательности_операторов с обработчиком (или телом_задачи), возможно, раньше (или позже, если взаимодействия не зависят от результата проверяемой операции), чем это определено канонической семантикой, но не в пределах выполнения отложенной операции прерывания или независимой подпрограммы, которая не динамически охватывает выполнение конструкции, проверка которой завершилась ошибкой. Независимой подпрограммой является подпрограмма, определённая за пределами библиотечного модуля, содержащего конструкцию, проверка которой завершилась ошибкой, и для которой аспект Inline имеет значение False. Любое присваивание, которое произошло вне таких отложенных операций прерывания или независимых подпрограмм, может быть нарушено возбуждением исключения, что может привести к тому, что объект или его части станут аномальными, а некоторые последующие использования объекта – ошибочными, как объяснено в 13.9.1.
ПРИМЕЧАНИЕ Разрешения, предоставленные в этом подпункте, могут повлиять на семантику программы только в том случае, если программа не пройдёт проверку, определённую языком.