Н. Джехани - Язык Ада (1988) (1160771), страница 105
Текст из файла (страница 105)
В примере 1 (см. 10.1.1) процедура О()АОЯАТ(С ЕО()АТЮМ должна компилироваться по. спе библиотечных пакетов ТЕХТ Ю и ЯЕАЕ ОРЕЯАТЮМ8, так как они упомянуты в специфи. кагоре совместности процедуры. б. В примере 2 (см. 10.1.2) тело пакета ЗТОСК должно компилироваться после соответствующей спецификации пакета.
Глава 10 в. В примере 2 (см. 10.1.2) спецификация пакета ЗТОСК должна компилироваться до про. цедуры РЛОСЕЗЗОЯ. С другой стороны, процедура РЯОСЕЗЗОЯ может компилироваться как до, так и после тела пакета ЗТОСК. г. В примере 3 (см. 10.2.1) процедура О должна компилироваться после пакета ТЕХТ Ю, так как этот пакет упомянут в спецификаторе совместности процедуры О. В то же время пакет ТЕХТ Ю может компилироваться как до, так и после процедуры ТОР.
д. В примере 3 (см. 10.2.1) субмодули ТЯАНЗРОЯМ и ЕАС((зТТ должны компилироваться после главной программы ТОР. Субмодупь О должен компилироваться после его родительского модуля РАС1МТУ. Примечание. Для библиотечных пакетов из правил перекомпиляции следует, что тело пакета становится устаревшим после перекомпиляции соответствующей спецификации. Если но.
вая спецификация пакета не требует задания тела (т. е. она не содержит описаний программных модулей), то перекомпиляции тела такого пакета не требуется. В любом случае устаревшее тело пакета не должно использоваться и поэтому может быть удалено из программной библиотеки. Ссылки: библиотечный модуль 10.1, видимость 8.3, вторичный модуль 10.1, имя 4.1, компилируемый модуль 10.1, компиляция 10.1, локальное описание 8.1, настраиваемый модуль 12, настраиваемое тело 12.2, описание настройки 12.1, описание подпрограммы 6.1, пакет 7, переменная 3.2.1, прагма )Н(.)НЕ 6.3.2, предвыполнение 3.9, процедура 6.1, родительский модуль 10.2, соответствующее тело 3.9, спецификатор контекста 10.1.1, спецификатор совместности 10.1.1, спецификация пакета 7.1, спецификация подпрограммы 6.1, субмодуль 10.2, тело пакета 7.1, тело подпрограммы 6.3, тело процедуры 6.3, тип 3.3.
10.4. ПРОГРАММНАЯ БИБЛИОТЕКА Правила языка требуют, чтобы компилятор одинаковым образом обрабатывал программу, состоящую из нескольких компилируемых модулеи (и субмодупей) или из одного компилируе. мого модуля. Должен быть предусмотрен библиотечный файл, содержащий информацию о компилируемых модулях программной библиотеки, в который могут включаться символьные таблицы и другая информация, относящаяся к предыдущим компиляциям. Обычно входными данными для компилятора являютея компилируемые модули (или модуль) и библиотечный файл. Последний используется для проверок и корректируется после успешного компилирования каждого из этих модулей. Примечание.
Для компилируемых модулей компиляции создается одна программная библиотека. Возможно существование различных программных библиотек; в языке не определе. ны правила их именования — это обеспечивается окружением системы программирования. Для создания программной библиотеки данной программы или данного семеиства про. грамм следует ввести команды. Эти команды могут разрешать использование модулей из других программных библиотек. Наконец, для запроса состояний модулей в программной библиотеке также следует ввести команды.
Форма этих команд не задана в определении языка. Ссылки: компилируемый модуль 10.1, порядок компиляции 10.3, программа 10.1, программная библиотека 10.1, спецификатор использования 8.4, спецификатор контекста 10.1.1, спецификатор совместности 10.1.1, субмодуль 10.2. 10.6. ПРЕДВЫПОЛНЕНИЕ БИБЛИОТЕЧНЫХ МОДУЛЕЙ Перед выполнением главной программы все библиотечные модули, необходимые для главной программы, и тела этих модулей (если они есть) предвыполняются. Такими библиотечными модулями являются модули, упомянутые е спецификаторах совместности для главной программы, ее тела и субмодулей, а также модули, упомянутые в спецификаторах совместности для этих библиотечных модулей, их тел и субмодулей, и т.
д. вплоть до получения транзитивного замыкания. Предвыполнение таких библиотечных модулей и их тел производится в соответствии с частичной упорядоченностью, определяемой спецификаторами совместности (см. 10.3). Кроме того, библиотечный модуль, упомянутый в спецификаторе контекста дпя субмодуля, должен быть предвыполнен до тела библиотечного модуля-предка этого субмодуля. Порядок предвыполнения, отвечающий такому отношению упорядоченности, не всегда обеспечивает выполнение следующего требования: тело любого библиотечного модуля пред- выполняется прежде любого другого компилируемого модуля, при предвыполнении которого необходимо предвыполненив тела этого библиотечного модуля. Для указания необходимости более раннего предвыполнения тел библиотечных модулей используется прагма Е(.АВОЯАТЕ.
С л шшы и льтвт компяля вя Эта прагма записывается в виде рга9гла Е(АВОЯАТЕ (простое имя библиотечного модуля („ простое имя библиотечного модуля)); Такие прагмы допустимы только непосредственно после спецификатора контекста компилируемого модуля(до следующего эа ним библиотечного или вторичного модуля). Аргументы этой прагмы должны быть простыми именами библиотечных модулей, упомянутых в спецификаторе контекста, и каждый такой библиотечный модуль должен иметь соответствующее тело.
Эта прагма указывает, что тело библиотечного модуля должно предвыполняться до данного компилируемого модуля. Если данный компилируемый модуль — субмодуль, то тело библиотечного модуля должно предвыполняться до тела библиотечного модуля-предка (суб. модуля). Программа неправильна, если не может быть найден необходимый порядок предвыполне. ния (т. е. если существуют циклические зависимости). Предвыполнение компилируемых модулей программы в остальных случаях осуществляется в некотором порядке, который не опреде.
лен в языке. Ссылки: аргумент прагмы 2.8, библиотечный модуль 10.1, в некотором порядке 1.6, вторичный модуль 10.1, главная программа 10.1, допустим 1.6, зависимость между компилируемыми модулями 10.3, имя 4.1, компилируемый модуль 10.1, неправильна 1.6, простое имя 4,1, специ. фикатор контекста 10.1.1, спецификатор совместности 10.1.1, субмодуль 10.2, раздельная компиляция 10.1. 10.6.
ОПТИМИЗАЦИЯ ПРОГРАММЫ Компиляторы могут осуществлять оптимизацию предвыполнения описаний и выполнения операторов. В частности, компилятор может оптимизировать программу, вычисляя определенные выражения помимо статических. Если какое. либо из таких выражений, статических или нет, при вычислении приводит к возбуждению исключения, то код этой части программы мо жег быть заменен кодом возбуждения того же исключения; зто справедливо для исключений, возбуждаемых при вычислении имен и простых выражений (см. также равд. 11.6). Компилятор может определить, что некоторые операторы или подпрограммы никогда не будут выполняться, например, если их выполнение зависит от условия, имеющего значение РАЕЗЕ. В таком случае соответствующие части объектного машинного кода могут быть опущены.
Такое правило позволяет на уровне языка производить условную компиляцию. Примечание. Вырвжание, вычисление которого может привести к возбуждению исключе. ния, не обязательно представляет ошибку, если выражение находится в операторе или подпрограмме, которые никогда не выполняются. Компилятор может предупреждать программиста о потенциальной ошибке.
Ссылки: возбуждение исключения 11.1, выражение 4.Т, вычисление 4.5, исключение 11, ло. гическое значение РАЕЗЕ 3.5.3, оператор 5, описание 3.1, подпрограмма 6, предвылолнение 3.9, программа 10, статическое выражение 4.9, условие 5.3. Глава 11 ИСКЛЮЧЕНИЯ В этой главе определяются средства обработки ошибок или других исключительных ситуаций, которые возникают при выполнении программы.
Такая ситуация называется исключени. ем. Возбуждение исключения следует понимать как прекращение нормального выполнения программы для обработки соответствующей ситуации. Ответное действие на возбуждение исключения называется обработкой исключения. В описании исключения задается имя исключения. Исключение может быть возбуждено либо оператором возбуждения, либо каким. либо другим оператором или операцией, распространяющими исключение.
При возбуждении исключения управление может быть передано обработчику исключения, написанному пользователем либо в конце оператора блока, либо в конце тела подпрограммы, пакета или задачного модуля. Ссылки: имя 4.1, обработчик исключения 11.2, оператор блока 5.6, оператор возбуждения 11.3, ошибочная ситуация 1.6, распространение исключения 11.4.1, 11.4.2, тело задачи 9.1, тело пакета 7.1, тело подпрограммы 6.3. 11.1. ОПИСАНИЯ ИСКЛЮЧЕНИЙ В описании исключения задается его имя. Это имя можно употреблять только в операторах возбуждения, обработчиках исключений и описаниях переименования.
описание исключения з= список идентификаторов: ехсербоп; СОНЗТЯА)НТ ЕЯЯОЯ Это исключение возбуждается в любой из следующих ситуаций: при попытке нарушить ограничение диапазона, ограничение индекса или ограничение дискриминанта; при попытке ис. пользовать компоненту записи, не существующую для текущих значений дискриминанта; при попытке использовать именуе. мую компоненту, индексируемую компоненту, отрезок или атрибут объекта, обозначенного ссылочным значением, если этот объект не существует, поскольку ссылочное значение пустое. Это исключение возбуждается при выполнении предопределенной числовой операции, которая не может выработать верный результат(для вещественных типов в пределах предписан. ной точности). Сюда относится также случай использования реализацией предопределенных числовых операций для выполнения, вычисления или предвыполнения некоторой кон.