Difference between revisions of "Unit/ru"
Line 9: | Line 9: | ||
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> - это файл [[Source code| исходного кода]] (или [[Binary|двоичный]], скомпилированный из этого [[File|файла]]), который был написан с использованием языка программирования [[Pascal]] и разработан как отдельный модуль в [[Application|Приложении]] или [[Object module|Объектном модуле]]. Слово <syntaxhighlight lang="pascal" enclose="none">Unit</syntaxhighlight> - это [[Reserved word/ru| зарезервированное слово]]. | ||
− | == | + | == Назначение == |
− | + | Модуль может использоваться там, где функциональность должна быть предоставлена прикладной программе или другим модулям. Он позволяет писать код, который выполняет эту функцию один раз и может использоваться во многих местах. Это может снизить вероятность ошибок и увеличить повторное использование кода. | |
− | |||
− | + | Двоичный модуль может использоваться, когда автор модуля желает предоставить определенные функции для использования в [[Program|программе]] языка Паскаль, но не желает предоставлять исходный код, который выполняет эти функции. | |
− | + | Модули также использовались в более старых версиях Паскаля, когда на компьютерах с ограниченными ресурсами было необходимо иметь возможность загружать [[Routine|подпрограммы]] по мере необходимости, а не хранить каждую подпрограмму [[Executable program|исполняемой программы]] в памяти все время. | |
− | |||
− | + | Модуль, которому требуется доступ, например, [[Procedure|процедуры]] и [[Data type|типы данных]] в другом модуле, должен указывать те модули, к которым он должен получить доступ, в разделе [[Uses|<syntaxhighlight lang="pascal" enclose="none">uses</syntaxhighlight>]] (но связывание выполняется без необходимости писать make-файл, как в C). | |
− | + | ||
+ | Модуль также можно использовать для объявления серии глобальных [[Const|констант]] или [[Global variables|переменных]] для использования всем приложением без фактического содержания исполняемого кода. Это похоже на [[Keyword/ru|ключевое слово]] <syntaxhighlight lang="Fortran" enclose="none">common</syntaxhighlight> в языке программирования [[Fortran]]. | ||
== Format == | == Format == |
Revision as of 22:11, 31 August 2020
│
Deutsch (de) │
English (en) │
español (es) │
suomi (fi) │
français (fr) │
português (pt) │
русский (ru) │
Back to Зарезервированным словам.
A unit
is a source code file (or the binary compiled from that file) which was written using the Pascal programming language, and that is designed to be a single module in an application or an object module. Unit
is a reserved word.
A Unit
- это файл исходного кода (или двоичный, скомпилированный из этого файла), который был написан с использованием языка программирования Pascal и разработан как отдельный модуль в Приложении или Объектном модуле. Слово Unit
- это зарезервированное слово.
Назначение
Модуль может использоваться там, где функциональность должна быть предоставлена прикладной программе или другим модулям. Он позволяет писать код, который выполняет эту функцию один раз и может использоваться во многих местах. Это может снизить вероятность ошибок и увеличить повторное использование кода.
Двоичный модуль может использоваться, когда автор модуля желает предоставить определенные функции для использования в программе языка Паскаль, но не желает предоставлять исходный код, который выполняет эти функции.
Модули также использовались в более старых версиях Паскаля, когда на компьютерах с ограниченными ресурсами было необходимо иметь возможность загружать подпрограммы по мере необходимости, а не хранить каждую подпрограмму исполняемой программы в памяти все время.
Модуль, которому требуется доступ, например, процедуры и типы данных в другом модуле, должен указывать те модули, к которым он должен получить доступ, в разделе uses
(но связывание выполняется без необходимости писать make-файл, как в C).
Модуль также можно использовать для объявления серии глобальных констант или переменных для использования всем приложением без фактического содержания исполняемого кода. Это похоже на ключевое слово common
в языке программирования Fortran.
Format
A unit is defined with the unit
keyword followed by the unit-identifier.
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:
unit minimalunit;
interface
// here comes stuff that the unit publicly offers
implementation
// here comes the implementation of offered stuff and
// optionally internal stuff (only known in the unit)
end.
where the part after interface
corresponds to the public
-part of other languages and implementation
does so to private
.
A more advanced basic structure is:
unit advancedunit;
interface
implementation
initialization
// here may be placed code that is
// executed as the unit gets loaded
finalization
// code executed at program end
end.
The optional initialization
and finalization
blocks may be followed by code that is executed on program start/end.
Detailed unit example
A step-by-step example:
unit randomunit;
// this unit does something
// public - - - - - - - - - - - - - - - - - - - - - - - - -
interface
type
// the type TRandomNumber gets globally known
// since it is included somewhere (uses-statement)
TRandomNumber = integer;
// of course the const- and var-blocks are possible, too
// a list of procedure/function signatures makes
// them useable from outside of the unit
function getRandomNumber(): TRandomNumber;
// an implementation of a function/procedure
// must not be in the interface-part
// private - - - - - - - - - - - - - - - - - - - - - - - - -
implementation
var
// var in private-part
// => only modifiable inside from this unit
chosenRandomNumber: TRandomNumber;
function getRandomNumber(): TRandomNumber;
begin
// return value
getRandomNumber := chosenRandomNumber;
end;
// initialization is the part executed
// when the unit is loaded/included
initialization
begin
// choose our random number
chosenRandomNumber := 3;
// chosen by fair-dice-roll
// guaranteed to be random
end;
// finalization is worked off at program end
finalization
begin
// this unit says 'bye' at program halt
writeln('bye');
end;
end.
To include a unit just use the uses
-statement.
program chooseNextCandidate;
uses
// include a unit
randomunit;
begin
writeln('next candidate: no. ' + getRandomNumber());
end.
When compiling, FPC checks this program for unit dependencies. 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 .pas is OK and encouraged). 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. 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 unitname.identifier to specify the unit you want to use, or reorder the units. The former is often the clearest option.
unit interestCalculations;
interface
type
basisType = currency;
implementation
end.
Specifying the unit of declaration explicitly:
program interestCalculator;
uses
interestCalculations;
type
// we already loaded a declaration of "basisType"
// from the interestCalculations unit, but we're
// re-declaring it here again ("shadowing")
basisType = extended;
var
// last declaration wins: originalCapital is an extended
originalCapital: basisType;
// specify a scope to use the declaration valid there
monthlyMargin: interestCalculations.basisType;
begin
end.
Note, the interestCalculations unit will still perform its own calculations with its own basisType (here currency
). You can only alter (“shadow”) declarations in the current scope (and descending).
See also
- “Unit scope” in the “reference guide” (FPC HTML documentation)
- “Compiling a unit” in the “users's guide” (FPC HTML documentation)
- § “Units” in the WikiBook “Pascal Programming”