Program/ru
│
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
должен иметь определенную структуру.
- Заголовок программы (в зависимости от используемого компилятора, возможно, необязательный).
- Может быть не более одного раздела
uses
-clause, и оно должно быть в верхней части программы сразу после заголовка программы. - Ровно один блок, заканчивающийся
end
(обратите внимание на period). Этот блок может содержать — в отличие от обычных блоков — раздел(ы)resourcestring
.
Точный порядок и количество различных разделов после (необязательного) предложения uses
до окончательного составного оператора begin
…end
строго не определен.
Тем не менее, есть некоторые правдоподобные соображения.
- Раздел
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.
[Пример сознательно игнорирует возможность «типизированных констант», придерживаясь скорее традиционных концепций, чем невольно сбивает с толку новичков.]
См.также
- unit
- library
- program structure in the Object Pascal Introduction series
- § “Beginning” in the Pascal Programming book on Wikibooks.org