Difference between revisions of "Program/ru"
(One intermediate revision by the same user not shown) | |||
Line 41: | Line 41: | ||
FPC не поддерживает несколько модулей в одном файле исходного кода, как это делали или делают некоторые другие компиляторы. Исходный код каждого модуля должен находиться в отдельном файле. Однако ограничение, согласно которому имена модулей должны совпадать с именами файлов, не применяется к программам. Это связано с тем, что программы не могут быть включены другими модулями, поэтому их поиск (по имени файла) не требуется. | 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"> | <syntaxhighlight lang="delphi"> | ||
program sectionDemo(input, output, stdErr); | program sectionDemo(input, output, stdErr); | ||
− | // | + | // Глобальные директивы компилятора ---------------------------- |
{$mode objFPC} | {$mode objFPC} | ||
{$goto on} | {$goto on} | ||
Line 95: | 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