Подключаемый модуль – файл, содержащий исходный текст на языке Pascal, имеющий определенную структуру, предназначенный для использования как в главной программе, так и в других подключаемых модулях. Использование заключается в подключении модуля в разделе uses, путем указания его имени.
2. Общая структура подключаемого модуля
Код Pascal
1
2
3
4
5
6
7
Unit <имя модуля>;
InterfaceImplementationEnd.
Структурно в подключаемом модуле можно выделить три раздела: 1) Интерфейсный раздел – interface (должен быть объявлен, может быть пустым) 2) Раздел реализаций – implementation (должен быть объявлен, может быть пустым) 3) Тело модуля – begin-end. (может отсутствовать)
2.1. Интерфейсный раздел.
Интерфейсный раздел – область подключаемого модуля, начинающаяся с ключевого слова interface и заканчивающаяся ключевым словом implementation, которая может содержать: - список подключаемых модулей; - константы; - пользовательские типы данных; - переменные; - прототипы процедур и функций, доступные из места подключения данного модуля.
Замечание 1: переменные, объявленные в разделе интерфейсов, являются глобальными. То есть существуют в любом месте программы, где подключен данный модуль, в том числе в разделе реализации самого модуля. Замечание 2: как и в программе, вышеперечисленные секции (объявления констант, переменных и др., за исключением секции uses) в данном разделе могут быть расположены в любой последовательности и в любом количестве. Замечание 3: если в данном разделе объявляются прототипы процедур/функций, то их реализации должны гарантированно присутствовать в разделе implementation.
Основное назначение: определяет общедоступные данные/функционал для применения из программы или модуля, использующих данный модуль.
Раздел реализаций – область подключаемого модуля, начинающаяся с ключевого слова implementation и заканчивающаяся телом модуля (если таковое имеется) или ключевым словом end с точкой, означающим конец модуля, в которой располагаются реализации процедур и функций, объявленных в интерфейсном разделе, которая может содержать: - список подключаемых модулей; - константы; - пользовательские типы данных; - переменные; - процедуры и функции, необходимые для реализации процедур/функций, объявленных в интерфейсном разделе.
Основное назначение: реализация процедур и функций, описанных в секции interface.
Замечание 1: при реализации процедур и функций, описанных в интерфейсной секции, их заголовки могут быть описаны в сокращенной форме. Исключение - PascalABC: при использовании переменных заголовка в тексте реализации возникает ошибка компиляции.
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;
BeginIf a>b then GetMax:=a
Else GetMax:=b;
End;
End.
2.3. Тело модуля.
Тело модуля – последняя область подключаемого модуля, образуемая парой ключевых слов: «begin» и «end.», в которой можно размещать программный код аналогично главной программе. Тело модуля может отсутствовать. В таком случае ключевое слово «begin» не пишется, а «end.» сигнализирует о конце модуля.
Основное назначение: инициализация переменных модуля, выделение ресурсов, необходимых для его работы и т.д.
Unit DemoUnit;
InterfaceConst
N=50;
Var
Roots:array[1..N]ofreal;
ImplementationUses
Math;
Var
I:integer;
{тело модуля}BeginFor i:=1to 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 с точкой.
Основное назначение: освобождение ресурсов, выделенных для работы модуля.
unit DemoUnit;
interfacevar
a:array[1..20]of ^integer;{массив указателей}implementation{выделение памяти и инициализация значениями}procedure AllocateArray;
var
i:integer;
beginfor i:=1to20dobeginNew(a[i]);
a[i]^:=i;
end;
end;
{освобождение памяти}procedure DeallocateArray;
var
i:integer;
beginfor i:=1to20doDispose(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 ускорение компиляции достигается только за счет того, что отсутствует необходимость проводить синтаксический и семантический анализ.
Вывод: откомпилированные версии исполняемых модулей не совместимы между различными компиляторами.
Свайно-ростверковый фундамент: как спроектировать и возвести надежную конструкцию А еще свайно-ленточный фундамент (его еще называют так) отлично справляется со своей задачей на склонах, участках с неровным рельефам и на неустойчивом грунте. Если баня планируется массивная и не с одним этажом – как раз такой нулевой уровень выдержит все. http://brus.club/stati/fundament/8606-svajno-rostverkovyj-fundament - Свайно-ростверковый фундамент читать полностью