Program/ru

From Lazarus wiki
Jump to navigationJump to search

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 structure

A program file has to follow a certain structure.

  1. A (depending on used compiler possibly optional) program header.
  2. There can be at most one uses-clause and it has to be at the top of the program right after the program header.
  3. Exactly one block that concludes with an end. (note the period). This block may contain – in contrast to regular blocks – resourcestring section(s).

The exact order and number of various sections after the (optional) uses-clause until final the compound statement beginend. is free of choice.

However, there are some plausible considerations.

  • A type-section comes prior any section that can use types, e.g. var-sections or routine declarations.
  • Since goto is known as the devil’s tool, a label-section, if any, is as close as possible to the statement-frame it is supposed to declare labels for.
  • Generally you go from general into specifics: For example a var-section comes in front of a threadVar-section. A const-section comes before a resourceString-section.
  • resourceString-sections can be either static or global, that means they should appear relatively soon after the uses-clause.
  • Direct usage of global variables in routines (or even the mere possibility) is considered as bad style. Instead, declare/define your routines prior any var-(like)-section. (beware: play it safe and set {$writeableConst off})
  • Global compiler directives, especially such that allow or restrict what can be written (e.g. {$goto on} allows the use of goto) or implicitly add unit dependencies like {$mode objFPC} should appear soon after the program header.

Taking all considerations into account the rough program structure should look like this (except for label and {$goto on} which are only mentioned for the sake of completeness):

program sectionDemo(input, output, stdErr);

// Global compiler directives ----------------------------
{$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.

[The example consciously ignores the possibility of “typed constants”, sticking rather to traditional concepts than unnecessarily confusing beginners.]

See also