Difference between revisions of "Program"
m (→program structure: link period#module end) |
|||
Line 15: | Line 15: | ||
Meanwhile [[FPC]] ''discards'' the program header, i.e. the first line. | Meanwhile [[FPC]] ''discards'' the program header, i.e. the first line. | ||
The output file name is determined by the source code file's name. | The output file name is determined by the source code file's name. | ||
− | However, the program name ''does'' become a reserved identifier. | + | However, the program name ''does'' become a reserved [[Identifier|identifier]]. |
− | In the example above, e.g. attempting to define a constant named <syntaxhighlight lang="pascal" enclose="none">hiWorld</syntaxhighlight> would trigger a duplicate identifier compile | + | In the example above, e.g. attempting to define a constant named <syntaxhighlight lang="pascal" enclose="none">hiWorld</syntaxhighlight> would trigger a duplicate identifier [[Compile time|compile time]] error. |
The file descriptor list is completely ignored, but in [[Mode iso|<syntaxhighlight lang="pascal" enclose="none">{$mode ISO}</syntaxhighlight>]]. | The file descriptor list is completely ignored, but in [[Mode iso|<syntaxhighlight lang="pascal" enclose="none">{$mode ISO}</syntaxhighlight>]]. | ||
Line 40: | Line 40: | ||
* <syntaxhighlight lang="pascal" enclose="none">resourcestring</syntaxhighlight>-sections can be either static or global, that means they should appear relatively soon after the <syntaxhighlight lang="pascal" enclose="none">uses</syntaxhighlight>-clause. | * <syntaxhighlight lang="pascal" enclose="none">resourcestring</syntaxhighlight>-sections can be either static or global, that means they should appear relatively soon after the <syntaxhighlight lang="pascal" enclose="none">uses</syntaxhighlight>-clause. | ||
* 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" enclose="none">var</syntaxhighlight>-(like)-section. (beware: play it safe and set <syntaxhighlight lang="pascal" enclose="none">{$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" enclose="none">var</syntaxhighlight>-(like)-section. (beware: play it safe and set <syntaxhighlight lang="pascal" enclose="none">{$writeableConst off}</syntaxhighlight>) | ||
− | * Global compiler directives, especially such that allow or restrict what can be written (e.g. <syntaxhighlight lang="pascal" enclose="none">{$goto on}</syntaxhighlight> allows the use of <syntaxhighlight lang="pascal" enclose="none">goto</syntaxhighlight>) or implicitly add unit dependencies like [[Mode ObjFPC|<syntaxhighlight lang="pascal" enclose="none">{$mode objfpc}</syntaxhighlight>]] should appear soon after the program header. | + | * [[global compiler directives|Global compiler directives]], especially such that allow or restrict what can be written (e.g. <syntaxhighlight lang="pascal" enclose="none">{$goto on}</syntaxhighlight> allows the use of <syntaxhighlight lang="pascal" enclose="none">goto</syntaxhighlight>) or implicitly add unit dependencies like [[Mode ObjFPC|<syntaxhighlight lang="pascal" enclose="none">{$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" enclose="none">label</syntaxhighlight> and [[sGoto|<syntaxhighlight lang="pascal" enclose="none">{$goto on}</syntaxhighlight>]] which are only mentioned for the sake of completeness): | Taking all considerations into account the rough program structure should look like this (except for <syntaxhighlight lang="pascal" enclose="none">label</syntaxhighlight> and [[sGoto|<syntaxhighlight lang="pascal" enclose="none">{$goto on}</syntaxhighlight>]] which are only mentioned for the sake of completeness): | ||
<syntaxhighlight lang="pascal"> | <syntaxhighlight lang="pascal"> |
Revision as of 20:24, 15 February 2019
│
Deutsch (de) │
English (en) │
suomi (fi) │
français (fr) │
Bahasa Indonesia (id) │
italiano (it) │
português (pt) │
русский (ru) │
A program is either an executable program, that is, the complete and runnable application, or it is that portion of a Pascal Source code file or files that can be compiled and is not declared to be a unit or library. This is sometimes referred to as the main program.
main program
program
is a reserved word that introduces a classical program source code file:
program hiWorld(input, output, stderr);
begin
writeLn('Hi!');
end.
Meanwhile FPC discards the program header, i.e. the first line.
The output file name is determined by the source code file's name.
However, the program name does become a reserved identifier.
In the example above, e.g. attempting to define a constant named hiWorld
would trigger a duplicate identifier compile time error.
The file descriptor list is completely ignored, but in {$mode ISO}
.
The text
variables input
, output
and stderr
are always opened and their names can not be changed in other modes. (cf.: SysInitStdIO
is always called in rtl/linux/system.pp)
Thus with FPC the following complete source code example compiles identically as does the previous example.
begin
writeLn('Hi!');
end.
program structure
A program
file has to follow a certain structure.
- An (depending on used compiler possibly optional) program header.
- There can be at most one
uses
-clause and it has to be at the top of the program right after the program header. - 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 begin
…end.
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, alabel
-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 athreadvar
-section. Aconst
-section comes before aresourcestring
-section. resourcestring
-sections can be either static or global, that means they should appear relatively soon after theuses
-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 ofgoto
) 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.]