Spec-Zone.ru › Ada 2012
Справочник по Ada 2012

10.2 Выполнение программы

Программа Ada состоит из набора разделов, которые могут выполняться параллельно друг с другом, возможно, в отдельном адресном пространстве и, возможно, на отдельном компьютере.

Правила после компиляции

Раздел — это программа или часть программы, которую можно вызвать извне реализации Ada. Например, на многих системах раздел может быть исполняемым файлом, сгенерированным системным компоновщиком. Пользователь может явно назначить библиотечные единицы разделу. Назначение выполняется способом, определенным реализацией. Единицы компиляции, включённые в раздел, — это те, которые явно назначены библиотечных единицах, а также другие единицы компиляции, необходимые этим библиотечным единицам. Единицы компиляции, необходимые для данной единицы компиляции, определяются следующим образом (если не указано иное с помощью определённой реализацией директивы или каким-либо другим определённым реализацией способом):
  • Единица компиляции нуждается в себе;
  • Если единица компиляции необходима, то необходимы и все единицы компиляции, от которых она зависит по смыслу;
  • Если объявление_библиотечной_единицы необходимо, то необходимо и любое соответствующее тело_библиотечной_единицы;
  • Если необходима единица компиляции с заглушками, то необходимы все соответствующие подпрограммы;
  • Если необходимо (неявное) объявление ограниченного представления библиотечного пакета, то необходимо и явное объявление библиотечного пакета.
Пользователь может (по своему усмотрению и способом, определённым реализацией) назначить один подпрограмму как главную подпрограмму для раздела. Главная подпрограмма, если она указана, должна быть подпрограммой.
У каждого раздела есть анонимная задача среды, которая является неявной внешней задачей, выполнение которой описывает элемент_библиотеки в части окружения декларативной_части, а затем вызывает главную подпрограмму, если она есть. Выполнение раздела — это выполнение его задач.
Порядок обработки библиотечных единиц определяется в первую очередь зависимостями обработки. Существует зависимость обработки данного элемента_библиотеки от другого, если данный элемент_библиотеки или любая из его подпрограмм зависят семантически от другого элемента_библиотеки. Кроме того, если для данного элемента_библиотеки или любой из его подпрограмм используется директива pragma Elaborate или Elaborate_All, которая называет другую библиотечную единицу, то существует зависимость обработки данного элемента_библиотеки от тела другой библиотечной единицы, и, только для Elaborate_All, от каждого элемента_библиотеки, необходимого для объявления другой библиотечной единицы.
Структура задачи среды для раздела следующая:
задача Задача_Среды;
задача тело Задача_Среды есть
... (1) -- Часть окружения декларативной_части
-- (то есть последовательность элементов_библиотеки) находится здесь.
начать
... (2) -- Вызвать главную подпрограмму, если она есть.
конец Задача_Среды;
Часть окружения декларативной_части в (1) — это последовательность элементов_декларации, состоящая из копий элементов_библиотеки, включённых в раздел. Порядок обработки элементов_библиотеки — это порядок их появления в части окружения декларативной_части:
  • Порядок всех включённых элементов_библиотеки такой, что нет прямых зависимостей обработки.
  • Любое включённое объявление_библиотечной_единицы для которого аспект Elaborate_Body имеет значение True (включая случай, когда применяется pragma Elaborate_Body) немедленно следует за его телом_библиотечной_единицы, если оно включено.
  • Все объявленные чистыми элементы_библиотеки предшествуют всем, которые не объявлены чистыми.
  • Все предварительно обработанные элементы_библиотеки предшествуют всем, которые не предварительно обработанные.
Должен быть общий порядок элементов_библиотеки, который соответствует вышеуказанным правилам. В противном случае порядок определяется реализацией.
Полные расширенные имена библиотечных единиц и подпрограмм, включённых в данный раздел, должны быть различны.
Последовательность операторов последовательность_операторов задачи среды (см. (2) выше) состоит из:
  • Вызова главной подпрограммы, если в разделе есть такая подпрограмма. Если главная подпрограмма имеет параметры, они передаются; откуда берутся фактические параметры, определяется реализацией. Что происходит с результатом главной функции, также определяется реализацией.
или:
  • Пустого оператора пустой_оператор, если нет главной подпрограммы.
Механизмы построения и запуска разделов определяются реализацией. Они могут быть объединены в одну операцию, например, в динамической компоновке или системах «загрузить и выполнить».

Динамическая семантика

Выполнение программы состоит из выполнения набора разделов. Дальнейшие детали определяются реализацией. Выполнение раздела начинается с выполнения его задачи среды, заканчивается, когда задача среды завершается, и включает выполнение всех задач раздела. Выполнение (неявного) тела_задачи задачи среды действует как мастер для всех других задач, созданных в рамках выполнения раздела. Когда задача среды завершается (нормально или аномально), она ожидает завершения всех таких задач, а затем завершает любые оставшиеся объекты раздела.

Ограниченные (ошибки времени выполнения)

После того, как задача среды дождалась завершения всех других задач раздела, любая дальнейшая попытка создать задачу (во время завершения) является ограниченной ошибкой и может привести к возбуждению Program_Error либо при создании, либо при активации задачи. Если такая задача активируется, не определено, ожидает ли задача среды её до завершения задачи среды.

Требования к реализации

Реализация должна обеспечить согласованность всех единиц компиляции, включённых в раздел, и их соответствие правилам языка.

Разрешения реализации

Вид раздела, описанный в этом подразделе, называется активным разделом. Реализация допускает поддержку других видов разделов с семантикой, определяемой реализацией.
Реализация может ограничить типы подпрограмм, поддерживаемых в качестве основных подпрограмм. Однако от реализации требуется поддержка всех основных подпрограмм, являющихся открытыми безпараметрическими библиотечными процедурами.
Если задача среды завершается аномально, реализация может прервать любые зависящие задачи.
ПРИМЕЧАНИЯ
8 Реализация может предоставить механизм(ы) межраздельного взаимодействия с помощью специальных пакетов и директив. Стандартные директивы для распределения и методы для указания межраздельного взаимодействия определены в Приложении E, «Распределённые системы». Если такие механизмы не предоставлены, каждый раздел изолирован от всех остальных и ведёт себя как программа сама по себе.
9 Разделы не обязаны выполняться в отдельных адресных пространствах. Например, реализация может поддерживать динамическую компоновку через понятие раздела.
10 Порядок обработки элементов_библиотеки, согласованный с частичным порядком, определённым выше, не всегда гарантирует, что каждое тело_библиотечной_единицы обрабатывается перед любой другой единицей компиляции, чья обработка требует, чтобы тело_библиотечной_единицы уже была обработана. (В частности, нет требования, чтобы тело библиотечной единицы обрабатывалось как можно быстрее после обработки объявления_библиотечной_единицы, если не используются директивы в подразделе 10.2.1).
END_OF_DOCUMENT_MARKER
11 Разбиение (активное или иное) не обязательно должно иметь главную подпрограмму. В таком случае вся работа, выполняемая разбиением, будет выполняться путём разработки различных библиотек и задачами, созданными этой разработкой. Пассивные разбиения, которые не могут иметь главные подпрограммы, определены в Приложении E, «Распределённые системы».


Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API