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

13.4 иерархические библиотеки

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

 

161

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

Иерархические библиотеки основываются на ведении понятия родительского ( parent ) и дочернего ( child ) модулей. Дочерние модули в свою очередь могут быть либо публичными ( ( public child ), либо приватными ( private childe ).

A.BZ

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

A.BZ.M

A.BZ.M.E1

А.ВХ.С1                А.ВХ.С2

A.BZ.M.E2

Рис. 13.1

Если дочерний библиотечный модуль Р.С описан в контексте with, то он рассматривается как модуль, находящийся в его родитель­ском модуле Р, и для него сохраняются правила именования и види-

163

162

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

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

 

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

Добавление нового дочернего модуля Р.Х не требует немедленной перекомпиляции существующих библиотечных модулей.

Использование иерархии библиотек позволяет решить многие проблемы, существовавшие в Аде 83. Например, создание пакетов, работающих с общим личным типом, или расширение ресурсов су­ществующего пакета. Такие проблемы либо не решаются в Аде 83, либо требуют соответствующих изменений в программе и перекомпиляции модулей.

П Пример 1.

Имеется пакет VEC для работы с векторами. Ресурсы пакета -приватный тип Vector и две функции Sum и Sub.

package  VEC   is

type  Vector is private;

function   Sum (VA, VB :   Vector ) return  Vector ;

function   Sub (VA, VB :   Vector) return   Vector;

private

type Vector is array (1.. 20 ) of float;

end    VEC;

Mult     для

Необходимо добавить к пакету еще   подпрограмму умножения векторов. Это можно сделать:

•   путем изменения спецификации   пакета     VEC,     добавив в него спецификацию процедуры Mult;

•   путем создания дочернего пакета VEC.MLT.

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

package  VEC.MLT   is

function   Mult (VA, VB :   Vector)   return   Float; end   VEC.MLT.

Так как пакет VEC.MLT является дочерним для пакета VEC , то в нем приватный тип Vector доступен и может использоваться в подпрограмме Mult.

Правила видимости для дочерних   библиотечных пакетов:

•   дочерний библиотечный пакет декларируется внутри области видимости определения его родительского модуля после его специ­фикации;

•   приватная часть спецификации и тело дочернего пакета "видят" приватную часть родительского модуля.

П Пример 2.

package   BOX   is

type Data is private ;

private end BOX;

- - дочерний     пакет package   BOX.ZIP is

type Result  is private;

private

end   BOX.ZIP;

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