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

13.2. порядок  компиляции

Правила и порядок компиляции модулей является непосредствен­ным следствием правил видимости.

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

Общие правила порядка компиляции:

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

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

3.  Субмодуль компилируется после компиляции своего родительского модуля.

 

перекомпиляции

Общие правила порядка перекомпиляции:

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

перекомпиляции

3.

перекомпиляции

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

4.

перекомпиляции

Изменение   родительского модуля   требует субмодуля.

5.

6.

Изменение      субмодуля   не      требует родительского модуля. Изменение      вторичного       модуля       не   влияет

на   другие

компилируемые модули, кроме субмоделей этого тела.

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

На порядок компиляции модет оказать влияние использование прагмы Inline , связанной с открытыми подстановками; также оптимизация, осуществляемая компилятором, и др.

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

При выполнении оптимизации компилятор может компилировать несколько модулей, тем самым создавая дальнейшую зависимость между этими модулями. Это может повлиять на перекомпиляцию.

Пример,

П Версия 1.

- -  файл  A.ada procedure  A is package   В is

- - вложенный пакет

end В;

package   body В is

156

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

end В; begin

end A;

На вход компилятора поступает один компилируемый модуль (файл A.ada). При любых изменениях в процедуре А , в специ­фикации или теле пакета В требуется перекомпиляция всей программы.

D Версия 2.

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

- - файл В.ada package В is

end В;

package body B is

end В;

- - основная   программа

- -      файл  A.ada with   В;   use В; procedure  A is begin

end A;

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

package body   В is    - - библиотечный  элемент (тело В )

end   В ; - - файл  A.ada with В; use В; procedure  A is

end   A;

Программа представлена в виде компилируемы модулей А (файл A.ada ), В ( файл B.ads ) и вторичного модуля В ( файл B.adb ). Первым компилируется файл A.ada , а затем - в любой последовательности остальные модули. Перекомпиляция : изменения в В. ads требуют перекомпиляции А.

- - родительский модуль

П Версия 4. - - файл  A.ada procedure  A is package  В  is

end В;

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

end A;

- -     файл     B.adb separate   (A) package   body В is

- - субмодуль с телом

end   В;

Программа представлена в виде двух компилируемых модулей. Первым компилируется пакет В (файла В. ada), а затем - процедура А (файл A.ada ). Перекомпиляция : изменения в пакете требуют перекомпиляции в основной программе; изменения в процедуре А не требуют перекомпиляции в пакете В.

П Версия 3.

- - файл  B.ads package   В  is

«   •   •

end    В;

- - файл  B.adb

- - библиотечный элемент (описание В )

Программа представлена в виде родительского модуля и субмодуля. Порядок компиляции - сначала родительский модуль (файл A.ada , а затем - субмодуль ( файл B.adb) . Перекомпиляция:

-   изменения   в   родительском   модуле      требуют   перекомпиляции субмодуля;

- изменения в субмодуле не   требуют перекомпиляции родительского модуля.

158

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