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