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 в родительском модуле. |
| Оглавление| |