Модули в языке Паскаль.
1. Необходимость использования модулей.
Программа, написанная на языке Паскаль, состоит из главной программы и возможно нескольких модулей. Тексты главной программы и модулей размещаются в различных файлах. Выполнение всегда начинается с главной программы; операционная система осуществляет вызов того файла с расширением .ЕХЕ, который содержит код главной программы.
Использование процедур и функций в программе, написанной на языке Паскаль, позволяет четко организовать и структурировать такую программу. Однако, зачастую размер главной программы может резко увеличиться за счет расположенных в ней подпрограмм. Кроме того, распределение задач между программистами и программами затруднено за счет структурного и информационного объединения подпрограмм. И наконец, малейшие изменения в тексте программы приведет к ее повторной компиляции. Решение указанных проблем привело к появлению в составе языка особых структурных единиц – модулей. 
Модуль - это программная единица, допускающая автономную компиляцию. Выполнение модуля может инициироваться главной программой или другими модулями. Делается это с помощью вызова процедуры или функции, входящей в состав модуля. 
2.Структура модуля.
В языке Паскаль в состав модуля могут входить несколько процедур и функций. Исполняемый код модуля размещается в отдельном сегменте памяти, а не в сегменте главной программы.
Структура модуля напоминает структуру программы, хотя налицо и существенные различия.
	unit <имя модуля
Секция	interface
связи		uses <список_1 имен модулей>;
		<внешние объявления>
Секция	implementation
реализации		uses <список_2 имен модулей>;
		<внутренние объявления>
Секция	Begin
инициализации		<операторы>
	End.
Модуль обязательно начинается с ключевого слова unit, за которым следует идентификатор – имя модуля. 
Замечание.
Имя модуля обязательно должно совпадать с именем файла с расширением .pas, в котором хранится модуль.
Пример.
unit my_library хранится в файле my_library.pas
Завершается модуль, так же, как и главная программа, ключевым словом END с точкой.
Имя модуля служит для организации связи модуля с главной программой и другими модулями. Связь между модулями устанавливается с помощью оператора USES.
1.	Секция связи.
Секция связи начинается с оператора USES, следом за которым должны размещаться так называемые внешние объявления. Внешние объявления описывают элементы, которые считаются известными за пределами модуля. К ним относятся объявления типов, констант, переменных и подпрограмм. Таким образом, после uses мы должны указать имена стандартных или пользовательских модулей, с которыми данный модуль установит связь. Ресурсы этих модулей будут доступны в любой точке данного модуля.
При объявлении подпрограмм, т. е. процедур и функций, в секции связи указываются только их заголовки. Полные тексты процедур и функций, заголовки которых находятся в секции связи, размещаются в секции реализации.
Пример.
unit my_library;
	interface
		uses crt;
		const n=5, m=6;
		type mass = array [1..m] of integer;
		matr = array [1..n] of mass;
		procedure gen_1(a,b:integer; k:byte; var t:mass);
		procedure gen_2(a,b:integer; k,l:byte; var tt:matr);
		function prostoe(x: longint): boolean;
При таком описании из главной программы и из любого модуля, который подключает к себе модуль my_library, а кроме того, в любой точке модуля my_library будут доступны:
•	константы n и m;
•	типы mass и matr;
•	процедуры gen_1 и gen_2;
•	функция prostoe. 
2.	Секция реализации.
Секция реализации начинается с ключевого слова IMPLEMENTATION и обязательно включает полные тексты подпрограмм, описанных в секции связи.
Секция реализации может содержать оператор USES с набором внутренних объявлений модуля. Как обычно, в операторе USES указываются имена модулей. Внешние объявления этих модулей доступны в секции реализации: во-первых, они могут участвовать в формировании внутренних объявлений модуля и, во-вторых, могут использоваться при описании процедур и функций. 
В секции реализации в области внутренних объявлений можно описывать константы, типы, переменные, процедуры и функции. Эти объекты считаются известными во всех объектах секции реализации. Но внутренние объявления являются локальными, т. е. действуют только внутри того модуля, в котором они размещаются. Однако эти недоступные извне элементы могут использоваться глобальными процедурами и функциями, заголовки которых присутствуют в секции связи. 
Замечание.
Заголовок процедуры или функции в секции реализации должен либо полностью совпадать с заголовком этой же процедуры или функции в секции связи, либо содержать только имя процедуры или функции.
Пример.
implementation
	uses graph;
	const z=200; z1=300; z2=400;
	var str:string[20];
	function prostoe;
		var q:boolean; i, r: longint;
	begin
		q:=true;
		if x mod 2 =0 then q:=false;
		r:= trunk(sqrt(x));
		i:=3;
		while q and (i<=r) do
		if x mod i =0 then q:=false
		else i:=i+2;
		prostoe:=q
	end;
3.	Секция инициализации.
Заключительной секцией модуля, которая, впрочем, чаще всего отсутствует, является секция инициализации. Она начинается с ключевого слова BEGIN. Далее обычно следует последовательность операторов языка Паскаль. 
Секции инициализации всех модулей, входящих в программу, выполняются один раз перед началом работы главной программы. Они используются для подготовки главной программы и модулей к началу работы и могут включать операторы, осуществляющие присваивание начальных значений переменным, открытие файлов, дополнительные проверки паролей пользователей и т.п. 
В секции инициализации известными считаются внешние объявления секции связи, внутренние объявления секции реализации и внешние объявления всех модулей, имена которых присутствуют в операторах USES этого модуля.
Пример.
unit readfile;  
	interface 
	var t: text; 
	procedure display; 
	implementation 
	var fn:string; 
	procedure display; 
		var a:string; 
	begin
	readln(t,a);
	wr1teln(a) 
	end;
	Begin
	writeln('Введите имя файла');
readin(fn); 
assign(t,fn); 
reset(t)
End.
Пример главной программы:
Program P_1;
	uses readfile;
Begin
	display;
End.
4.	Организация связей между программными модулями.
Многомодульная программа в языке Паскаль имеет четко выраженную иерархическую структуру, которую также можно трактовать как сеть без циклов. Вершины такой сети могут быть упорядочены и распределены по уровням.
Рассмотрим пример программы, содержащей 5 модулей:

Uses A, B, D

Модуль E

Модуль D

Модуль С

Модуль A

Главная программа

Модуль В

Uses E

Uses C,D,E

Замечание.
В языке Паскаль недопустимы прямые и косвенные обращения модулей к самим себе!
1. Предположим, что в секции связи модуля C объявлена константа x. Эта константа будет размещена в сегменте данных программы до начала работы программы. Но, хотя она будет существовать в течение всего времени работы программы, из главной программы обратиться к ней невозможно, поскольку имени модуля C нет в операторе uses главной программы.
2. Пусть в главной программе и в секциях связи модулей A и D объявлена переменная од одним и тем же именем w. Понятно, что каждая из этих переменных доступна тому блоку, где описана. Однако, главной программе доступны и переменные из модулей A и D, только для обращения к ним надо использовать составные имена: A.w и D.w.
В модуле A доступна переменная из модуля D. Для работы с ней надо использовать имя D.w.

Главная программа
Uses A, D

D.w

A.w

w

w

Модуль A
Uses D

D.w

w

w

Модуль D

w

w

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