Справочник Ada 2005
10.1.4 Процесс компиляции
Каждый представленный компилятору блок компиляции компилируется в контексте среды declarative_part (или просто среды), которая представляет собой концептуальную declarative_part, образующую внешнюю область объявления контекста любого компиляции. Во время выполнения среда формирует declarative_part тела задачи среды раздела (см. 10.2, “Выполнение программы”).
Элементы declarative_item среды представляют собой library_items, упорядоченные таким образом, что нет обратных семантических зависимостей. Каждый включенный подмодуль используется вместо соответствующего заглушки. Правила видимости применяются так, как если бы среда была внешней областью объявления, за исключением того, что with_clause необходимы для обеспечения видимости объявлений библиотек (см. 10.1.2).
Механизмы создания среды и добавления/замены блоков компиляции внутри среды определяются реализацией. Механизмы добавления блока компиляции, упомянутого в limited_with_clause в среду, определяются реализацией.
Правила разрешения имен
Если представлен library_unit_body, который является subprogram_body, он интерпретируется только как завершение, если library_unit_declaration с тем же defining_program_unit_name уже существует в среде для подпрограммы, отличной от экземпляра обобщенной подпрограммы или для обобщенной подпрограммы (даже если профиль тела не соответствует профилю объявления); в противном случае subprogram_body интерпретируется как объявление и тело библиотечной подпрограммы.
Правила легальности
При компиляции блока компиляции все блоки компиляции, от которых он зависит семантически, должны уже существовать в среде; набор этих блоков компиляции должен быть согласованным в том смысле, что новый блок компиляции не должен семантически зависеть (прямо или косвенно) от двух разных версий одного и того же блока компиляции, ни от более ранней версии самого себя.
Разрешения реализации
Реализация может потребовать, чтобы блок компиляции был законным, прежде чем он может быть упомянут в limited_with_clause или может быть вставлен в среду.
Когда в среду добавляется блок компиляции, объявляющий или переименовывающий библиотечную единицу, реализация может удалить из среды любые существующие library_item или subunit с тем же полным расширенным именем. При добавлении в среду блока компиляции, являющегося подмодулем или телом библиотечной единицы, реализация может удалить из среды любую предыдущую версию того же блока компиляции. При добавлении блока компиляции, содержащего body_stub в среду, реализация может удалить любые существующие library_item или subunit с тем же полным расширенным именем, что и body_stub. При удалении данного блока компиляции из среды, реализация также может удалить любой блок компиляции, семантически зависящий от данного. Если данный блок компиляции содержит тело подпрограммы, к которой применяется pragma Inline, реализация также может удалить любой блок компиляции, содержащий вызов этой подпрограммы.
ПРИМЕЧАНИЯ
5 Правила языка применяются в пределах компиляции и границ блока компиляции, точно так же, как они применяются внутри одного блока компиляции.
6 Реализация может поддерживать понятие библиотеки, содержащей library_items. Если поддерживается несколько библиотек, реализация должна определить, как строится единая среда при представлении блока компиляции компилятору. Конфликты имен между различными библиотеками могут разрешаться путем обработки каждой библиотеки как корня иерархии дочерних библиотечных единиц.
7 Блок компиляции, содержащий экземпляр отдельно скомпилированной обобщенной единицы, не зависит семантически от тела обобщенной единицы. Поэтому замена обобщенного тела в среде не приводит к удалению блока компиляции, содержащего экземпляр.