Модули (Units)

Модуль (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?

Синтаксическая структура модуля unit Pascal отличается от структуры программы 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.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *