Difference between revisions of "Program/ru"
(4 intermediate revisions by the same user not shown) | |||
Line 2: | Line 2: | ||
Понятие '''программа''' означает либо [[Executable program/ru|исполняемая программа]], т.е. самодостаточное и запускаемое [[Application|приложение]], либо часть [[File|файла]] (файлов) с [[Source code|исходным кодом]] на языке [[Pascal]], который может быть скомпилирован и не объявлен в виде [[Unit|модуля]] или [[Library|библиотеки]]. Иногда оно называется главной программой. | Понятие '''программа''' означает либо [[Executable program/ru|исполняемая программа]], т.е. самодостаточное и запускаемое [[Application|приложение]], либо часть [[File|файла]] (файлов) с [[Source code|исходным кодом]] на языке [[Pascal]], который может быть скомпилирован и не объявлен в виде [[Unit|модуля]] или [[Library|библиотеки]]. Иногда оно называется главной программой. | ||
+ | |||
+ | __TOC__ | ||
== Главная программа == | == Главная программа == | ||
− | <syntaxhighlight lang="pascal" inline>program</syntaxhighlight> | + | <syntaxhighlight lang="pascal" inline>program</syntaxhighlight> — это [[Reserved word|зарезервированное слово]], которое представляет файл с исходным кодом классической программы: |
<syntaxhighlight lang="pascal" highlight="1"> | <syntaxhighlight lang="pascal" highlight="1"> | ||
Line 15: | Line 17: | ||
</syntaxhighlight> | </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"> | <syntaxhighlight lang="pascal"> | ||
Line 32: | Line 29: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | + | Если программа синтаксически верна, FPC игнорирует все, что идет после финального <syntaxhighlight lang="pascal" inline>end.</syntaxhighlight>. Следующее будет скомпилировано без проблем: | |
<syntaxhighlight lang="pascal"> | <syntaxhighlight lang="pascal"> | ||
Line 38: | Line 35: | ||
begin | begin | ||
writeLn('Awesome!'); | writeLn('Awesome!'); | ||
− | end. | + | end. Я благодарю маму, папу и всех, кто поддерживал меня в создании этой программы. |
</syntaxhighlight> | </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>. |
− | * <syntaxhighlight lang="delphi" inline>resourceString</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>]], должны появляться вскоре после заголовка программы. |
− | * [[global compiler directives| | ||
− | + | Принимая во внимание все соображения, примерная структура программы должна выглядеть так (за исключением <syntaxhighlight lang="pascal" inline>label</syntaxhighlight> и [[sGoto|<syntaxhighlight lang="pascal" inline>{$goto on}</syntaxhighlight>]], которые упоминаются только для полноты картины): | |
<syntaxhighlight lang="delphi"> | <syntaxhighlight lang="delphi"> | ||
program sectionDemo(input, output, stdErr); | program sectionDemo(input, output, stdErr); | ||
− | // | + | // Глобальные директивы компилятора ---------------------------- |
{$mode objFPC} | {$mode objFPC} | ||
{$goto on} | {$goto on} | ||
Line 101: | Line 98: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | <small>[ | + | <small>[Пример сознательно игнорирует возможность «типизированных констант», придерживаясь скорее традиционных концепций, чем невольно сбивает с толку новичков.]</small> |
− | == | + | == См.также == |
* [[Unit|unit]] | * [[Unit|unit]] |
Latest revision as of 19: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