Difference between revisions of "Unit/ru"

From Free Pascal wiki
Jump to navigationJump to search
 
Line 4: Line 4:
 
Назад к [[Reserved words/ru|Зарезервированным словам]].
 
Назад к [[Reserved words/ru|Зарезервированным словам]].
  
A <syntaxhighlight lang="pascal" enclose="none">Unit</syntaxhighlight> - это файл [[Source code| исходного кода]] (или [[Binary|двоичный]], скомпилированный из этого [[File|файла]]), который был написан с использованием языка программирования [[Pascal]] и разработан как отдельный модуль в [[Application|Приложении]] или [[Object module|Объектном модуле]]. Слово <syntaxhighlight lang="pascal" enclose="none">Unit</syntaxhighlight> - это [[Reserved word/ru| зарезервированное слово]].
+
A <syntaxhighlight lang="pascal" inline>Unit</syntaxhighlight> - это файл [[Source code| исходного кода]] (или [[Binary|двоичный]], скомпилированный из этого [[File|файла]]), который был написан с использованием языка программирования [[Pascal]] и разработан как отдельный модуль в [[Application|Приложении]] или [[Object module|Объектном модуле]]. Слово <syntaxhighlight lang="pascal" inline>Unit</syntaxhighlight> - это [[Reserved word/ru| зарезервированное слово]].
  
 
== Назначение ==
 
== Назначение ==
Line 14: Line 14:
 
Модули также использовались в более старых версиях Паскаля, когда на компьютерах с ограниченными ресурсами было необходимо иметь возможность загружать [[Routine|подпрограммы]] по мере необходимости, а не хранить каждую подпрограмму [[Executable program|исполняемой программы]] в памяти все время.
 
Модули также использовались в более старых версиях Паскаля, когда на компьютерах с ограниченными ресурсами было необходимо иметь возможность загружать [[Routine|подпрограммы]] по мере необходимости, а не хранить каждую подпрограмму [[Executable program|исполняемой программы]] в памяти все время.
  
Модуль, которому требуется доступ, например, [[Procedure|процедуры]] и [[Data type|типы данных]] в другом модуле, должен указывать те модули, к которым он должен получить доступ, в разделе [[Uses|<syntaxhighlight lang="pascal" enclose="none">uses</syntaxhighlight>]] (но связывание выполняется без необходимости писать make-файл, как в C).
+
Модуль, которому требуется доступ, например, [[Procedure|процедуры]] и [[Data type|типы данных]] в другом модуле, должен указывать те модули, к которым он должен получить доступ, в разделе [[Uses|<syntaxhighlight lang="pascal" inline>uses</syntaxhighlight>]] (но связывание выполняется без необходимости писать make-файл, как в C).
  
Модуль также можно использовать для объявления серии глобальных [[Const|констант]] или [[Global variables|переменных]] для использования всем приложением без фактического содержания исполняемого кода. Это похоже на [[Keyword/ru|ключевое слово]] <syntaxhighlight lang="Fortran" enclose="none">common</syntaxhighlight> в языке программирования [[Fortran]].
+
Модуль также можно использовать для объявления серии глобальных [[Const|констант]] или [[Global variables|переменных]] для использования всем приложением без фактического содержания исполняемого кода. Это похоже на [[Keyword/ru|ключевое слово]] <syntaxhighlight lang="Fortran" inline>common</syntaxhighlight> в языке программирования [[Fortran]].
  
 
== Формат ==
 
== Формат ==
  
Модуль задается с помощью ключевого слова <syntaxhighlight lang="pascal" enclose="none">unit</syntaxhighlight>, за которым следует идентификатор модуля. Идентификатор модуля (в следующем примере имя модуля - «minimalunit») должен соответствовать имени файла, в котором он записан. Минимальный рабочий пример (который ничего не делает):
+
Модуль задается с помощью ключевого слова <syntaxhighlight lang="pascal" inline>unit</syntaxhighlight>, за которым следует идентификатор модуля. Идентификатор модуля (в следующем примере имя модуля - «minimalunit») должен соответствовать имени файла, в котором он записан. Минимальный рабочий пример (который ничего не делает):
  
 
<syntaxhighlight lang="pascal">
 
<syntaxhighlight lang="pascal">
Line 32: Line 32:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
где часть после раздела [[Interface|<syntaxhighlight lang="pascal" enclose="none">interface</syntaxhighlight>]] соответствует <syntaxhighlight lang="java" enclose="none">public</syntaxhighlight>-части других языков и раздел [[Implementation|<syntaxhighlight lang="pascal" enclose="none">implementation</syntaxhighlight>]] делает это для <syntaxhighlight lang="java" enclose="none">private</syntaxhighlight>.  
+
где часть после раздела [[Interface|<syntaxhighlight lang="pascal" inline>interface</syntaxhighlight>]] соответствует <syntaxhighlight lang="java" inline>public</syntaxhighlight>-части других языков и раздел [[Implementation|<syntaxhighlight lang="pascal" inline>implementation</syntaxhighlight>]] делает это для <syntaxhighlight lang="java" inline>private</syntaxhighlight>.  
  
 
Более продвинутая базовая структура:
 
Более продвинутая базовая структура:
Line 51: Line 51:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
Необязательные разделы [[Initialization|<syntaxhighlight lang="pascal" enclose="none">initialization</syntaxhighlight>]] и [[Finalization|<syntaxhighlight lang="pascal" enclose="none">finalization</syntaxhighlight>]] могут следовать за кодом, который выполняется в начале/конце программы.
+
Необязательные разделы [[Initialization|<syntaxhighlight lang="pascal" inline>initialization</syntaxhighlight>]] и [[Finalization|<syntaxhighlight lang="pascal" inline>finalization</syntaxhighlight>]] могут следовать за кодом, который выполняется в начале/конце программы.
  
 
=== Подробный пример модуля ===
 
=== Подробный пример модуля ===
Line 109: Line 109:
 
end.</syntaxhighlight>
 
end.</syntaxhighlight>
  
Чтобы подключить модуль, просто используйте оператор <syntaxhighlight lang="pascal" enclose="none">uses</syntaxhighlight>.
+
Чтобы подключить модуль, просто используйте оператор <syntaxhighlight lang="pascal" inline>uses</syntaxhighlight>.
 
<syntaxhighlight lang="pascal" highlight="2-4">
 
<syntaxhighlight lang="pascal" highlight="2-4">
 
program chooseNextCandidate;
 
program chooseNextCandidate;
Line 168: Line 168:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
Обратите внимание, что модуль <tt>interestCalculations</tt> по-прежнему будет выполнять свои собственные вычисления со своим собственным <tt>basisType</tt> (здесь [[Currency/ru|<syntaxhighlight lang="pascal" enclose="none">currency</syntaxhighlight>]]). Вы можете изменять («тень») объявления только в текущей [[Scope|области видимости]] (и по убыванию).
+
Обратите внимание, что модуль <tt>interestCalculations</tt> по-прежнему будет выполнять свои собственные вычисления со своим собственным <tt>basisType</tt> (здесь [[Currency/ru|<syntaxhighlight lang="pascal" inline>currency</syntaxhighlight>]]). Вы можете изменять («тень») объявления только в текущей [[Scope|области видимости]] (и по убыванию).
  
 
== См.также ==
 
== См.также ==

Latest revision as of 16:14, 6 August 2022

Deutsch (de) English (en) español (es) suomi (fi) français (fr) português (pt) русский (ru)


Назад к Зарезервированным словам.

A Unit - это файл исходного кода (или двоичный, скомпилированный из этого файла), который был написан с использованием языка программирования Pascal и разработан как отдельный модуль в Приложении или Объектном модуле. Слово Unit - это зарезервированное слово.

Назначение

Модуль может использоваться там, где функциональность должна быть предоставлена прикладной программе или другим модулям. Он позволяет писать код, который выполняет эту функцию один раз и может использоваться во многих местах. Это может снизить вероятность ошибок и увеличить повторное использование кода.

Двоичный модуль может использоваться, когда автор модуля желает предоставить определенные функции для использования в программе языка Паскаль, но не желает предоставлять исходный код, который выполняет эти функции.

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

Модуль, которому требуется доступ, например, процедуры и типы данных в другом модуле, должен указывать те модули, к которым он должен получить доступ, в разделе uses (но связывание выполняется без необходимости писать make-файл, как в C).

Модуль также можно использовать для объявления серии глобальных констант или переменных для использования всем приложением без фактического содержания исполняемого кода. Это похоже на ключевое слово common в языке программирования Fortran.

Формат

Модуль задается с помощью ключевого слова unit, за которым следует идентификатор модуля. Идентификатор модуля (в следующем примере имя модуля - «minimalunit») должен соответствовать имени файла, в котором он записан. Минимальный рабочий пример (который ничего не делает):

unit minimalunit;
interface
        // здесь функционал, которые модуль публикует открыто
implementation
        // здесь идет реализация предлагаемого функционала и, 
        // возможно, внутреннего функционала (видимого только внутри модуля)
end.

где часть после раздела interface соответствует public-части других языков и раздел implementation делает это для private.

Более продвинутая базовая структура:

unit advancedunit;
interface

implementation

initialization
        // здесь может быть размещен код, 
        // который выполняется при загрузке модуля
finalization
	// код, выполняемый по окончании программы

end.

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

Подробный пример модуля

Пошаговый пример:

unit randomunit;
// этот модуль что-то делает

// public  - - - - - - - - - - - - - - - - - - - - - - - - -
interface

type
        // тип TRandomNumber становится видимым глобально,
        // поскольку он где-то подключен (в операторе uses)
	TRandomNumber = integer;

// конечно, возможны блоки const и var, также 
// список сигнатур процедур/функций делает 
// их доступными вовне модуля
function getRandomNumber(): TRandomNumber;

// реализация функции/процедуры 
// не должна находиться в разделе interface

// private - - - - - - - - - - - - - - - - - - - - - - - - -
implementation

var
        // var разделе private 
        // => может изменяться только внутри этого модуля
	chosenRandomNumber: TRandomNumber;

function getRandomNumber(): TRandomNumber;
begin
	// возвращаем значение
	getRandomNumber := chosenRandomNumber;
end;

// раздел initialization - это часть, выполняемая 
// при загрузке/включении модуля
initialization
begin
	// выбираем наше случайное число
	chosenRandomNumber := 3;
    // выбранное броском игральной кости, 
    // гарантированно случайное
end;

// finalization запускается по окончанию программы 
finalization
begin
	// этот модуль говорит "пока" по завершению программы
	writeln('пока');
end;
end.

Чтобы подключить модуль, просто используйте оператор uses.

program chooseNextCandidate;
uses
	// подключение модуля
	randomunit;

begin
	writeln('следующий кандидат: №. ' + getRandomNumber());
end.

При компиляции FPC проверяет эту программу на зависимости модулей. Он должен быть в состоянии найти модуль "randomunit".

Самый простой способ удовлетворить это - иметь модуль, имя которого совпадает с именем файла, в котором он записан (добавление .pas - это нормально и приветствуется). Файл модуля может находиться в том же каталоге, где находится исходник программы, или в пути к модулю, по которым FPC ищет модули.

Приоритетность модуля

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

Если вы хотите добиться другого поведения, вы можете явно добавить unitname.identifier, чтобы указать модуль, который вы хотите использовать, или изменить порядок модулей. Первый вариант часто оказывается наиболее очевидным.

unit interestCalculations;

interface

type
  basisType = currency;

implementation

end.

Явное указание объявленного модуля:

program interestCalculator;

uses
   interestCalculations;

type
   // мы уже загрузили объявление "basicType" 
   // из модуля InterestCalculations, но мы снова 
   // переобъявляем его здесь ("затенение")
   basisType = extended;

var
   // последнее объявление приоритетнее: originalCapital является расширенным
   originalCapital: basisType;
   // указываем область, в которой будет использоваться корректное объявление
   monthlyMargin: interestCalculations.basisType;

begin
end.

Обратите внимание, что модуль interestCalculations по-прежнему будет выполнять свои собственные вычисления со своим собственным basisType (здесь currency). Вы можете изменять («тень») объявления только в текущей области видимости (и по убыванию).

См.также