Справочник по Ada 95
10.2 Выполнение программы
Программа Ada состоит из набора разделов, которые могут выполняться параллельно друг с другом, возможно, в отдельном адресном пространстве и, возможно, на отдельном компьютере.
Правила после компиляции
Раздел — это программа или часть программы, которая может быть вызвана извне реализации Ada. Например, во многих системах раздел может быть исполняемым файлом, сгенерированным системным линковщиком. Пользователь может явно назначить библиотечные модули разделу. Назначение выполняется определённым образом, зависящим от реализации. Модули, включенные в раздел, — это модули явных назначенных библиотечных модулей, а также другие модули, необходимые этим библиотечным модулям. Модули, необходимые данному модулю, определяются следующим образом (если не указано иное через определённый реализацией pragma или каким-либо другим определённым реализацией способом):
- Модуль нуждается в самом себе;
- Если модуль необходим, то необходимы и все модули, от которых он зависит семантически;
- Если library_unit_declaration необходим, то необходим и соответствующий library_unit_body;
- Если необходим модуль с заглушками, то необходимы все соответствующие подмодули.
Пользователь может (по выбору) обозначить (с использованием определённого реализацией способа) одну подпрограмму как главную подпрограмму для раздела. Главная подпрограмма, если она указана, должна быть подпрограммой.
Каждый раздел имеет анонимную задачу окружения, которая является неявной внешней задачей, выполнение которой детализирует library_itemы части окружения declarative_part, а затем вызывает главную подпрограмму, если она есть. Выполнение раздела — это выполнение его задач.
Порядок детализации библиотечных модулей определяется в первую очередь зависимостями детализации. Существует зависимость детализации данного library_item от другого, если данный library_item или любой из его подмодулей семантически зависит от другого library_item. Кроме того, если данный library_item или любой из его подмодулей имеет pragma Elaborate или Elaborate_All, который упоминает другой библиотечный модуль, то существует зависимость детализации данного library_item от тела другого библиотечного модуля, а также, только для Elaborate_All, от каждого library_item, необходимых для объявления другого библиотечного модуля.
Задача окружения для раздела имеет следующий структуру:
task Environment_Task;
task body Environment_Task is
... (1) -- Часть окружения declarative_part
-- (т.е., последовательность library_itemов) находится здесь.
begin
... (2) -- Вызов главной подпрограммы, если она есть.
end Environment_Task;
... (1) -- Часть окружения declarative_part
-- (т.е., последовательность library_itemов) находится здесь.
begin
... (2) -- Вызов главной подпрограммы, если она есть.
end Environment_Task;
Часть окружения declarative_part в (1) представляет собой последовательность declarative_itemов, состоящих из копий library_itemов, включённых в раздел. Порядок детализации library_itemов — это порядок, в котором они появляются в части окружения declarative_part:
- Порядок всех включённых library_itemов такой, что нет прямых зависимостей детализации.
- Любое включённое library_unit_declaration, к которому применяется pragma Elaborate_Body, немедленно следует за его library_unit_body, если он включён.
- Все library_itemы, объявленные чистыми, предшествуют тем, которые не объявлены чистыми.
- Все предварительно детализированные library_itemы предшествуют тем, которые не предварительно детализированы.
Должен быть общий порядок library_itemов, который подчиняется вышеуказанным правилам. В противном случае порядок определяется реализацией.
Полные расширенные имена библиотечных модулей и подмодулей, включённых в данный раздел, должны быть различными.
Последовательность операторов задачи окружения (см. (2) выше) состоит либо из:
- Вызова главной подпрограммы, если раздел имеет такую подпрограмму. Если главная подпрограмма имеет параметры, они передаются; откуда берутся фактические значения, определяется реализацией. Что происходит с результатом главной функции, также определяется реализацией.
или:
- Пустого оператора, если главная подпрограмма отсутствует.
Механизмы построения и запуска разделов определяются реализацией. Они могут быть объединены в одну операцию, например, в системах динамической компоновки или «загрузка и выполнение».
Динамическая семантика
Выполнение программы состоит из выполнения набора разделов. Дополнительные детали определяются реализацией. Выполнение раздела начинается с выполнения его задачи окружения, заканчивается, когда задача окружения завершается, и включает выполнение всех задач раздела. Выполнение (явного) task_body задачи окружения служит главным для всех других задач, созданных в рамках выполнения раздела. Когда задача окружения завершается (нормально или аномально), она ожидает завершения всех таких задач, а затем завершает любые оставшиеся объекты раздела.
Ограниченные ошибки (времени выполнения)
После того, как задача окружения ожидала завершения всех других задач раздела, любая последующая попытка создания задачи (во время завершения) является ограниченной ошибкой и может привести к возбуждению Program_Error при создании или активации задачи. Если такая задача активируется, не определено, ожидает ли задача окружения её завершения до завершения задачи окружения.
Требования к реализации
Реализация должна гарантировать, что все модули, включенные в раздел, согласованы друг с другом и являются законными в соответствии с правилами языка.
Разрешения на реализацию
Вид раздела, описанного в этом пункте, называется активным разделом. Реализация имеет право поддерживать другие виды разделов с семантикой, зависящей от реализации.
Реализация может ограничивать виды подпрограмм, которые она поддерживает в качестве основных подпрограмм. Однако реализация обязана поддерживать все главные подпрограммы, которые являются общедоступными библиотечными процедурами без параметров.
Если задача окружения завершается аномально, реализация может прервать любые зависимые задачи.
ПРИМЕЧАНИЯ
8 Реализация может предоставить механизм(ы) межраздельного взаимодействия через специальные пакеты и псевдокоманды. Стандартные псевдокоманды для распределения и методы указания межраздельного взаимодействия определены в Приложении E, «Распределённые системы». Если такие механизмы не предоставляются, каждый раздел изолирован от всех остальных и ведет себя как программа сама по себе.
9 Разделы не обязаны выполняться в отдельных адресных пространствах. Например, реализация может поддерживать динамическую компоновку через концепцию раздела.
10 Порядок детализации library_itemов, который согласуется с частичным порядком, определённым выше, не всегда гарантирует, что каждый library_unit_body детализируется до любого другого модуля, чья детализация требует, чтобы library_unit_body уже был детализирован. (В частности, нет требования, чтобы тело библиотечного модуля было детализировано как можно скорее после детализации library_unit_declaration, если не используются псевдокоманды в подпункте 10.2.1).
11 У раздела (активного или иного) может и не быть главной подпрограммы. В таком случае вся работа, выполняемая разделом, будет выполняться за счёт детализации различных library_itemов и задач, созданных этой детализацией. Пассивные разделы, которые не могут иметь главных подпрограмм, определены в Приложении E, «Распределённые системы».