Введение в программирование - Учебное пособие (Корочкин А. В.)

13.3 выполнение программы

В Аде 83 выполнение программы было связано с понятием главной программы, которое определялось конкретной реализацией. Однако для любой реализации роль главной программы могла выполнять процедура без параметров.

В Аде 95 вместо понятия главная программа введено понятие главная подпрограмма. Это связано с измененим концепции Ада программы в языке. Ада программа теперь - это набор Сегментов ( set of partitions ) , каждый из которых может выполняться параллельно, возможно в отдельном адресном пространстве и возможно на отдельном компьютере.

Сегмент программы - это программа или часть программы, которая может быть вызвана из-вне реализации Ады. Пользователь теперь может назначить (связать) для сегмента библиотечный модуль, используя для этого соответствующие средства языка.

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

Каждый сегмент имеет анонимную окружающую задачу ( Environ-vent_Task ), под которой подразумевается задача, которая осуществляет предвыполнение библиотечных элементов окружа-ющей описательной части, и затем выполняет вызов главной под­программы, если она имеется. Выполнение сегмента - это выполнение окружающей задачи.

Структура окружающей задачи: task  Environment_TasK ;

task  body   Environment_Task   is

...    (1)    -  -        описание   окружения

-  -      (библиотечные элементы )

begin

..."   (2 )      -  -       вызов главной процедуры, если она есть end    Environment_Task;

 

159

Глава 13.Структура программы и раздельная компиляция

Описание окружения ( 1 ) - это последовательность описательных элементов, содержащих копии библиотечных элементов, входящих в сегмент.

Последовательность операторов ( 2) - вызов главной подпрограммы , если она есть, и пустой оператор, если ее нет. Если главная подпрограмма имеет параметры, они передаются. Механизм формирования параметров и результата определяется реализацией.

Выполнение программы - выполнение набора сегментов. Выполне­ние сегмента начинается с выполнения ее окружающей задачи, заканчивается - когда окружающая задача завершается и включает выполнение всех задач сегмента.

Реализация должна обеспечить механизм взаимодействия сегмен­тов с помощью специальных пакетов и прагм. Стандартные прагмы для такого взаимодействия определены в приложении язьпса "Распре­деленные системы " ( Annex E).

Сегмент может не иметь главной подпрограммы. В этом случае выполнение сегмента - предвыполнение различных библиотечных элементов и задач, созданных при этом предвыполнении.

Перед выполнением  главных     подпрограмм  все библиотечные модули вместе с телами , необходимыми для нее,   предвыполняются ( elaboration).

К предвыполняемым библиотечным модулям относятся модули, перечисленные в спецификаторе контекста with главной подпро­граммы, ее тела и субмодулей , а также модули , упомянутые в спецификаторах контекста этих библиотечных модулей, их тел , субмодулей и т.д.

Библиотечный модуль из спецификатора контекста субмодуля должен быть предвыполнен до тела библиотечного модуля - родителя этого субмодуля.

Для предвыполнения должно быть обеспечено следующее требова­ние : тело любого библиотечного модуля предвыполняется прежде любого компилируемого, при предвыполнении которого необходимо предвыполнение тела этого библиотечного модуля.

Для управления порядком предвыполнения библиотечных моду-лей используются следующие прагмы : Preelaborate, Pure, Elaborate , Elaborate_AII, Elaborate_Body.

Прагмы для библиотечных модулей:

______________________        •   —г—

pragma  Preelaborate         [ (Имя_Библиотечного_Модуля

pragma  Pure        [ (Имя_Библиотечного _Модуля ]

pragma  Elaborate_Body  [ (Имя_Библиотечного _Модуля

контекста

Прагмы, допускаемые только внутри спецификатора

pragma pragma

Elaborate Elaborate_AII

[ ( Имя_Библиотечного_Модуля [ ( Имя_Библиотечного_Модуля

Прагма Elaborate предписывает, что тело указанного библио­течного модуля предвыполняется перед текущим библиотечным элементом.

Прагма Elaborate_AII означает, что каждый библиотечный элемент, необходимый для указанного описания библиотечного модуля предвыполняется прежде текущего библиотечного элемента.

Прагма Elaborate_Body означает, что тело библиотечного модуля выполняется немедленно после его определения.

Прагма Preelaborate связана с довыполнением библиотечных модулей в некоторых стуациях.

В языке введено понятие чистого библиотечного элемента. Это -предвыполняемый библиотечный элемент, который не содержит объявления ни одной переменной или является ссылочным типом.

Прагма Pure         используется для обьявления того, что данный бибилиотечный модуль является чистым. Если прагма применяется к бибилиотечному модулю, то его компилируемый модуль должен быть чистым и он будет зависеть семантически только от компилируемых модулей других библиотечных модулей, которые объявлены как чистые.

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