Модуль (Unit) объединяет общие объявления типов, функций, процедур, констант и переменных для вызова из других модулей или основной программы, это аналог модулей / пакетов в других языках программирования.
Создание модуля
Модуль состоит из двух основных блоков:
Блок interface (интерфейс): Публичный код, доступный напрямую после подключения из других файлов;
Блок implementation (реализация): Внутренний закрытый код, виден только в текущем модуле, извне вызвать его нельзя.
Пример
Создайте файл MyUnit.pas для написания одного модуля.
unit MyUnit;
{$ifdef FPC}
{$mode objfpc}{$H+}{$J-}
{$endif}
// Блок интерфейса: публичные объявления
interface
procedure MyProcedure(const A: Integer);
function MyFunction(const S: string): string;
// Блок реализации: закрытый код
implementation
procedure MyProcedure(const A: Integer);
begin
WriteLn('A + 10 is: ', A + 10);
end;
function MyFunction(const S: string): string;
begin
Result := S + 'strings are automatically managed';
end;
end.Code language: JavaScript (javascript)

Внимательный читатель заметит, что в конце конструкция end. не имеет соответствующего begin?
Синтаксическая структура модуля
unitPascal отличается от структуры программыprogram
programОсновная программа: требует блокаbegin ... end.как точку входа в выполнение
unitМодуль: глобальный begin не требуетсяЛюбой модуль заканчивается на
end.(точка означает конец файла, соответствующего глобального begin нет)
- В блоке
interfaceописываются прототипы функций/процедур, типы, константы, глобальные переменные; внешние файлы могут вызывать их после директивыuses; - В блоке
implementationразмещается полная реализация функций; локальные процедуры и закрытые переменные здесь не видны из других модулей; - Файл модуля начинается с
unit Имя;и заканчивается наend..
Подключение модулей в основной программе
Наш файл основной программы — mydemo.pas
Загрузите пользовательские модули с помощью ключевого слова uses
{$ifdef FPC} {$mode objfpc}{$H+}{$J-} {$endif}
{$ifdef MSWINDOWS} {$apptype CONSOLE} {$endif}
program MyProgram;
// Подключить пользовательский модуль MyUnit
uses
MyUnit;
begin
WriteLn(MyFunction('Note: '));
MyProcedure(5);
ReadLn;
end.Code language: PHP (php)
Строка MyUnit; под uses указывает на имя модуля, а не на имя файла .pas.
Это имя указано в первой строке файла MyUnit.pas: unit MyUnit;
Имя файла и имя модуля могут не совпадать, но рекомендуется делать их одинаковыми. Если имена разные, в uses всё равно пишется имя модуля, не файла.

Теперь скомпилируйте и запустите; основная программа вызовет функции из модуля.

Скомпилируйте и запустите

После компиляции в папке проекта появятся два новых файла

.ppu (Pascal Unit File, файл метаданных компиляции модуля)
Создаётся только при компиляции файлов-модулей; основная программа program не генерирует файл .ppu
- Хранит скомпилированные метаданные блока
interfaceмодуля: прототипы функций, типы, константы, экспортируемые символы; - При подключении через
uses MyUnitкомпилятор не переразбирает весь исходный код MyUnit.pas, а сразу читает .ppu для быстрой проверки интерфейса; - Значительно ускоряет сборку крупных проектов; основной файл для инкрементальной компиляции FPC.
MyUnit.o: Бинарные машинные инструкции из скомпилированного MyUnit.pas (весь код блока реализации)
mydemo.o: Машинный код основной программы mydemo.pas
Компилятор сначала преобразует каждый .pas в отдельные бинарные объектные файлы .o; затем линкер объединяет все .o в исполняемый файл .exe.