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

13.1 библиотечные модули и раздельная компиляция

При формировании структуры программы , состоящей из исполь­зуемых в языке видов программных модулей, она может быть выпол­нена :

•   в виде единой программы, содержащей все используемые модули;

•   в виде программы, где все ( или часть ) используемых модулей находятся вне программы в библиотеке.

Понятие библиотеки (library ), библиотечного элемента ( library items ) и библиотечного модуля (library unit): основополагающие в языке при рассмотрении вопросов структуры и компиляции программы.

Библиотечный элемент - это :

•   описание подпрограммы или пакета;

•   тело подпрограммы или пакета;

•   описание настройки или конкретизации;

•   описание переименования подпрограммы, пакета или настройки.

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

Библиотечный модуль - это либо библиотечный элемент, либо субмодуль (subunit/

Субмодуль - раздельно компилируемое тело подпрограммы, пакета, задачи, защищенного модуля, спецификации которых находятся в других модулях вместе со следом тела.

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

•   в отдельном адресном пространстве

•   на отдельном компьютере.

В общем случае программа формируется из программных модулей, определенных в языке: подпрограмм, пакетов, задач, защищенных модулей, настраиваемых модулей. Модули в программе могут быть вложенными, библиотечными, либо компилируемыми раздельно.

В Аде при реализации вопросов компилирования программы принята концепция раздельной компиляции ( separate compilation ). При раздельной          компиляции каждого компилируемого модуля выполняется контроль согласования данного модуля с уже откомпилированными. Этим раздельная компиляция отличается от независимой компиляции, где такая проверка не выполняется. То есть связь между раздельно компилируемыми модулями контролируется точно так же, как и между частями одного компилируемого модуля. Для обеспечения такого контроля компилятор хранит всю необходи­ мую дополнительную информацию о каждом компилируемом модуле, что облегчает проверку согласования интерфейсов между разными модулями.

Текст Ада программы обрабатывется за одну или несколько компиляций. Каждая компиляция - обработка последовательности компилируемых модулей ( compiled units ).

Компилируемые модули - это компоненты программы , которые можно компилировать раздельно.

Компилируемый модуль - это :

•   библиотечный модуль;

•   вторичный модуль.

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

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

В процессе компиляции на вход компилятора подаются компили­руемые модули в виде библиотечных модулей или вторичных моду­лей.

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

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

D Примеры    библиотечных модулей: procedure  A   is

150

151

Ада 95. Введение в программирование

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

...             - -  процедура end    A;

package   ZZZ     is

procedure     ln_Buf    (...); - -  пакет procedure    Out_Buf (... );

end  ZZZ;

with   RR;

package   body   MM   is    - - тело пакета

end MM;

with    TT;

package SS  renames  TT; - -  переименование

private   procedure   BB.R () ; - - приватная дочерняя   процедура

generic

type       Volt   is     private ;                - - настраиваемая процедура procedure  Test (X : in Volt);

13.1.1 Спецификаторы контекста

Для указания библиотечных модулей, используемых в компилируемом модуле, применяется спецификатор контекста. Спецификаторы контекста ( Context clauses) имеют две формы:

•   спецификатор  совместимости

WITH    Список_Библиотечных_Модулей;

•   спецификатор использования

USE     Список _Библиотечных_Пакетов;

В Списке_ Библиотечных_Модулей (Пакетов)    указываются простые имена библиотечных модулей или пакетов. В спецификаторе      use

допустимы только имена тех библиотечных пакетов, которые предварительно были указаны в спецификаторе with.

Спецификаторы контекста могут применяться только либо в спецификаторе контекста библиотечного модуля (собственно к модулю или к его вторичному модулю), либо к компилируемому моду-лю (самому модулю или его субмодулю).

Библиотечный модуль, указанный в спецификаторе with, видим непосредственно внутри компилируемого модуля (исключая случаи сокрытия).

D Например:

with Bridge; use Bridge ;         - - используемый в программе

- - библиотечный пакет procedure Methods   is

- -  видны и доступны все ресурсы билиотечного модуля   Bridge end Methods;

Спецификаторы with задают связь (зависимость) между компи­лируемыми модулями и библиотечными модулями, упомянутыми в спецификаторе. Эта зависимость определяет порядок компиляции и перекомпиляции модулей, а также порядок предвыполнения компи­лируемых модулей. D Пример :

with   А,   В, С; use     С; procedure Dust is

use    A;

procedure   Water is         - - вложенная   процедура use    В;

end   Water; end    Dust;

in*

 

153

152

Ада 95. Введение в программирование

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

 

Здесь используются три библиотечных пакета А, В и С. Ресурсы пакета В используются только во вложенной процедуре, что указы­вается соответствующим спецификатором use.

13.1.2 Субмодули

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

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

Виды следа:

Спецификация_ Подпрограммы   IS     SEPARATE ; PACKAGE          BODY     Имя_Пакета          IS     SEPARATE ;

TASK     BODY    Имя_задачи            IS     SEPARATE ; PROTECTED     BODY    Имя_Защищенного_Модуля  IS SEPARATE;

След ( stub ) тела должен размещаться непосредственно в теле библиотечного пакета или разделе описаний компилируемого модуля. Если тело модуля задается следом этого тела, то субмодуль с этим телом компилируется раздельно.

Субмодуль может содержать тела процедур, пакетов, задач и защищенных модулей.

Описание субмодуля:

SEPARATE (Имя_Родительского_Модуля)

Тело_Соответствующего_Модуля

END;

П Например:

- -    субмодуль с телом   пакета

separate  ( Ajax) package  body    Shep  is

end   Shep;

Для каждого субмодуля определяется родительский модуль, то есть компилируемый модуль, содержащий след данного субмодуля^. Родительский модуль является предком, если он - библиотечный модуль.

П Пример:

- - родительский модуль procedure Bank   is А, В, С:   integer;

procedure ZZ (V:   in out integer) is separate; - - след тела

- -процедуры

package   Data  is

procedure Count (X, Y: in integer; S : out integer);

function Deposite (W : Positive); end   Data;

package   body Data is separate ; - - след тела  пакета begin

Data.Count (А, В, С);

• • •

Data. Deposite (В);

ZZ(C);_________________________

• • •

end    Bank;

separate (Bank)   --    субмодуль procedure ZZ(V: in out integer) is

end    ZZ;

I-

154

155

Ада 95. Введение в программирование

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

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

separate ( Bank); - - субмодуль package body  Data   is

procedure   Macler( Т : in out integer) is separate; - - тел след end  Data;

separate ( Bank. Data)  - - субмодуль procedure   Macler( Т: in out integer)   is

ш

end Macler;

СОВЕТЫ:

*  Размещайте спецификацию каждого библиотечного пакета в отдельном файле.

*   Минимизируйте использование субмодулей.

»  Испльзуйте приватные дочерние модули и спецификатор With вместо размещения в теле.

*   Вместо вложенного размещения в теле пакета , используйте личные дочерние модули и спецификатор With в родительском модуле.