Difference between revisions of "Program/ru"
(5 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
{{Program}} | {{Program}} | ||
− | Понятие | + | Понятие '''программа''' означает либо [[Executable program/ru|исполняемая программа]], т.е. самодостаточное и запускаемое [[Application|приложение]], либо часть [[File|файла]] (файлов) с [[Source code|исходным кодом]] на языке [[Pascal]], который может быть скомпилирован и не объявлен в виде [[Unit|модуля]] или [[Library|библиотеки]]. Иногда оно называется главной программой. |
− | + | __TOC__ | |
− | |||
− | <syntaxhighlight lang=" | + | == Главная программа == |
− | program | + | |
+ | <syntaxhighlight lang="pascal" inline>program</syntaxhighlight> — это [[Reserved word|зарезервированное слово]], которое представляет файл с исходным кодом классической программы: | ||
+ | |||
+ | <syntaxhighlight lang="pascal" highlight="1"> | ||
+ | program hiWorld(input, output, stdErr); | ||
+ | |||
+ | begin | ||
+ | writeLn('Hi!'); | ||
+ | end. | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | Тем временем [[FPC]] ''отбрасывает'' заголовок программы, т.е. первую строку. Имя выходного файла определяется именем файла исходного кода. Однако имя программы ''становится'' зарезервированным [[Identifier|идентификатором]] (за исключением режимов <abbr title="International Organization for Standardization">ISO</abbr> [начиная с [FPC 3.3.1/trunk revision #45757; cf. {{MantisLink|37322}}]). В приведенном выше примере, например. попытка определить константу с именем <syntaxhighlight lang="pascal" inline>hiWorld</syntaxhighlight> вызовет ошибку [[Compile time|времени компиляции]] повторяющегося идентификатора. Имя программы идентифицирует глобальную [[Scope|область]], поэтому его можно использовать для записи полных идентификаторов. | ||
+ | |||
+ | Список файловых дескрипторов полностью игнорируется, за исключением [[Mode iso|<syntaxhighlight lang="pascal" inline>{$mode ISO}</syntaxhighlight>]]. [[Text/ru|<syntaxhighlight lang="pascal" inline>Текстовые</syntaxhighlight>]] [[Variable/ru|переменные]] {{Doc|package=RTL|unit=system|identifier=input|text=<syntaxhighlight lang="pascal" inline>input</syntaxhighlight>}}, {{Doc|package=RTL|unit=system|identifier=output|text=<syntaxhighlight lang="pascal" inline>output</syntaxhighlight>}} и {{Doc|package=RTL|unit=system|identifier=stderr|text=<syntaxhighlight lang="pascal" inline>stderr</syntaxhighlight>}} всегда открыты и их имена нельзя изменить в других режимах. (ср.: {{Doc|package=RTL|unit=system|identifier=sysinitstdio|text=<syntaxhighlight lang="pascal" inline>SysInitStdIO</syntaxhighlight>}} всегда вызывается в {{gitlab|tree|FPC|release_3_0_4/rtl/linux/system.pp#L367-L368|<tt>rtl/linux/system.pp</tt>}}) | ||
+ | |||
+ | Поэтому с помощью FPC следующий полный пример исходного кода компилируется так же, как и предыдущий пример. | ||
+ | |||
+ | <syntaxhighlight lang="pascal"> | ||
begin | begin | ||
− | + | writeLn('Hi!'); | |
end. | end. | ||
</syntaxhighlight> | </syntaxhighlight> | ||
+ | |||
+ | Если программа синтаксически верна, FPC игнорирует все, что идет после финального <syntaxhighlight lang="pascal" inline>end.</syntaxhighlight>. Следующее будет скомпилировано без проблем: | ||
+ | |||
+ | <syntaxhighlight lang="pascal"> | ||
+ | program awesomeProgram(input, output, stdErr); | ||
+ | begin | ||
+ | writeLn('Awesome!'); | ||
+ | end. Я благодарю маму, папу и всех, кто поддерживал меня в создании этой программы. | ||
+ | </syntaxhighlight> | ||
+ | Эта «функция» в основном используется для предоставления журнала изменений в файле или уведомления об авторских правах. | ||
+ | |||
+ | FPC не поддерживает несколько модулей в одном файле исходного кода, как это делали или делают некоторые другие компиляторы. Исходный код каждого модуля должен находиться в отдельном файле. Однако ограничение, согласно которому имена модулей должны совпадать с именами файлов, не применяется к программам. Это связано с тем, что программы не могут быть включены другими модулями, поэтому их поиск (по имени файла) не требуется. | ||
+ | |||
+ | == Структура программы == | ||
+ | |||
+ | Файл <syntaxhighlight lang="pascal" inline>program</syntaxhighlight> должен иметь определенную [[Basic_Pascal_Tutorial/Chapter_1/Program_Structure/ru|структуру]]. | ||
+ | |||
+ | # Заголовок программы (в зависимости от используемого компилятора, возможно, необязательный). | ||
+ | # Может быть не более одного раздела [[Uses|<syntaxhighlight lang="pascal" inline>uses</syntaxhighlight>-clause]], и оно должно быть в верхней части программы сразу после заголовка программы. | ||
+ | # Ровно один [[Block|блок]], заканчивающийся <syntaxhighlight lang="pascal" inline>end</syntaxhighlight>(обратите внимание на [[period#module end|period]]). Этот блок может содержать — в отличие от обычных блоков — раздел(ы) <syntaxhighlight lang="pascal" inline>resourcestring</syntaxhighlight>. | ||
+ | |||
+ | Точный порядок и количество различных разделов после (необязательного) предложения <syntaxhighlight lang="pascal" inline>uses</syntaxhighlight> до окончательного составного оператора [[Begin|<syntaxhighlight lang="pascal" inline>begin</syntaxhighlight>]]…[[End|<syntaxhighlight lang="pascal" inline>end</syntaxhighlight>]] строго не определен. | ||
+ | |||
+ | Тем не менее, есть некоторые правдоподобные соображения. | ||
+ | |||
+ | * Раздел [[Type|<syntaxhighlight lang="pascal" inline>type</syntaxhighlight>-section]] предшествует любому разделу, который может использовать типы, например,[[Var|<syntaxhighlight lang="pascal" inline>var</syntaxhighlight>]]-разделы или объявления [[Routine|подпрограмм]]. | ||
+ | * Поскольку [[Goto|<syntaxhighlight lang="pascal" inline>goto</syntaxhighlight>]] известен как "инструмент дьявола", раздел [[Label|<syntaxhighlight lang="pascal" inline>label</syntaxhighlight>]], если он есть, максимально близок к фрейму оператора, для которого он должен объявлять метки. | ||
+ | * Как правило, вы переходите от общего к частному: например, <syntaxhighlight lang="pascal" inline>var</syntaxhighlight>-раздел идет перед разделом [[Threadvar|<syntaxhighlight lang="delphi" inline>threadVar</syntaxhighlight>]]. Раздел [[Const|<syntaxhighlight lang="pascal" inline>const</syntaxhighlight>]] предшествует разделу [[Resourcestring|<syntaxhighlight lang="delphi" inline>resourceString</syntaxhighlight>]]. | ||
+ | * Разделы <syntaxhighlight lang="delphi" inline>resourceString</syntaxhighlight> могут быть как статическими, так и глобальными, что означает, что они должны появиться относительно скоро после предложения <syntaxhighlight lang="pascal" inline>uses</syntaxhighlight>. | ||
+ | * Прямое использование [[Global variables|глобальных переменных]] в подпрограммах (или даже простое их использование) считается дурным тоном. Вместо этого объявляйте/определяйте свои подпрограммы до любого <syntaxhighlight lang="pascal" inline>var</syntaxhighlight>-(подобного)-раздела. (осторожно: не рискуйте и задайте <syntaxhighlight lang="pascal" inline>{$writeableConst off}</syntaxhighlight>) | ||
+ | * [[global compiler directives|Глобальные директивы компилятора]], особенно те, которые разрешают или ограничивают то, что может быть написано (например, <syntaxhighlight lang="pascal" inline>{$goto on}</syntaxhighlight> позволяет использовать <syntaxhighlight lang="pascal" inline>goto</syntaxhighlight>) или неявно добавляют зависимости модулей, такие как [[Mode ObjFPC|<syntaxhighlight lang="pascal" inline>{$mode objFPC}</syntaxhighlight>]], должны появляться вскоре после заголовка программы. | ||
+ | |||
+ | Принимая во внимание все соображения, примерная структура программы должна выглядеть так (за исключением <syntaxhighlight lang="pascal" inline>label</syntaxhighlight> и [[sGoto|<syntaxhighlight lang="pascal" inline>{$goto on}</syntaxhighlight>]], которые упоминаются только для полноты картины): | ||
+ | |||
+ | <syntaxhighlight lang="delphi"> | ||
+ | program sectionDemo(input, output, stdErr); | ||
+ | |||
+ | // Глобальные директивы компилятора ---------------------------- | ||
+ | {$mode objFPC} | ||
+ | {$goto on} | ||
+ | |||
+ | uses | ||
+ | sysUtils; | ||
+ | |||
+ | const | ||
+ | answer = 42; | ||
+ | |||
+ | resourceString | ||
+ | helloWorld = 'Hello world!'; | ||
+ | |||
+ | type | ||
+ | primaryColor = (red, green, blue); | ||
+ | |||
+ | procedure doSomething(const color: primaryColor); | ||
+ | begin | ||
+ | end; | ||
+ | |||
+ | // M A I N ----------------------------------------------- | ||
+ | var | ||
+ | i: longint; | ||
+ | |||
+ | threadVar | ||
+ | z: longbool; | ||
+ | |||
+ | label | ||
+ | 42; | ||
+ | begin | ||
+ | end. | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | <small>[Пример сознательно игнорирует возможность «типизированных констант», придерживаясь скорее традиционных концепций, чем невольно сбивает с толку новичков.]</small> | ||
+ | |||
+ | == См.также == | ||
+ | |||
+ | * [[Unit|unit]] | ||
+ | * [[Library|library]] | ||
+ | * [[Program Structure|program structure]] in the Object Pascal Introduction series | ||
+ | * [https://en.wikibooks.org/wiki/Pascal_Programming/Beginning § “Beginning” in the ''Pascal Programming'' book on Wikibooks.org] |
Latest revision as of 18:09, 29 May 2022
│
Deutsch (de) │
English (en) │
suomi (fi) │
français (fr) │
Bahasa Indonesia (id) │
italiano (it) │
português (pt) │
русский (ru) │
Понятие программа означает либо исполняемая программа, т.е. самодостаточное и запускаемое приложение, либо часть файла (файлов) с исходным кодом на языке Pascal, который может быть скомпилирован и не объявлен в виде модуля или библиотеки. Иногда оно называется главной программой.
Главная программа
program
— это зарезервированное слово, которое представляет файл с исходным кодом классической программы:
program hiWorld(input, output, stdErr);
begin
writeLn('Hi!');
end.
Тем временем FPC отбрасывает заголовок программы, т.е. первую строку. Имя выходного файла определяется именем файла исходного кода. Однако имя программы становится зарезервированным идентификатором (за исключением режимов ISO [начиная с [FPC 3.3.1/trunk revision #45757; cf. Issue #37322]). В приведенном выше примере, например. попытка определить константу с именем hiWorld
вызовет ошибку времени компиляции повторяющегося идентификатора. Имя программы идентифицирует глобальную область, поэтому его можно использовать для записи полных идентификаторов.
Список файловых дескрипторов полностью игнорируется, за исключением {$mode ISO}
. Текстовые
переменные input
, output
и stderr
всегда открыты и их имена нельзя изменить в других режимах. (ср.: SysInitStdIO
всегда вызывается в rtl/linux/system.pp)
Поэтому с помощью FPC следующий полный пример исходного кода компилируется так же, как и предыдущий пример.
begin
writeLn('Hi!');
end.
Если программа синтаксически верна, FPC игнорирует все, что идет после финального end.
. Следующее будет скомпилировано без проблем:
program awesomeProgram(input, output, stdErr);
begin
writeLn('Awesome!');
end. Я благодарю маму, папу и всех, кто поддерживал меня в создании этой программы.
Эта «функция» в основном используется для предоставления журнала изменений в файле или уведомления об авторских правах.
FPC не поддерживает несколько модулей в одном файле исходного кода, как это делали или делают некоторые другие компиляторы. Исходный код каждого модуля должен находиться в отдельном файле. Однако ограничение, согласно которому имена модулей должны совпадать с именами файлов, не применяется к программам. Это связано с тем, что программы не могут быть включены другими модулями, поэтому их поиск (по имени файла) не требуется.
Структура программы
Файл program
должен иметь определенную структуру.
- Заголовок программы (в зависимости от используемого компилятора, возможно, необязательный).
- Может быть не более одного раздела
uses
-clause, и оно должно быть в верхней части программы сразу после заголовка программы. - Ровно один блок, заканчивающийся
end
(обратите внимание на period). Этот блок может содержать — в отличие от обычных блоков — раздел(ы)resourcestring
.
Точный порядок и количество различных разделов после (необязательного) предложения uses
до окончательного составного оператора begin
…end
строго не определен.
Тем не менее, есть некоторые правдоподобные соображения.
- Раздел
type
-section предшествует любому разделу, который может использовать типы, например,var
-разделы или объявления подпрограмм. - Поскольку
goto
известен как "инструмент дьявола", разделlabel
, если он есть, максимально близок к фрейму оператора, для которого он должен объявлять метки. - Как правило, вы переходите от общего к частному: например,
var
-раздел идет перед разделомthreadVar
. Разделconst
предшествует разделуresourceString
. - Разделы
resourceString
могут быть как статическими, так и глобальными, что означает, что они должны появиться относительно скоро после предложенияuses
. - Прямое использование глобальных переменных в подпрограммах (или даже простое их использование) считается дурным тоном. Вместо этого объявляйте/определяйте свои подпрограммы до любого
var
-(подобного)-раздела. (осторожно: не рискуйте и задайте{$writeableConst off}
) - Глобальные директивы компилятора, особенно те, которые разрешают или ограничивают то, что может быть написано (например,
{$goto on}
позволяет использоватьgoto
) или неявно добавляют зависимости модулей, такие как{$mode objFPC}
, должны появляться вскоре после заголовка программы.
Принимая во внимание все соображения, примерная структура программы должна выглядеть так (за исключением label
и {$goto on}
, которые упоминаются только для полноты картины):
program sectionDemo(input, output, stdErr);
// Глобальные директивы компилятора ----------------------------
{$mode objFPC}
{$goto on}
uses
sysUtils;
const
answer = 42;
resourceString
helloWorld = 'Hello world!';
type
primaryColor = (red, green, blue);
procedure doSomething(const color: primaryColor);
begin
end;
// M A I N -----------------------------------------------
var
i: longint;
threadVar
z: longbool;
label
42;
begin
end.
[Пример сознательно игнорирует возможность «типизированных констант», придерживаясь скорее традиционных концепций, чем невольно сбивает с толку новичков.]
См.также
- unit
- library
- program structure in the Object Pascal Introduction series
- § “Beginning” in the Pascal Programming book on Wikibooks.org