Program/ru: what changed
Revision 0 to 1. Removed lines have a minus sign; added lines have a plus sign.
Title: Program/ru
| Old | New | Line | |
|---|---|---|---|
| 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).* |
