Подключаемые модули

Подключаемые модули.

1. Основные положения

Подключаемый модуль

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

Использование заключается в подключении модуля в разделе uses, путем указания его имени.

2. Общая структура подключаемого модуля

PascalВыделить код

1
2
3
4
5
6
7

Unit <имя модуля>;
 
Interface
 
Implementation
 
End.

Структурно в подключаемом модуле можно выделить три раздела:

1) Интерфейсный раздел – interface

2) Раздел реализаций – implementation

3) Тело модуля – begin-end.

2.1. Интерфейсный раздел.

Интерфейсный раздел

– область подключаемого модуля, начинающаяся с ключевого слова interface и заканчивающаяся ключевым словом implementation, которая может содержать:

- список подключаемых модулей;

- константы;

- пользовательские типы данных;

- переменные;

- прототипы процедур и функций,

доступные из места подключения данного модуля.

Замечание 1:

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

Замечание 2:

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

Замечание 3:

если в данном разделе объявляются прототипы процедур/функций, то их реализации должны гарантированно присутствовать в разделе implementation.

Основное назначение:

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

Пример интерфейсного раздела:

PascalВыделить код

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

Interface
 
{подключаемые модули}
Uses
  AnotherUnit;
 
{константы}
Const
  PI=3.14159265;
  E=2.71828182;
 
{пользовательские типы данных}
Type
  TMyType=array[-3..7] of real;
 
{переменные}
Var
  temp:TMyType;
 
{процедуры и функции}
Procedure Fill(var x:TMyType);
Function Find(const x:TMyType; const Value:real):Boolean;
 
Implementation

2.2. Раздел реализаций.

Раздел реализаций

– область подключаемого модуля, начинающаяся с ключевого слова implementation и заканчивающаяся телом модуля (если таковое имеется) или ключевым словом end с точкой, означающим конец модуля, в которой располагаются реализации процедур и функций, объявленных в интерфейсном разделе, которая может содержать:

- список подключаемых модулей;

- константы;

- пользовательские типы данных;

- переменные;

- процедуры и функции,

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

Основное назначение:

реализация процедур и функций, описанных в секции interface.

Замечание 1:

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

Пример 1 (заголовки в сокращенной форме):

PascalВыделить код

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

Unit DemoUnit;
 
Interface
 
{прототип процедуры}
Procedure Swap(var a,b:integer);
 
Implementation
 
{реализация процедуры}
Procedure Swap;
Var
  Temp:integer;
Begin
  Temp:=a;
  a:=b;
  b:=Temp;
end;
 
end.

Пример 2 (заголовки в полной форме):

PascalВыделить код

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

Unit DemoUnit;
 
interface
 
{прототип функции}
Function GetMax(a,b:integer):integer;
 
Implementation
 
{реализация функции}
Function GetMax(a,b:integer):integer;
Begin
  If a>b then GetMax:=a
  Else GetMax:=b;
End;
 
End.

2.3. Тело модуля.

Тело модуля

– последняя область подключаемого модуля, образуемая парой ключевых слов: «begin» и «end.», в которой можно размещать программный код аналогично главной программе.

Тело модуля может отсутствовать. В таком случае ключевое слово «begin» не пишется, а «end.» сигнализирует о конце модуля.

Основное назначение:

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

Пример модуля, содержащего тело:

PascalВыделить код

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

Unit DemoUnit;
 
Interface
 
Const
  N=50;
 
Var
  Roots:array[1..N] of real;
 
Implementation
 
Uses
  Math;
 
Var
  I:integer;
 
{тело модуля}
Begin
  For i:=1 to N do Roots[i]:=sqrt(i);
End.

Пример модуля без тела: (см. пример модуля для заголовков в полной форме).

Замечание 1:

Программный код, размещенный в теле модуля, выполняется один раз – при загрузке модуля, до начала исполнения кода главной программы.

Замечание 2:

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

2.4. Дополнительные разделы в структуре модуля.

Компиляторы Free Pascal, Pascal ABC, Pascal ABC.Net допускают помимо перечисленных выше еще два раздела:

- раздел инициализации

- раздел финализации.

2.4.1. Раздел инициализации.

Раздел инициализации

– область подключаемого модуля, размещаемая после по окончании раздела реализаций, начинающаяся с ключевого слова initialization и заканчивающаяся разделом финализации, если таковой имеется, или ключевым словом end с точкой. Назначение аналогично телу модуля.

2.4.2. Раздел финализации.

Раздел финализации

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

Основное назначение:

освобождение ресурсов, выделенных для работы модуля.

Пример:

PascalВыделить код

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36

unit DemoUnit;
 
interface
 
var
  a:array[1..20] of ^integer;{массив указателей}
 
implementation
 
{выделение памяти и инициализация значениями}
procedure AllocateArray;
var
  i:integer;
begin
  for i:=1 to 20 do
  begin
    New(a[i]);
    a[i]^:=i;
  end;
end;
 
{освобождение памяти}
procedure DeallocateArray;
var
  i:integer;
begin
  for i:=1 to 20 do Dispose(a[i]);
end;
 
initialization
  AllocateArray;{инициализация - начало работы - выделяем память}
 
finalization
  DeallocateArray;{финализация - конец работы - осовобождаем память}
 
end.

Замечание 1:

программный код, размещаемый в перечисленных разделах, исполняется один раз. Код разделов инициализации – до начала исполнения кода главной программы, код разделов финализации – после.

Замечание 2:

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

3. Компиляция модулей.

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

3.1. Компиляция в Turbo Pascal.

Результатом компиляции подключаемого модуля в Turbo Pascal-е является *.tpu – файл (Turbo Pascal Compiled Unit), представляющий собой машинное представление данных и кода, размещенных в нем.

3.2. Компиляция в Free Pascal.

Результатом компиляции подключаемого модуля в Free Pascal-е являются два файла: *.ppu – файл, содержащий интерфейсную часть модуля, и файл *.o - объектный файл, содержащий часть реализаций. Причем последний необходим для компоновки приложения.

3.3. Компиляция в Pascal ABC.Net.

В отличие от перечисленных выше сред в Pascal ABC.Net в процессе компиляции модуля не генерируется код на машинном языке. Компилятор данной среды завершает свою работу после выполнения семантического анализа, сохраняя семантическое дерево модуля в промежуточный формат - *.pcu – файл, который в первом приближении можно считать результатом компиляции с обозначенными ограничениями.

3.4. Ускорение компиляции программ.

На этапе компоновки приложения, компоновщик собирает исполняемый модуль, принимая на вход объектные модули. Таким образом, имея уже откомпилированные подключаемые модули, компиляция программ с их использованием ускоряется, так как они уже обработаны. Данное справедливо для Turbo и Free Pascal-ей. Однако, в Pascal ABC.Net ускорение компиляции достигается только за счет того, что отсутствует необходимость проводить синтаксический и семантический анализ.

Вывод:

откомпилированные версии исполняемых модулей не совместимы между различными компиляторами.