Difference between revisions of "Unit/ru"

From Lazarus wiki
(Created page with "{{Unit}} Back to Reserved words. A <syntaxhighlight lang="pascal" enclose="none">unit</syntaxhighlight> is a source code file (or the binary...")
 
(See also)
 
(8 intermediate revisions by the same user not shown)
Line 2: Line 2:
  
  
Back to [[Reserved words]].
+
Назад к [[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" enclose="none">unit</syntaxhighlight> is a [[Source code|source code]] file (or the [[Binary|binary]] compiled from that [[File|file]]) which was written using the [[Pascal]] programming language, and that is designed to be a single module in an [[Application|application]] or an [[Object module|object module]]. <syntaxhighlight lang="pascal" enclose="none">Unit</syntaxhighlight> is a [[Reserved word|reserved word]].
+
== Назначение ==
  
== Purpose ==
+
Модуль может использоваться там, где функциональность должна быть предоставлена прикладной программе или другим модулям. Он позволяет писать код, который выполняет эту функцию один раз и может использоваться во многих местах. Это может снизить вероятность ошибок и увеличить повторное использование кода.
  
A unit may be used where functionality needs to be provided to an application program or to other units. It allows writing code that performs that functionality once and have it used in many places.
+
Двоичный модуль может использоваться, когда автор модуля желает предоставить определенные функции для использования в [[Program|программе]] языка Паскаль, но не желает предоставлять исходный код, который выполняет эти функции.
This can reduce the possibility of errors and increase code reusage.
 
  
A binary unit may be used where a unit author wishes to provide certain functionality to be used in a Pascal [[Program|program]] but does not wish to provide the source code that performs that functionality.
+
Модули также использовались в более старых версиях Паскаля, когда на компьютерах с ограниченными ресурсами было необходимо иметь возможность загружать [[Routine|подпрограммы]] по мере необходимости, а не хранить каждую подпрограмму [[Executable program|исполняемой программы]] в памяти все время.
  
Units were also used on older versions of Pascal when it was necessary on computers with limited resources to be able to load [[Routine|routines]] as needed rather than keeping every routine of the [[Executable program|executable program]] in memory all of the time.
+
Модуль, которому требуется доступ, например, [[Procedure|процедуры]] и [[Data type|типы данных]] в другом модуле, должен указывать те модули, к которым он должен получить доступ, в разделе [[Uses|<syntaxhighlight lang="pascal" enclose="none">uses</syntaxhighlight>]] (но связывание выполняется без необходимости писать make-файл, как в C).
A unit that needs to access e.&nbsp;g.&nbsp;[[Procedure|procedures]] and [[Data type|data types]] in another unit must specify those units it needs to access in a [[Uses|<syntaxhighlight lang="pascal" enclose="none">uses</syntaxhighlight> statement]] (but linking is done without the need to write a makefile as in C).
 
  
A unit may also be used to declare a series of global [[Const|constants]] or [[Global variables|variables]] for use by the entire application, without actually containing any executable code.
+
Модуль также можно использовать для объявления серии глобальных [[Const|констант]] или [[Global variables|переменных]] для использования всем приложением без фактического содержания исполняемого кода. Это похоже на [[Keyword/ru|ключевое слово]] <syntaxhighlight lang="Fortran" enclose="none">common</syntaxhighlight> в языке программирования [[Fortran]].
This is similar to the <syntaxhighlight lang="Fortran" enclose="none">common</syntaxhighlight> [[Keyword|keyword]] in the [[Fortran]] programming language.
 
  
== Format ==
+
== Формат ==
  
A unit is defined with the <syntaxhighlight lang="pascal" enclose="none">unit</syntaxhighlight> keyword followed by the unit-identifier.
+
Модуль задается с помощью ключевого слова <syntaxhighlight lang="pascal" enclose="none">unit</syntaxhighlight>, за которым следует идентификатор модуля. Идентификатор модуля (в следующем примере имя модуля - «minimalunit») должен соответствовать имени файла, в котором он записан. Минимальный рабочий пример (который ничего не делает):
The unit-identifier (in the following example the unit's name is “minimalunit”) should match the filename it is written in.
 
A minimal working example (which does nothing) is:
 
  
 
<syntaxhighlight lang="pascal">
 
<syntaxhighlight lang="pascal">
 
unit minimalunit;
 
unit minimalunit;
 
interface
 
interface
// here comes stuff that the unit publicly offers
+
        // здесь функционал, которые модуль публикует открыто
 
implementation
 
implementation
// here comes the implementation of offered stuff and
+
        // здесь идет реализация предлагаемого функционала и,
// optionally internal stuff (only known in the unit)
+
        // возможно, внутреннего функционала (видимого только внутри модуля)
 
end.
 
end.
 
</syntaxhighlight>
 
</syntaxhighlight>
  
where the part after [[Interface|<syntaxhighlight lang="pascal" enclose="none">interface</syntaxhighlight> ]]corresponds to the <syntaxhighlight lang="java" enclose="none">public</syntaxhighlight>-part of other languages and [[Implementation|<syntaxhighlight lang="pascal" enclose="none">implementation</syntaxhighlight>]] does so to <syntaxhighlight lang="java" enclose="none">private</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>.  
  
A more advanced basic structure is:
+
Более продвинутая базовая структура:
  
 
<syntaxhighlight lang="pascal">
 
<syntaxhighlight lang="pascal">
Line 47: Line 43:
  
 
initialization
 
initialization
// here may be placed code that is
+
        // здесь может быть размещен код,
// executed as the unit gets loaded
+
        // который выполняется при загрузке модуля
 
 
 
finalization
 
finalization
// code executed at program end
+
// код, выполняемый по окончании программы
  
 
end.
 
end.
 
</syntaxhighlight>
 
</syntaxhighlight>
  
The optional [[Initialization|<syntaxhighlight lang="pascal" enclose="none">initialization</syntaxhighlight>]] and [[Finalization|<syntaxhighlight lang="pascal" enclose="none">finalization</syntaxhighlight>]] blocks may be followed by code that is executed on program start/end.
+
Необязательные разделы [[Initialization|<syntaxhighlight lang="pascal" enclose="none">initialization</syntaxhighlight>]] и [[Finalization|<syntaxhighlight lang="pascal" enclose="none">finalization</syntaxhighlight>]] могут следовать за кодом, который выполняется в начале/конце программы.
  
=== Detailed unit example ===
+
=== Подробный пример модуля ===
  
A step-by-step example:
+
Пошаговый пример:
  
 
<syntaxhighlight lang="pascal">
 
<syntaxhighlight lang="pascal">
 
unit randomunit;
 
unit randomunit;
// this unit does something
+
// этот модуль что-то делает
  
 
// public  - - - - - - - - - - - - - - - - - - - - - - - - -
 
// public  - - - - - - - - - - - - - - - - - - - - - - - - -
Line 70: Line 65:
  
 
type
 
type
// the type TRandomNumber gets globally known
+
        // тип TRandomNumber становится видимым глобально,
// since it is included somewhere (uses-statement)
+
        // поскольку он где-то подключен (в операторе uses)
 
TRandomNumber = integer;
 
TRandomNumber = integer;
  
// of course the const- and var-blocks are possible, too
+
// конечно, возможны блоки const и var, также
 
+
// список сигнатур процедур/функций делает
// a list of procedure/function signatures makes
+
// их доступными вовне модуля
// them useable from outside of the unit
 
 
function getRandomNumber(): TRandomNumber;
 
function getRandomNumber(): TRandomNumber;
  
// an implementation of a function/procedure
+
// реализация функции/процедуры
// must not be in the interface-part
+
// не должна находиться в разделе interface
  
 
// private - - - - - - - - - - - - - - - - - - - - - - - - -
 
// private - - - - - - - - - - - - - - - - - - - - - - - - -
Line 87: Line 81:
  
 
var
 
var
// var in private-part
+
        // var разделе private  
// => only modifiable inside from this unit
+
        // => может изменяться только внутри этого модуля
 
chosenRandomNumber: TRandomNumber;
 
chosenRandomNumber: TRandomNumber;
  
 
function getRandomNumber(): TRandomNumber;
 
function getRandomNumber(): TRandomNumber;
 
begin
 
begin
// return value
+
// возвращаем значение
 
getRandomNumber := chosenRandomNumber;
 
getRandomNumber := chosenRandomNumber;
 
end;
 
end;
  
// initialization is the part executed
+
// раздел initialization - это часть, выполняемая
// when the unit is loaded/included
+
// при загрузке/включении модуля
 
initialization
 
initialization
 
begin
 
begin
// choose our random number
+
// выбираем наше случайное число
 
chosenRandomNumber := 3;
 
chosenRandomNumber := 3;
// chosen by fair-dice-roll
+
    // выбранное броском игральной кости,
// guaranteed to be random
+
    // гарантированно случайное
 
end;
 
end;
  
// finalization is worked off at program end
+
// finalization запускается по окончанию программы
 
finalization
 
finalization
 
begin
 
begin
// this unit says 'bye' at program halt
+
// этот модуль говорит "пока" по завершению программы
writeln('bye');
+
writeln('пока');
 
end;
 
end;
 
end.</syntaxhighlight>
 
end.</syntaxhighlight>
  
To include a unit just use the <syntaxhighlight lang="pascal" enclose="none">uses</syntaxhighlight>-statement.
+
Чтобы подключить модуль, просто используйте оператор <syntaxhighlight lang="pascal" enclose="none">uses</syntaxhighlight>.
 
<syntaxhighlight lang="pascal" highlight="2-4">
 
<syntaxhighlight lang="pascal" highlight="2-4">
 
program chooseNextCandidate;
 
program chooseNextCandidate;
 
uses
 
uses
// include a unit
+
// подключение модуля
 
randomunit;
 
randomunit;
  
 
begin
 
begin
writeln('next candidate: no. ' + getRandomNumber());
+
writeln('следующий кандидат: . ' + getRandomNumber());
 
end.
 
end.
 
</syntaxhighlight>
 
</syntaxhighlight>
  
When compiling, FPC checks this program for unit dependencies.
+
При компиляции FPC проверяет эту программу на зависимости модулей. Он должен быть в состоянии найти модуль "randomunit".  
It has to be able to find the unit "randomunit".
 
  
The simplest way to satisfy this is to have a unit whose name matches the file name it is written in (appending <tt>.pas</tt> is OK and encouraged).
+
Самый простой способ удовлетворить это - иметь модуль, имя которого совпадает с именем файла, в котором он записан (добавление <tt>.pas</tt> - это нормально и приветствуется). Файл модуля может находиться в том же каталоге, где находится исходник программы, или в пути к модулю, по которым FPC ищет модули.
The unit file may be in the same directory where the program source is in or in the unit path FPC looks for units.
 
  
== Unit precedence ==
+
== Приоритетность модуля ==
  
When multiple units are described in a use clause, conflicts can occur with identifiers (procedures, types, functions etc.) that have the same name in multiple units.
+
Когда в разделе uses описано несколько модулей, могут возникнуть конфликты с идентификаторами (процедурами, типами, функциями и т.д.), которые имеют одно и то же имя в нескольких модулях. В FreePascal последний упомянутый модуль становится «победителем» и предоставляет код для модуля, в который он включен.
In FreePascal, the last unit “wins” and provides the code for the unit.
 
  
If you want to achieve a different behavior, you can explicitly prepend <tt>''unitname.''identifier</tt> to specify the unit you want to use, or reorder the units. The former is often the clearest option.
+
Если вы хотите добиться другого поведения, вы можете явно добавить <tt>''unitname.''identifier</tt>, чтобы указать модуль, который вы хотите использовать, или изменить порядок модулей. Первый вариант часто оказывается наиболее очевидным.
  
 
<syntaxhighlight lang="pascal">
 
<syntaxhighlight lang="pascal">
Line 153: Line 144:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
Specifying the unit of declaration explicitly:
+
Явное указание объявленного модуля:
  
 
<syntaxhighlight lang="Pascal">
 
<syntaxhighlight lang="Pascal">
Line 162: Line 153:
  
 
type
 
type
   // we already loaded a declaration of "basisType"
+
   // мы уже загрузили объявление "basicType"  
   // from the interestCalculations unit, but we're
+
   // из модуля InterestCalculations, но мы снова
   // re-declaring it here again ("shadowing")
+
   // переобъявляем его здесь ("затенение")
 
   basisType = extended;
 
   basisType = extended;
  
 
var
 
var
   // last declaration wins: originalCapital is an extended
+
   // последнее объявление приоритетнее: originalCapital является расширенным
 
   originalCapital: basisType;
 
   originalCapital: basisType;
   // specify a scope to use the declaration valid there
+
   // указываем область, в которой будет использоваться корректное объявление
 
   monthlyMargin: interestCalculations.basisType;
 
   monthlyMargin: interestCalculations.basisType;
  
Line 177: Line 168:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
Note, the <tt>interestCalculations</tt> unit will still perform its own calculations with its own <tt>basisType</tt> (here [[Currency|<syntaxhighlight lang="pascal" enclose="none">currency</syntaxhighlight>]]). You can only alter (“shadow”) declarations in the current [[Scope|scope]] (and descending).
+
Обратите внимание, что модуль <tt>interestCalculations</tt> по-прежнему будет выполнять свои собственные вычисления со своим собственным <tt>basisType</tt> (здесь [[Currency/ru|<syntaxhighlight lang="pascal" enclose="none">currency</syntaxhighlight>]]). Вы можете изменять («тень») объявления только в текущей [[Scope|области видимости]] (и по убыванию).
  
== See also ==
+
== См.также ==
  
 
* [https://www.freepascal.org/docs-html/ref/refsu91.html “Unit scope” in the “reference guide”] (FPC HTML documentation)
 
* [https://www.freepascal.org/docs-html/ref/refsu91.html “Unit scope” in the “reference guide”] (FPC HTML documentation)
 
* [https://www.freepascal.org/docs-html/user/userse11.html “Compiling a unit” in the “users's guide”] (FPC HTML documentation)
 
* [https://www.freepascal.org/docs-html/user/userse11.html “Compiling a unit” in the “users's guide”] (FPC HTML documentation)
 
*  [https://en.wikibooks.org/wiki/Pascal_Programming/Units § “Units” in the WikiBook “Pascal Programming”]
 
*  [https://en.wikibooks.org/wiki/Pascal_Programming/Units § “Units” in the WikiBook “Pascal Programming”]

Latest revision as of 13:50, 1 September 2020

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). Вы можете изменять («тень») объявления только в текущей области видимости (и по убыванию).

См.также