Н. Джехани - Язык Ада (1988) (1160771), страница 108
Текст из файла (страница 108)
4.5.7). Такое переупорядочивание допустимо даже тогда, когда может быть устранено некоторое исключение или вставлено предопределенное исключение. Также дополнительная свобода предоставляется реализации при вычислении простых числовых выражений. При выполнении предопределенных операций в реализации допускается использование операций над типами, которые имеют более широкий диапазон результата, чем базовый тип операндов, при условии, что это приводит к точному результату(или результату с заданной точностью для вещественного типа), даже если промежуточные результаты выходят за границь~ базового типа В таком случае нет необходимости возбуждать исключение Н()МЕЙ(С ЕЙЙОЙ.
В частности, если числовое выражение является операндом предопределенной операции отношения и может быть получен правильный результат типа ВООЕЕАН, то в процессе вычисления можно не возбуждать исключение Н()МЕЙ!С ЕЙЙОЙ. Нет необходимости в выполнении предопределенной операции, если ее единственным возможным результатом является распространение предопределенного исключения или если изменение последовательности операций по описаным выше правилам приводит к ее безре. эультатному выполнению.
Примечание. Правило б) применимо к предопределенным операциям, но неприменимо к формам управления с промежуточной проверкой. Выражение ЗРЕЕО с 300-0000 может быть заменено на ТЙ()Е, если значение 300 0000 находится вне границ базового типа для ЗРЕЕО, даже если неявное преобразование этого числового литерала может возбудить исключение Н(эМЕЙ)С ЕЙЙОЙ. Исклачелив Пример: ввыаве М: (МТЕОЕЯ; Ьва)в м := о; (1) Вяз(в)..
)ОЬав М:- М + Зввя(К); — А И К яВЛяЮтСя ГЛОбалЬНЫМИ ПЕРЕМЕННЫМИ аев Шев: РОТ(М); вваававл айва авива => РОТ( вота епсг агаве ); РОТ(МЕ аев; Вычисление А(К) может быть выполнено до цикла и, возможно, непосредственно перед оператором присваивания (1), даже если в нем может возбуждаться исключение. Следовательно, внутри обработчика исключения значение М будет либо неопределенным, либо результатом последнего присваивания. С другой стороны, вычисление А(К) не может быть выполнено до 589)п, поскольку в этом случае исключение будет обрабатываться другим обработчиком.
По этой причине инициализация й в описании будет исключать возможность наличия неопре. деленного начального значения й в обработчике. Ссылки: базовая операция типа 333, базовый тип 3.3, вещественный тип 3.5.6, исключение 11, исключение МОМЕН)С ЕЙНОН 11.1, неопределенное значение 3.2.1, обработчик исключения 11.2, окружение 11.1, оператор принятия 9.5, ошибочная ситуация 11, присваивание 5.2, предо.
пределенная операция 4.5, предопределенная подпрограмма 8.6, преобразование 4.6, распространение исключения 11.4, точность вещественных операций типа 4.5.7. 11.7. ПОДАВЛЕНИЕ ПРОВЕРОК Присутствие прагмы 80РРНЕ88 позволяет реализации опускать некоторые проверки во время выполнения программы. Эта прагма имеет следующий вид: шашяа ЕОРРяе88 (идентификатор [, [Ом =>[. имя!)г Проверяется именуемая компонента, индексируемая компонента, отрезок или атрибут объекта, укаэанный ссылочным значением на неравенство значению пи)1 этого ссылочного значения. АССЕ88 СНЕСК Проверяется, что дискриминант составного значения удовлет- воряет ограничению дискримннанта. Также при ссылке на компоненты записи проверяется их существование для теку- щих значений дискриминанта.
О(8СЙ(М)МАМТ СНЕСК Проверка, указанная идентификатором, может быть опущена. Имя (если оно присутствует) должно быть простым или расширенным и обозначать объект, тип или подтип, задачный модуль или настраиваемый модуль; оно также может быть именем подпрограммы, в этом случае имя обозначает все видимые совмещенные подпрограммы. Прагма 80РРНЕ88 допустима непосредственно в разделе описаний или непосредственно в спецификации пакета.
Во втором случае допустимо представление прагмы только с именем, которое обозначает понятие (или несколько совмещенных подпрограмм), описанное непосредственно в спецификации пакета. Действие прагмы распространяется от местоположения прагмы до конца зоны описания, связанной с самым внутренним объемлющим оператором блока или программным модулем. Если прагма задана в спецификации пакета, то ее действие распространяется до конца области действия именованного понятия. Если в прагму включено имя, то возможность подавления проверки в дальнейшем ограничена: прагма действует только для операций над объектом с этим именем или над всеми объектами базового типа для указанного в прагме имени типа или подтипа, для вызовов под.
программ с этим именем, для активизации задач указанного именем задачного типа и для конкретизаций указанного настраиваемого модуля. Следующие проверки соответствуют ситуациям, в которых может быть возбуждено исключение СОМВТНА)МТ ЕЙНОЙ. В этих проверках имя (если оно указано) должно обозначать объект или тип. Гпава у( (МОЕК СНЕСК Проверяется, что границы значений индексов массива равны соответствующим границам ограничения индекса. Также при ссылке на компоненту массива по каждой размерности проверяется, что данное значение индекса находится в диапазоне, определенном границами индекса массива; при ссылке на отрезок массива проверяется, что заданный дискретный диапазон совместим с диапазоном, определенным границами индексов массива. СЕМОТН СНЕСК Проверяется, что каждой компоненте массива соответствует подходящая компонента при выполнении присваивания масси- ву, преобразовании типа и выполнении логических операций над массивами логических компонент.
ЙАМОЕ СНЕСК Проверяется, что некоторое значение удовлетворяет ограниче нию диапазона. Также при предвыполнении указания подтила проверяется совместимость ограничения (если оно имеется) с обозначением типа. Для агрегата проверяется принадлежность индекса или дискриминанта соответствующему подтипу. Неко.
нец, осуществляются проверки любых ограничений, создавае. мых при конкретизации настройки. Следующие проверки соответствуют ситуациям, в которых возбуждается исключение МОМЕЯ(С ЕййОЙ Допустимыми именами в соответствующих прагмах являются имена число вых типов. О(Ч!8(ОМ СНЕСК Проверяется, что второй операнд операций /, гегя и пнх1 не ра- вен нулю. ОНЕЯР(.Оуу СНЕСК Проверяется, что в результате выполнения числовой операции не возникает переполнения. Следующие проверки соответствуют ситуациям, в которых возбуждается исключение РЯООЯАМ ЕЯЙОЙ.
Допустимыми именами в соответствующих прагмах являются имена эадачных модулей, настраиваемых модулей или подпрограмм. Е(АВОЙАТ(ОМ СНЕСК Когда вызывается подпрограмма, выполняется активизация эа. дачи или предвыполняется конкретизация настройки, то про- веряется, что тело соответствующего программного модуля уже предвыполнено. 8ТОЯАОЕ ЕВЯОЯ Проверяется, что выполнение генератора не потребует объема памяти, большего, чем необходимо для выбора, или что требуемый под задачу или для подпрограммы объем памяти до. статочен. Если возникает ошибочная ситуация в отсутствие проверок во время выполнения про. граммы, то программа считается ошибочной (результаты выполнения не определяются в языке). Примеры: ркэаяш 8ЦРРЙЕ88(ЯАНСЕ СНЕСК1; ргэаяш 8ОРРНЕ88(!МСЕК СНЕСК.
ОМ р> ТАВ(.Е1; Примечание. Для некоторых реализаций может оказаться невозможным или слишком до. рогим подавление некоторых проверок, тогда соответствующая прагма 80РРЯЕ88 может быть проигнорирована. Следовательно, наличие такой прагмы внутри данного модуля не гарантирует, что соответствующее исключение не будет возбуждено; зти исключения также могут распространяться вызванными модулями.
Следующие проверки соответствуют ситуациям, в которых возбуждается исключение 8ТОЯАОЕ ЕЯЯОй. Допустимыми именами в соответствующих прагмах являются имена, обозначающие ссылочные типы, задачные модули или подпрограммы. Исключения Ссылки: агрегат 4.3, активизация 9.3, атрибут 4.1.4, вызов подпрограммы 6.4, генератор 4.8, дискретный диапазон 3.6, дискриминант 3.7.1, задача 9, задачный модуль 9, задачный тип 9.1, идентификатор 2.3, именуемый тип 3.7, индекс 3.6, индексируемая компонента 4.1.1, исключение СОМЗТЯА1МТ ЕЯЯОЯ 11,1, исключение МОМЕН!С ЕЯЯОЯ 11.1, исключение РЯООЯАМ ЕЯЯОЯ 11.1, компонента записи 3.7, компонента массива 3.6, конкретизация наст. ройки 12.3, массив 3.6, набор 3 8, настраиваемое тело 11.1, настраиваемый модуль 12, обозначе.
ние 3.8, обозначение типа 3.3.2, объект 3.2, ограничение 3.3, ограничение диапазона 3.5, ограни. чение дискриминанта 3.7.2, ограничение индекса 3.6.1, оператор блока 5.6, операция 3.3.3, отрезок 4.1.2, ошибочная ситуация 11, ошибочный 1.6, предвыполнение 3.1, 3.9, подпрограмма 6, подтип 3.3, прагма 2.8, программный модуль 6, простое имя 4.1, раздел описаний 3.9, размер ность 3.6, распространение исключения 11.4, расширенное имя 4.1.3, совместимыи 3.3.2, составной тип 3.3, спецификация пакета 7.1, ссылочное значение 3.8, ссыпочный тип 3 8, субмодуль 10.2, тело задачи 91, тело пакета 7.1, тело подпрограммы 6.3, тип 3.3, числовая операция 3.5.5, 3.5.8, 3.5.10, числовой тип 3.5. Глава 12 Н АСТРА И ВА ЕМ Ы Е МОДУЛ И Настраиваемый модуль — это программный модуль, являющийся настраиваемой подпро. граммой или настраиваемым пакетом, это также маблон с параметрами или без них, по которому могут быть получены соответствующие (ненастраиваемые) подпрограммы или пакеты.
Итоговые программные модули называются экземплярами исходного настраиваемого модуля. Настраиваемый модуль задается описанием настройки, которве имеет раздел формаль. ных параметров настройки, описывающий эти параметры. Конкретный экземпляр настраиваемого модуля получается в результате конкретизации настройки путем сопоставления фор. мальным параметрам фактических. Экземпляр настраиваемой подпрограммы — это подпрограмма. Экземпляр настраиваемого пакета — пакет. Как шаблоны настраиваемые модули не обладают свойствами, характерными для их нана. страиваемых аналогов. Например, настраиваемая подпрограмма может быть конкретизирована, но не может быть вызвана.