Sign in Join
Wiki copytemporary

Program/ru: what changed

Revision 0 to 1. Removed lines have a minus sign; added lines have a plus sign.

Title: Program/ru

OldNewLine
1+Понятие **программа** означает либо [[Executable program/ru|исполняемая программа]], т.е. самодостаточное и запускаемое [[Application|приложение]], либо часть [[File|файла]] (файлов) с [[Source code|исходным кодом]] на языке [[Pascal]], который может быть скомпилирован и не объявлен в виде [[Unit|модуля]] или [[Library|библиотеки]]. Иногда оно называется главной программой.
2+
3+## Главная программа
4+
5+`program` — это [[Reserved word|зарезервированное слово]], которое представляет файл с исходным кодом классической программы:
6+
7+``` pascal
8+program hiWorld(input, output, stdErr);
9+
10+begin
11+ writeLn('Hi!');
12+end.
13+```
14+
15+Тем временем [[FPC]] *отбрасывает* заголовок программы, т.е. первую строку. Имя выходного файла определяется именем файла исходного кода. Однако имя программы *становится* зарезервированным [[Identifier|идентификатором]] (за исключением режимов <abbr title="International Organization for Standardization">ISO</abbr> \[начиная с \[FPC 3.3.1/trunk revision \#45757; cf. [Issue \#37322](https://bugs.freepascal.org/view.php?id=37322)\]). В приведенном выше примере, например. попытка определить константу с именем `hiWorld` вызовет ошибку [[Compile time|времени компиляции]] повторяющегося идентификатора. Имя программы идентифицирует глобальную [[Scope|область]], поэтому его можно использовать для записи полных идентификаторов.
16+
17+Список файловых дескрипторов полностью игнорируется, за исключением [[Mode iso|{$mode ISO}]]. [[Text/ru|Текстовые]] [[Variable/ru|переменные]] [`input`](https://www.freepascal.org/docs-html/rtl/system/input.html), [`output`](https://www.freepascal.org/docs-html/rtl/system/output.html) и [`stderr`](https://www.freepascal.org/docs-html/rtl/system/stderr.html) всегда открыты и их имена нельзя изменить в других режимах. (ср.: [`SysInitStdIO`](https://www.freepascal.org/docs-html/rtl/system/sysinitstdio.html) всегда вызывается в [`rtl/linux/system.pp`](https://gitlab.com/freepascal.org/fpc/source/-/tree/release_3_0_4/rtl/linux/system.pp#L367-L368))
18+
19+Поэтому с помощью FPC следующий полный пример исходного кода компилируется так же, как и предыдущий пример.
20+
21+``` pascal
22+begin
23+ writeLn('Hi!');
24+end.
25+```
26+
27+Если программа синтаксически верна, FPC игнорирует все, что идет после финального `end.`. Следующее будет скомпилировано без проблем:
28+
29+``` pascal
30+program awesomeProgram(input, output, stdErr);
31+begin
32+ writeLn('Awesome!');
33+end. Я благодарю маму, папу и всех, кто поддерживал меня в создании этой программы.
34+```
35+
36+Эта «функция» в основном используется для предоставления журнала изменений в файле или уведомления об авторских правах.
37+
38+FPC не поддерживает несколько модулей в одном файле исходного кода, как это делали или делают некоторые другие компиляторы. Исходный код каждого модуля должен находиться в отдельном файле. Однако ограничение, согласно которому имена модулей должны совпадать с именами файлов, не применяется к программам. Это связано с тем, что программы не могут быть включены другими модулями, поэтому их поиск (по имени файла) не требуется.
39+
40+## Структура программы
41+
42+Файл `program` должен иметь определенную [[Basic Pascal Tutorial/Chapter 1/Program Structure/ru|структуру]].
43+
44+1. Заголовок программы (в зависимости от используемого компилятора, возможно, необязательный).
45+2. Может быть не более одного раздела [[Uses|uses-clause]], и оно должно быть в верхней части программы сразу после заголовка программы.
46+3. Ровно один [[Block|блок]], заканчивающийся `end`(обратите внимание на [[period]]). Этот блок может содержать — в отличие от обычных блоков — раздел(ы) `resourcestring`.
47+
48+Точный порядок и количество различных разделов после (необязательного) предложения `uses` до окончательного составного оператора [[Begin|begin]]…[[End|end]] строго не определен.
49+
50+Тем не менее, есть некоторые правдоподобные соображения.
51+
52+- Раздел [[Type|type-section]] предшествует любому разделу, который может использовать типы, например,[[Var|var]]-разделы или объявления [[Routine|подпрограмм]].
53+- Поскольку [[Goto|goto]] известен как "инструмент дьявола", раздел [[Label|label]], если он есть, максимально близок к фрейму оператора, для которого он должен объявлять метки.
54+- Как правило, вы переходите от общего к частному: например, `var`-раздел идет перед разделом [[Threadvar|threadVar]]. Раздел [[Const|const]] предшествует разделу [[Resourcestring|resourceString]].
55+- Разделы `resourceString` могут быть как статическими, так и глобальными, что означает, что они должны появиться относительно скоро после предложения `uses`.
56+- Прямое использование [[Global variables|глобальных переменных]] в подпрограммах (или даже простое их использование) считается дурным тоном. Вместо этого объявляйте/определяйте свои подпрограммы до любого `var`-(подобного)-раздела. (осторожно: не рискуйте и задайте `{$writeableConst off}`)
57+- [[global compiler directives|Глобальные директивы компилятора]], особенно те, которые разрешают или ограничивают то, что может быть написано (например, `{$goto on}` позволяет использовать `goto`) или неявно добавляют зависимости модулей, такие как [[Mode ObjFPC|{$mode objFPC}]], должны появляться вскоре после заголовка программы.
58+
59+Принимая во внимание все соображения, примерная структура программы должна выглядеть так (за исключением `label` и [[sGoto|{$goto on}]], которые упоминаются только для полноты картины):
60+
61+```delphi
62+program sectionDemo(input, output, stdErr);
63+
64+// Глобальные директивы компилятора ----------------------------
65+{$mode objFPC}
66+{$goto on}
67+
68+uses
69+ sysUtils;
70+
71+const
72+ answer = 42;
73+
74+resourceString
75+ helloWorld = 'Hello world!';
76+
77+type
78+ primaryColor = (red, green, blue);
79+
80+procedure doSomething(const color: primaryColor);
81+begin
82+end;
83+
84+// M A I N -----------------------------------------------
85+var
86+ i: longint;
87+
88+threadVar
89+ z: longbool;
90+
91+label
92+ 42;
93+begin
94+end.
95+```
96+
97+<small>\[Пример сознательно игнорирует возможность «типизированных констант», придерживаясь скорее традиционных концепций, чем невольно сбивает с толку новичков.\]</small>
98+
99+## См.также
100+
101+- [[Unit|unit]]
102+- [[Library|library]]
103+- [[Program Structure|program structure]] in the Object Pascal Introduction series
104+- [§ “Beginning” in the *Pascal Programming* book on Wikibooks.org](https://en.wikibooks.org/wiki/Pascal_Programming/Beginning)
105+
106+---
107+*From the Free Pascal wiki, page "Program/ru", as it stood on 2022-05-29 after a change by Zoltanleo, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history