Справочник по Ada 2012
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. При удалении данной единицы компиляции из среды, реализация также может удалить любую единицу компиляции, которая семантически зависит от данной. Если данная единица компиляции содержит тело подпрограммы, для которой аспект Inline равен True, реализация также может удалить любую единицу компиляции, содержащую вызов этой подпрограммы.
ПРИМЕЧАНИЯ
5 Правила языка применяются к границам компиляции и единиц компиляции, так же, как и внутри одной единицы компиляции.
6 Реализация может поддерживать понятие библиотеки, которая содержит library_items. Если поддерживается несколько библиотек, реализация должна определить, как строится одна среда, когда единица компиляции представляется компилятору. Конфликты имен между различными библиотеками могут быть разрешены путем обработки каждой библиотеки как корня иерархии дочерних единиц библиотеки.
7 Единица компиляции, содержащая экземпляр отдельно скомпилированной обобщенной единицы, не зависит семантически от тела обобщенной единицы. Поэтому замена обобщенного тела в среде не приводит к удалению единицы компиляции, содержащей экземпляр.