Справочник по Ada (Ada 2022)
10.1.4 Процесс компиляции
Каждый блок компиляции, поданный компилятору, компилируется в контексте окружения declarative_part (или просто окружения), которое представляет собой концептуальный declarative_part, образующий самую внешнюю область объявления контекста любого компиляции. Во время выполнения окружение образует declarative_part тела задачи окружения раздела (см. 10.2, «Выполнение программы»).
Элементы объявления declarative_item окружения представляют собой library_item, упорядоченные таким образом, чтобы не было обратных зависимостей. Каждый включённый подблок появляется на месте соответствующего заглушки. Правила видимости применяются так, как если бы окружение было самой внешней областью объявления, за исключением того, что 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. Когда данный блок компиляции удаляется из окружения, реализация также может удалить любой блок компиляции, который семантически зависит от данного блока. Если данный блок компиляции содержит тело подпрограммы, для которой аспект Inline равен True, реализация также может удалить любой блок компиляции, содержащий вызов этой подпрограммы.
ПРИМЕЧАНИЕ 1 Правила языка применяются как между компиляциями и границами блоков компиляции, так и внутри одного блока компиляции.
ПРИМЕЧАНИЕ 2 Реализация может поддерживать понятие библиотеки, которая содержит library_itemы. Если поддерживается несколько библиотек, реализация может документировать, как строится одно окружение, когда блок компиляции подаётся компилятору. Конфликты имён между разными библиотеками могут, например, разрешаться путём обработки каждой библиотеки как корня иерархии дочерних блоков библиотек.
ПРИМЕЧАНИЕ 3 Блок компиляции, содержащий экземпляр отдельно скомпилированного генерического блока, не зависит семантически от тела генерического блока. Поэтому замена генерического тела в окружении не приводит к удалению блока компиляции, содержащего экземпляр.