Difference between revisions of "Program/ru"

From Lazarus wiki
Jump to navigationJump to search
 
(4 intermediate revisions by the same user not shown)
Line 2: Line 2:
  
 
Понятие '''программа''' означает либо [[Executable program/ru|исполняемая программа]], т.е. самодостаточное и запускаемое [[Application|приложение]], либо часть [[File|файла]] (файлов) с [[Source code|исходным кодом]] на языке [[Pascal]], который может быть скомпилирован и не объявлен в виде [[Unit|модуля]] или [[Library|библиотеки]]. Иногда оно называется главной программой.
 
Понятие '''программа''' означает либо [[Executable program/ru|исполняемая программа]], т.е. самодостаточное и запускаемое [[Application|приложение]], либо часть [[File|файла]] (файлов) с [[Source code|исходным кодом]] на языке [[Pascal]], который может быть скомпилирован и не объявлен в виде [[Unit|модуля]] или [[Library|библиотеки]]. Иногда оно называется главной программой.
 +
 +
__TOC__
  
 
== Главная программа ==
 
== Главная программа ==
  
<syntaxhighlight lang="pascal" inline>program</syntaxhighlight> is a [[Reserved word|reserved word]] that introduces a classical program source code file:
+
<syntaxhighlight lang="pascal" inline>program</syntaxhighlight> — это [[Reserved word|зарезервированное слово]], которое представляет файл с исходным кодом классической программы:
  
 
<syntaxhighlight lang="pascal" highlight="1">
 
<syntaxhighlight lang="pascal" highlight="1">
Line 15: Line 17:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
Meanwhile [[FPC]] ''discards'' the program header, i.&#8239;e. the first line.
+
Тем временем [[FPC]] ''отбрасывает'' заголовок программы, т.е. первую строку. Имя выходного файла определяется именем файла исходного кода. Однако имя программы ''становится'' зарезервированным [[Identifier|идентификатором]] (за исключением режимов <abbr title="International Organization for Standardization">ISO</abbr> [начиная с [FPC 3.3.1/trunk revision #45757; cf. {{MantisLink|37322}}]). В приведенном выше примере, например. попытка определить константу с именем <syntaxhighlight lang="pascal" inline>hiWorld</syntaxhighlight> вызовет ошибку [[Compile time|времени компиляции]] повторяющегося идентификатора. Имя программы идентифицирует глобальную [[Scope|область]], поэтому его можно использовать для записи полных идентификаторов.
The output file name is determined by the source code file’s name.
 
However, the program name ''does'' become a reserved [[Identifier|identifier]] (except in the <abbr title="International Organization for Standardization">ISO</abbr> modes [since FPC 3.3.1/trunk revision #45757; cf. {{MantisLink|37322}}]).
 
In the example above, e.g. attempting to define a constant named <syntaxhighlight lang="pascal" inline>hiWorld</syntaxhighlight> would trigger a duplicate identifier [[Compile time|compile time]] error.
 
The program name will identify the global [[Scope|scope]], thus it can be used to write fully-qualified identifiers.
 
  
The file descriptor list is completely ignored, except in [[Mode iso|<syntaxhighlight lang="pascal" inline>{$mode ISO}</syntaxhighlight>]].
+
Список файловых дескрипторов полностью игнорируется, за исключением [[Mode iso|<syntaxhighlight lang="pascal" inline>{$mode ISO}</syntaxhighlight>]]. [[Text/ru|<syntaxhighlight lang="pascal" inline>Текстовые</syntaxhighlight>]] [[Variable/ru|переменные]] {{Doc|package=RTL|unit=system|identifier=input|text=<syntaxhighlight lang="pascal" inline>input</syntaxhighlight>}}, {{Doc|package=RTL|unit=system|identifier=output|text=<syntaxhighlight lang="pascal" inline>output</syntaxhighlight>}} и {{Doc|package=RTL|unit=system|identifier=stderr|text=<syntaxhighlight lang="pascal" inline>stderr</syntaxhighlight>}} всегда открыты и их имена нельзя изменить в других режимах. (ср.: {{Doc|package=RTL|unit=system|identifier=sysinitstdio|text=<syntaxhighlight lang="pascal" inline>SysInitStdIO</syntaxhighlight>}} всегда вызывается в {{gitlab|tree|FPC|release_3_0_4/rtl/linux/system.pp#L367-L368|<tt>rtl/linux/system.pp</tt>}})
The [[Text|<syntaxhighlight lang="pascal" inline>text</syntaxhighlight>]] [[Variable|variables]] {{Doc|package=RTL|unit=system|identifier=input|text=<syntaxhighlight lang="pascal" inline>input</syntaxhighlight>}}, {{Doc|package=RTL|unit=system|identifier=output|text=<syntaxhighlight lang="pascal" inline>output</syntaxhighlight>}} and {{Doc|package=RTL|unit=system|identifier=stderr|text=<syntaxhighlight lang="pascal" inline>stderr</syntaxhighlight>}} are always opened and their names can not be changed in other modes. (cf.: {{Doc|package=RTL|unit=system|identifier=sysinitstdio|text=<syntaxhighlight lang="pascal" inline>SysInitStdIO</syntaxhighlight>}} is always called in {{gitlab|tree|FPC|release_3_0_4/rtl/linux/system.pp#L367-L368|<tt>rtl/linux/system.pp</tt>}})
 
  
Therefore with FPC the following complete source code example compiles identically as does the previous example.
+
Поэтому с помощью FPC следующий полный пример исходного кода компилируется так же, как и предыдущий пример.
  
 
<syntaxhighlight lang="pascal">
 
<syntaxhighlight lang="pascal">
Line 32: Line 29:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
If the program is syntactically correct, FPC ignores anything that comes after the final <syntaxhighlight lang="pascal" inline>end.</syntaxhighlight>. The following will compile without problems:
+
Если программа синтаксически верна, FPC игнорирует все, что идет после финального <syntaxhighlight lang="pascal" inline>end.</syntaxhighlight>. Следующее будет скомпилировано без проблем:
  
 
<syntaxhighlight lang="pascal">
 
<syntaxhighlight lang="pascal">
Line 38: Line 35:
 
begin
 
begin
 
writeLn('Awesome!');
 
writeLn('Awesome!');
end.I thank my mom, my dad, and everyone who supported me in making this program.
+
end. Я благодарю маму, папу и всех, кто поддерживал меня в создании этой программы.
 
</syntaxhighlight>
 
</syntaxhighlight>
This “feature” is primarily used to supply an in-file changelog or copyright notice.
+
Эта «функция» в основном используется для предоставления журнала изменений в файле или уведомления об авторских правах.
 +
 
 +
FPC не поддерживает несколько модулей в одном файле исходного кода, как это делали или делают некоторые другие компиляторы. Исходный код каждого модуля должен находиться в отдельном файле. Однако ограничение, согласно которому имена модулей должны совпадать с именами файлов, не применяется к программам. Это связано с тем, что программы не могут быть включены другими модулями, поэтому их поиск (по имени файла) не требуется.
 +
 
 +
== Структура программы ==
 +
 
 +
Файл <syntaxhighlight lang="pascal" inline>program</syntaxhighlight> должен иметь определенную [[Basic_Pascal_Tutorial/Chapter_1/Program_Structure/ru|структуру]].
  
FPC does not support multiple modules in one source code file, like some other compilers did or do.
+
# Заголовок программы (в зависимости от используемого компилятора, возможно, необязательный).
Each module source code has to reside in its own file.
+
# Может быть не более одного раздела [[Uses|<syntaxhighlight lang="pascal" inline>uses</syntaxhighlight>-clause]], и оно должно быть в верхней части программы сразу после заголовка программы.
However, the restriction that module names have to match file names does not apply to programs.
+
# Ровно один [[Block|блок]], заканчивающийся <syntaxhighlight lang="pascal" inline>end</syntaxhighlight>(обратите внимание на [[period#module end|period]]). Этот блок может содержать — в отличие от обычных блоков — раздел(ы) <syntaxhighlight lang="pascal" inline>resourcestring</syntaxhighlight>.
This is due to the fact that programs cannot be included by other modules, thus searching them (via their file name) is not necessary.
 
  
== Program structure ==
+
Точный порядок и количество различных разделов после (необязательного) предложения <syntaxhighlight lang="pascal" inline>uses</syntaxhighlight> до окончательного составного оператора [[Begin|<syntaxhighlight lang="pascal" inline>begin</syntaxhighlight>]]…[[End|<syntaxhighlight lang="pascal" inline>end</syntaxhighlight>]] строго не определен.
  
A <syntaxhighlight lang="pascal" inline>program</syntaxhighlight> file has to follow a certain [[Program Structure|structure]].
+
Тем не менее, есть некоторые правдоподобные соображения.
# A (depending on used compiler possibly optional) program header.
 
# There can be at most one [[Uses|<syntaxhighlight lang="pascal" inline>uses</syntaxhighlight>-clause]] and it has to be at the top of the program right after the program header.
 
# Exactly one [[Block|block]] that concludes with an <syntaxhighlight lang="pascal" inline>end.</syntaxhighlight> (note the [[period#module end|period]]). This block may contain – in contrast to regular blocks – <syntaxhighlight lang="pascal" inline>resourcestring</syntaxhighlight> section(s).
 
The exact order and number of various sections after the (optional) <syntaxhighlight lang="pascal" inline>uses</syntaxhighlight>-clause until final the compound statement [[Begin|<syntaxhighlight lang="pascal" inline>begin</syntaxhighlight>]]…[[End|<syntaxhighlight lang="pascal" inline>end.</syntaxhighlight>]] is free of choice.
 
  
However, there are some plausible considerations.
+
* Раздел [[Type|<syntaxhighlight lang="pascal" inline>type</syntaxhighlight>-section]] предшествует любому разделу, который может использовать типы, например,[[Var|<syntaxhighlight lang="pascal" inline>var</syntaxhighlight>]]-разделы или объявления [[Routine|подпрограмм]].
* A [[Type|<syntaxhighlight lang="pascal" inline>type</syntaxhighlight>-section]] comes prior any section that can use types, e.g. [[Var|<syntaxhighlight lang="pascal" inline>var</syntaxhighlight>-sections]] or [[Routine|routine]] declarations.
+
* Поскольку [[Goto|<syntaxhighlight lang="pascal" inline>goto</syntaxhighlight>]] известен как "инструмент дьявола", раздел [[Label|<syntaxhighlight lang="pascal" inline>label</syntaxhighlight>]], если он есть, максимально близок к фрейму оператора, для которого он должен объявлять метки.
* Since [[Goto|<syntaxhighlight lang="pascal" inline>goto</syntaxhighlight>]] is known as the devil’s tool, a [[Label|<syntaxhighlight lang="pascal" inline>label</syntaxhighlight>-section]], if any, is as close as possible to the statement-frame it is supposed to declare labels for.
+
* Как правило, вы переходите от общего к частному: например, <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>]].
* Generally you go from general into specifics: For example a <syntaxhighlight lang="pascal" inline>var</syntaxhighlight>-section comes in front of a [[Threadvar|<syntaxhighlight lang="delphi" inline>threadVar</syntaxhighlight>-section]]. A [[Const|<syntaxhighlight lang="pascal" inline>const</syntaxhighlight>-section]] comes before a [[Resourcestring|<syntaxhighlight lang="delphi" inline>resourceString</syntaxhighlight>-section]].
+
* Разделы <syntaxhighlight lang="delphi" inline>resourceString</syntaxhighlight> могут быть как статическими, так и глобальными, что означает, что они должны появиться относительно скоро после предложения <syntaxhighlight lang="pascal" inline>uses</syntaxhighlight>.
* <syntaxhighlight lang="delphi" inline>resourceString</syntaxhighlight>-sections can be either static or global, that means they should appear relatively soon after the <syntaxhighlight lang="pascal" inline>uses</syntaxhighlight>-clause.
+
* Прямое использование [[Global variables|глобальных переменных]] в подпрограммах (или даже простое их использование) считается дурным тоном. Вместо этого объявляйте/определяйте свои подпрограммы до любого <syntaxhighlight lang="pascal" inline>var</syntaxhighlight>-(подобного)-раздела. (осторожно: не рискуйте и задайте <syntaxhighlight lang="pascal" inline>{$writeableConst off}</syntaxhighlight>)
* Direct usage of [[Global variables|global variables]] in routines (or even the mere possibility) is considered as bad style. Instead, declare/define your routines prior any <syntaxhighlight lang="pascal" inline>var</syntaxhighlight>-(like)-section. (beware: play it safe and set <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>]], должны появляться вскоре после заголовка программы.
* [[global compiler directives|Global compiler directives]], especially such that allow or restrict what can be written (e.g. <syntaxhighlight lang="pascal" inline>{$goto on}</syntaxhighlight> allows the use of <syntaxhighlight lang="pascal" inline>goto</syntaxhighlight>) or implicitly add unit dependencies like [[Mode ObjFPC|<syntaxhighlight lang="pascal" inline>{$mode objFPC}</syntaxhighlight>]] should appear soon after the program header.
 
  
Taking all considerations into account the rough program structure should look like this (except for <syntaxhighlight lang="pascal" inline>label</syntaxhighlight> and [[sGoto|<syntaxhighlight lang="pascal" inline>{$goto on}</syntaxhighlight>]] which are only mentioned for the sake of completeness):
+
Принимая во внимание все соображения, примерная структура программы должна выглядеть так (за исключением <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);
  
// Global compiler directives ----------------------------
+
// Глобальные директивы компилятора ----------------------------
 
{$mode objFPC}
 
{$mode objFPC}
 
{$goto on}
 
{$goto on}
Line 101: Line 98:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
<small>[The example consciously ignores the possibility of “typed constants”, sticking rather to traditional concepts than unnecessarily confusing beginners.]</small>
+
<small>[Пример сознательно игнорирует возможность «типизированных констант», придерживаясь скорее традиционных концепций, чем невольно сбивает с толку новичков.]</small>
  
== See also ==
+
== См.также ==
  
 
* [[Unit|unit]]
 
* [[Unit|unit]]

Latest revision as of 18: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 должен иметь определенную структуру.

  1. Заголовок программы (в зависимости от используемого компилятора, возможно, необязательный).
  2. Может быть не более одного раздела uses-clause, и оно должно быть в верхней части программы сразу после заголовка программы.
  3. Ровно один блок, заканчивающийся end(обратите внимание на period). Этот блок может содержать — в отличие от обычных блоков — раздел(ы) resourcestring.

Точный порядок и количество различных разделов после (необязательного) предложения uses до окончательного составного оператора beginend строго не определен.

Тем не менее, есть некоторые правдоподобные соображения.

  • Раздел 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.

[Пример сознательно игнорирует возможность «типизированных констант», придерживаясь скорее традиционных концепций, чем невольно сбивает с толку новичков.]

См.также