Sign in Join
Wiki copytemporary

Program/ru: what changed

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

OldNewLine
11Понятие **программа** означает либо [[Executable program/ru|исполняемая программа]], т.е. самодостаточное и запускаемое [[Application|приложение]], либо часть [[File|файла]] (файлов) с [[Source code|исходным кодом]] на языке [[Pascal]], который может быть скомпилирован и не объявлен в виде [[Unit|модуля]] или [[Library|библиотеки]]. Иногда оно называется главной программой.
22
33## Главная программа
44
55`program` — это [[Reserved word|зарезервированное слово]], которое представляет файл с исходным кодом классической программы:
66
77``` pascal
88program hiWorld(input, output, stdErr);
99
1010begin
1111 writeLn('Hi!');
1212end.
1313```
1414
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|область]], поэтому его можно использовать для записи полных идентификаторов.
15+Тем временем [[FPC]] *отбрасывает* заголовок программы, т.е. первую строку. Имя выходного файла определяется именем файла исходного кода. Однако имя программы *становится* зарезервированным [[Identifier|идентификатором]] (за исключением режимов ISO \[начиная с \[FPC 3.3.1/trunk revision \#45757; cf. [Issue \#37322](https://bugs.freepascal.org/view.php?id=37322)\]). В приведенном выше примере, например. попытка определить константу с именем `hiWorld` вызовет ошибку [[Compile time|времени компиляции]] повторяющегося идентификатора. Имя программы идентифицирует глобальную [[Scope|область]], поэтому его можно использовать для записи полных идентификаторов.
1616
1717Список файловых дескрипторов полностью игнорируется, за исключением [[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))
1818
1919Поэтому с помощью FPC следующий полный пример исходного кода компилируется так же, как и предыдущий пример.
2020
2121``` pascal
2222begin
2323 writeLn('Hi!');
2424end.
2525```
2626
2727Если программа синтаксически верна, FPC игнорирует все, что идет после финального `end.`. Следующее будет скомпилировано без проблем:
2828
2929``` pascal
3030program awesomeProgram(input, output, stdErr);
3131begin
3232 writeLn('Awesome!');
3333end. Я благодарю маму, папу и всех, кто поддерживал меня в создании этой программы.
3434```
3535
3636Эта «функция» в основном используется для предоставления журнала изменений в файле или уведомления об авторских правах.
3737
3838FPC не поддерживает несколько модулей в одном файле исходного кода, как это делали или делают некоторые другие компиляторы. Исходный код каждого модуля должен находиться в отдельном файле. Однако ограничение, согласно которому имена модулей должны совпадать с именами файлов, не применяется к программам. Это связано с тем, что программы не могут быть включены другими модулями, поэтому их поиск (по имени файла) не требуется.
3939
4040## Структура программы
4141
4242Файл `program` должен иметь определенную [[Basic Pascal Tutorial/Chapter 1/Program Structure/ru|структуру]].
4343
44441. Заголовок программы (в зависимости от используемого компилятора, возможно, необязательный).
45452. Может быть не более одного раздела [[Uses|uses-clause]], и оно должно быть в верхней части программы сразу после заголовка программы.
46463. Ровно один [[Block|блок]], заканчивающийся `end`(обратите внимание на [[period]]). Этот блок может содержать — в отличие от обычных блоков — раздел(ы) `resourcestring`.
4747
4848Точный порядок и количество различных разделов после (необязательного) предложения `uses` до окончательного составного оператора [[Begin|begin]]…[[End|end]] строго не определен.
4949
5050Тем не менее, есть некоторые правдоподобные соображения.
5151
5252- Раздел [[Type|type-section]] предшествует любому разделу, который может использовать типы, например,[[Var|var]]-разделы или объявления [[Routine|подпрограмм]].
5353- Поскольку [[Goto|goto]] известен как "инструмент дьявола", раздел [[Label|label]], если он есть, максимально близок к фрейму оператора, для которого он должен объявлять метки.
5454- Как правило, вы переходите от общего к частному: например, `var`-раздел идет перед разделом [[Threadvar|threadVar]]. Раздел [[Const|const]] предшествует разделу [[Resourcestring|resourceString]].
5555- Разделы `resourceString` могут быть как статическими, так и глобальными, что означает, что они должны появиться относительно скоро после предложения `uses`.
5656- Прямое использование [[Global variables|глобальных переменных]] в подпрограммах (или даже простое их использование) считается дурным тоном. Вместо этого объявляйте/определяйте свои подпрограммы до любого `var`-(подобного)-раздела. (осторожно: не рискуйте и задайте `{$writeableConst off}`)
5757- [[global compiler directives|Глобальные директивы компилятора]], особенно те, которые разрешают или ограничивают то, что может быть написано (например, `{$goto on}` позволяет использовать `goto`) или неявно добавляют зависимости модулей, такие как [[Mode ObjFPC|{$mode objFPC}]], должны появляться вскоре после заголовка программы.
5858
5959Принимая во внимание все соображения, примерная структура программы должна выглядеть так (за исключением `label` и [[sGoto|{$goto on}]], которые упоминаются только для полноты картины):
6060
6161```delphi
6262program sectionDemo(input, output, stdErr);
6363
6464// Глобальные директивы компилятора ----------------------------
6565{$mode objFPC}
6666{$goto on}
6767
6868uses
6969 sysUtils;
7070
7171const
7272 answer = 42;
7373
7474resourceString
7575 helloWorld = 'Hello world!';
7676
7777type
7878 primaryColor = (red, green, blue);
7979
8080procedure doSomething(const color: primaryColor);
8181begin
8282end;
8383
8484// M A I N -----------------------------------------------
8585var
8686 i: longint;
8787
8888threadVar
8989 z: longbool;
9090
9191label
9292 42;
9393begin
9494end.
9595```
9696
97-<small>\[Пример сознательно игнорирует возможность «типизированных констант», придерживаясь скорее традиционных концепций, чем невольно сбивает с толку новичков.\]</small>
97+\[Пример сознательно игнорирует возможность «типизированных констант», придерживаясь скорее традиционных концепций, чем невольно сбивает с толку новичков.\]
9898
9999## См.также
100100
101101- [[Unit|unit]]
102102- [[Library|library]]
103103- [[Program Structure|program structure]] in the Object Pascal Introduction series
104104- [§ “Beginning” in the *Pascal Programming* book on Wikibooks.org](https://en.wikibooks.org/wiki/Pascal_Programming/Beginning)
105105
106106---
107107*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