Program/ru: what changed
Revision 1 to 2. Removed lines have a minus sign; added lines have a plus sign.
| Old | New | Line | |
|---|---|---|---|
| 1 | 1 | Понятие **программа** означает либо [[Executable program/ru|исполняемая программа]], т.е. самодостаточное и запускаемое [[Application|приложение]], либо часть [[File|файла]] (файлов) с [[Source code|исходным кодом]] на языке [[Pascal]], который может быть скомпилирован и не объявлен в виде [[Unit|модуля]] или [[Library|библиотеки]]. Иногда оно называется главной программой. | |
| 2 | 2 | ||
| 3 | 3 | ## Главная программа | |
| 4 | 4 | ||
| 5 | 5 | `program` — это [[Reserved word|зарезервированное слово]], которое представляет файл с исходным кодом классической программы: | |
| 6 | 6 | ||
| 7 | 7 | ``` pascal | |
| 8 | 8 | program hiWorld(input, output, stdErr); | |
| 9 | 9 | ||
| 10 | 10 | begin | |
| 11 | 11 | writeLn('Hi!'); | |
| 12 | 12 | end. | |
| 13 | 13 | ``` | |
| 14 | 14 | ||
| 15 | - | ||
| 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|область]], поэтому его можно использовать для записи полных идентификаторов. | |
| 16 | 16 | ||
| 17 | 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 | 18 | ||
| 19 | 19 | Поэтому с помощью FPC следующий полный пример исходного кода компилируется так же, как и предыдущий пример. | |
| 20 | 20 | ||
| 21 | 21 | ``` pascal | |
| 22 | 22 | begin | |
| 23 | 23 | writeLn('Hi!'); | |
| 24 | 24 | end. | |
| 25 | 25 | ``` | |
| 26 | 26 | ||
| 27 | 27 | Если программа синтаксически верна, FPC игнорирует все, что идет после финального `end.`. Следующее будет скомпилировано без проблем: | |
| 28 | 28 | ||
| 29 | 29 | ``` pascal | |
| 30 | 30 | program awesomeProgram(input, output, stdErr); | |
| 31 | 31 | begin | |
| 32 | 32 | writeLn('Awesome!'); | |
| 33 | 33 | end. Я благодарю маму, папу и всех, кто поддерживал меня в создании этой программы. | |
| 34 | 34 | ``` | |
| 35 | 35 | ||
| 36 | 36 | Эта «функция» в основном используется для предоставления журнала изменений в файле или уведомления об авторских правах. | |
| 37 | 37 | ||
| 38 | 38 | FPC не поддерживает несколько модулей в одном файле исходного кода, как это делали или делают некоторые другие компиляторы. Исходный код каждого модуля должен находиться в отдельном файле. Однако ограничение, согласно которому имена модулей должны совпадать с именами файлов, не применяется к программам. Это связано с тем, что программы не могут быть включены другими модулями, поэтому их поиск (по имени файла) не требуется. | |
| 39 | 39 | ||
| 40 | 40 | ## Структура программы | |
| 41 | 41 | ||
| 42 | 42 | Файл `program` должен иметь определенную [[Basic Pascal Tutorial/Chapter 1/Program Structure/ru|структуру]]. | |
| 43 | 43 | ||
| 44 | 44 | 1. Заголовок программы (в зависимости от используемого компилятора, возможно, необязательный). | |
| 45 | 45 | 2. Может быть не более одного раздела [[Uses|uses-clause]], и оно должно быть в верхней части программы сразу после заголовка программы. | |
| 46 | 46 | 3. Ровно один [[Block|блок]], заканчивающийся `end`(обратите внимание на [[period]]). Этот блок может содержать — в отличие от обычных блоков — раздел(ы) `resourcestring`. | |
| 47 | 47 | ||
| 48 | 48 | Точный порядок и количество различных разделов после (необязательного) предложения `uses` до окончательного составного оператора [[Begin|begin]]…[[End|end]] строго не определен. | |
| 49 | 49 | ||
| 50 | 50 | Тем не менее, есть некоторые правдоподобные соображения. | |
| 51 | 51 | ||
| 52 | 52 | - Раздел [[Type|type-section]] предшествует любому разделу, который может использовать типы, например,[[Var|var]]-разделы или объявления [[Routine|подпрограмм]]. | |
| 53 | 53 | - Поскольку [[Goto|goto]] известен как "инструмент дьявола", раздел [[Label|label]], если он есть, максимально близок к фрейму оператора, для которого он должен объявлять метки. | |
| 54 | 54 | - Как правило, вы переходите от общего к частному: например, `var`-раздел идет перед разделом [[Threadvar|threadVar]]. Раздел [[Const|const]] предшествует разделу [[Resourcestring|resourceString]]. | |
| 55 | 55 | - Разделы `resourceString` могут быть как статическими, так и глобальными, что означает, что они должны появиться относительно скоро после предложения `uses`. | |
| 56 | 56 | - Прямое использование [[Global variables|глобальных переменных]] в подпрограммах (или даже простое их использование) считается дурным тоном. Вместо этого объявляйте/определяйте свои подпрограммы до любого `var`-(подобного)-раздела. (осторожно: не рискуйте и задайте `{$writeableConst off}`) | |
| 57 | 57 | - [[global compiler directives|Глобальные директивы компилятора]], особенно те, которые разрешают или ограничивают то, что может быть написано (например, `{$goto on}` позволяет использовать `goto`) или неявно добавляют зависимости модулей, такие как [[Mode ObjFPC|{$mode objFPC}]], должны появляться вскоре после заголовка программы. | |
| 58 | 58 | ||
| 59 | 59 | Принимая во внимание все соображения, примерная структура программы должна выглядеть так (за исключением `label` и [[sGoto|{$goto on}]], которые упоминаются только для полноты картины): | |
| 60 | 60 | ||
| 61 | 61 | ```delphi | |
| 62 | 62 | program sectionDemo(input, output, stdErr); | |
| 63 | 63 | ||
| 64 | 64 | // Глобальные директивы компилятора ---------------------------- | |
| 65 | 65 | {$mode objFPC} | |
| 66 | 66 | {$goto on} | |
| 67 | 67 | ||
| 68 | 68 | uses | |
| 69 | 69 | sysUtils; | |
| 70 | 70 | ||
| 71 | 71 | const | |
| 72 | 72 | answer = 42; | |
| 73 | 73 | ||
| 74 | 74 | resourceString | |
| 75 | 75 | helloWorld = 'Hello world!'; | |
| 76 | 76 | ||
| 77 | 77 | type | |
| 78 | 78 | primaryColor = (red, green, blue); | |
| 79 | 79 | ||
| 80 | 80 | procedure doSomething(const color: primaryColor); | |
| 81 | 81 | begin | |
| 82 | 82 | end; | |
| 83 | 83 | ||
| 84 | 84 | // M A I N ----------------------------------------------- | |
| 85 | 85 | var | |
| 86 | 86 | i: longint; | |
| 87 | 87 | ||
| 88 | 88 | threadVar | |
| 89 | 89 | z: longbool; | |
| 90 | 90 | ||
| 91 | 91 | label | |
| 92 | 92 | 42; | |
| 93 | 93 | begin | |
| 94 | 94 | end. | |
| 95 | 95 | ``` | |
| 96 | 96 | ||
| 97 | - | ||
| 97 | + | \[Пример сознательно игнорирует возможность «типизированных констант», придерживаясь скорее традиционных концепций, чем невольно сбивает с толку новичков.\] | |
| 98 | 98 | ||
| 99 | 99 | ## См.также | |
| 100 | 100 | ||
| 101 | 101 | - [[Unit|unit]] | |
| 102 | 102 | - [[Library|library]] | |
| 103 | 103 | - [[Program Structure|program structure]] in the Object Pascal Introduction series | |
| 104 | 104 | - [§ “Beginning” in the *Pascal Programming* book on Wikibooks.org](https://en.wikibooks.org/wiki/Pascal_Programming/Beginning) | |
| 105 | 105 | ||
| 106 | 106 | --- | |
| 107 | 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).* |
