Справочное руководство по языку Ада-83


Субмодули компилируемых модулей


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

след-тела ::= спецификация-подпрограммы is separate;

| package body простое-имя-пакета is separate;

| task body простое-имя-задачи is separate;

субмодуль :: = separate (имя-родительского-модуля) соответствующее-тело

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

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

Для каждого субмодуля задается имя

родительского модуля,

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

предком.

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

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



Результатом предвыполнения следа тела является предвыполнение соответствующего тела субмодуля.


Примечание.

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

Библиотечный модуль, упомянутый в спецификаторе совместности субмодуля, может быть скрыт описанем (с тем же идентификатором), данным в соответствующем теле субмодуля. Более того, такой библиотечный модуль может быть скрыт описанием, данным в родительском модуле, так как библиотечный модуль рассматривается как описанный в пакете STANDARD; это, однако, не влияет на интерпретацию спецификаторов совместности, ибо в них могут быть упомянуты имена только библиотечных модулей.

Ссылки:

библиотечный модуль 10.1, видимость 8.3, задача 9, задачный модуль 9.1, идентификатор 2.3, имя 4.1, компилируемый модуль 10.1, локальное описание 8.1, настраиваемое тело 12.2, настраиваемый модуль 12, непосредственная видимость 8.3, непосредственное вхождение 8.1, описание 3.1, описание переименования 8.5, пакет 7, подпрограмма 6, предвыполнение 3.9, программа 10, программный модуль 6, простое имя 4.1, раздел описаний 3.9, раздельная компиляция 10.1, расширенное имя 4.1.3, скрыт описанием 8.3, совмещение 8.3, согласованный 6.3.1, соответствующее тело 3.9, спецификатор использования 8.4, спецификатор контекста 10.1.1, спецификатор совместности 10.1.1, спецификация подпрограммы 6.1, тело задачи 9.1, тело пакета 7.1, тело подпрограммы 6.1.

10.2.1. ПРИМЕРЫ СУБМОДУЛЕЙ

Сначала процедура ТОР оформлена в виде компилируемого модуля без субмодулей.

with TEXT_IO; procedure TOP is

type REAL is digits 10; R, S ; REAL := 1.0;

package FACILITY is

PI : constant := 3.14159_26536; function F (X : REAL) return REAL; procedure G (Y, Z : REAL); end FACILITY;

package body FACILITY is



-— предшествуют некоторые локальные описания

function F(X : REAL) return REAL is

begin

-— последовательность операторов функции F ... end F;

procedure G(Y, Z : REAL) is

-— использующие пакет TEXT_IO локальные процедуры ... begin

-— последовательность операторов процедуры G ... end G;

end FACILITY;

procedure TRANSFORM(U : in out REAL) is

use FACILITY; begin

U := F(U); ... end TRANSFORM;

begin -- TOP TRANSFORM(R); FACILITY.G(R, S); end TOP;

Тело пакета FACILITY и процедуру TRANSFORM можно представить в виде раздельно компилируемых субмодулей модуля ТОР. Тело процедуры G также может быть представлено как субмодуль модуля FACILITY.

Пример 3:

procedure TOP is

type REAL is digits 10; R, S : REAL :== 1.0; package FACILITY is

PI : constant := 3.14159_26536; function F (X : REAL) return REAL; procedure G (Y, Z : REAL); end FACILITY;

package body FACILITY is separate; procedure TRANSFORM (U : in out REAL) is separate;

begin -- TOP TRANSFORM(R); ... FACILITY.G(R, S): end TOP;

separate (TOP) procedure TRANSFORM(L) : in out REAL) is

use FACILITY; begin

U := F(U); ... end TRANSFORM;

separate (TOP) package body FACILITY is

-— предшествуют некоторые локальные описания function F(X : REAL) return REAL is

begin

-- последовательность операторов функции F ... end F;

procedure G (Y, Z : REAL) is separate; -- след тела G

end FACILITY;

with TEXT_IO; separate (TOP.FACILITY) -- полное имя пакета FACILITY procedure G(Y, Z : REAL) is

--использующие ТЕХТ_Ю локальные процедуры begin

-- последовательность операторов процедуры G ... end G;

В этом примере TRANSFORM и FACILITYявляются субмодулями процедуры TOP, а G -субмодулем пакета FACILITY. Видимость в этом пакете такая же, как и в предыдущем, с одним отличием : TEXT_IO используется только в G, по этому соответствующий спецификатор совместности написан для G, а не для процедуры TOP. В остальном видимость идентификаторов в соответствующих телах программ обеих версий одинакова.



Например, в соответствующем теле субмодуля G (непосредственно) видимы процедура TOP, тип REAL, переменные R и S, пакет FACILITY и содержащиеся в нем именнованое число PI и подпрограммы F и G.

Ссылки:

видимость 8.3, идентификатор 2.3, именованное число 3.2, компилируемый мо-Идуль 10.1, локальное описание 8.1, пакет 7.1, переменная 3.2.1, подпрограмма 6, процедура 6, |след тела 10.2, соответствующее тело 3.9, спецификатор совместности 10.1.1, тело пакета 7.1, |тело процедуры 6.3, тип 3.3.

Пред.  Уровень выше  След.

Глава 10.

СТРУКТУРА ПРОГРАММЫ И РЕЗУЛЬТАТ КОМПИЛЯЦИИ

 
Содержание  

10.3. ПОРЯДОК КОМПИЛЯЦИИ


Содержание раздела