Difference between revisions of "Program"
(→main program: ISO mode) |
|||
Line 30: | Line 30: | ||
== program structure == | == program structure == | ||
A <syntaxhighlight lang="pascal" enclose="none">program</syntaxhighlight> file has to follow a certain structure. | A <syntaxhighlight lang="pascal" enclose="none">program</syntaxhighlight> file has to follow a certain structure. | ||
− | There can be at most one [[Uses|<syntaxhighlight lang="pascal" enclose="none">uses</syntaxhighlight>-clause]] and it has to be at the top of the program right after the | + | # An (depending on used compiler possibly optional) program header. |
− | <syntaxhighlight lang="pascal" | + | # There can be at most one [[Uses|<syntaxhighlight lang="pascal" enclose="none">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" enclose="none">end.</syntaxhighlight> (note the period). This block may contain – in contrast to regular blocks – <syntaxhighlight lang="pascal" enclose="none">resourcestring</syntaxhighlight> section(s). | |
− | + | The exact order and number of various sections after the (optional) <syntaxhighlight lang="pascal" enclose="none">uses</syntaxhighlight>-clause until final the compound statement [[Begin|<syntaxhighlight lang="pascal" enclose="none">begin</syntaxhighlight>]]…[[End|<syntaxhighlight lang="pascal" enclose="none">end.</syntaxhighlight>]] is free of choice. | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | </syntaxhighlight> | ||
− | |||
However, there are some plausible considerations. | However, there are some plausible considerations. | ||
− | * A [[Type|<syntaxhighlight lang="pascal" enclose="none">type</syntaxhighlight>-section]] comes prior any section that can use types, e.g. [[Var|<syntaxhighlight lang="pascal" enclose="none">var</syntaxhighlight>-sections]] or routine declarations. | + | * A [[Type|<syntaxhighlight lang="pascal" enclose="none">type</syntaxhighlight>-section]] comes prior any section that can use types, e.g. [[Var|<syntaxhighlight lang="pascal" enclose="none">var</syntaxhighlight>-sections]] or [[Routine|routine]] declarations. |
− | * Since [[Goto|<syntaxhighlight lang="pascal" enclose="none">goto</syntaxhighlight>]] is known as the devil's tool, a [[Label|<syntaxhighlight lang="pascal" enclose="none">label</syntaxhighlight>-section]], if any, is as close as possible to the | + | * Since [[Goto|<syntaxhighlight lang="pascal" enclose="none">goto</syntaxhighlight>]] is known as the devil's tool, a [[Label|<syntaxhighlight lang="pascal" enclose="none">label</syntaxhighlight>-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 <syntaxhighlight lang="pascal" enclose="none">var</syntaxhighlight>-section comes in front of a [[Threadvar|<syntaxhighlight lang="pascal" enclose="none">threadvar</syntaxhighlight>-section]]. A [[Const|<syntaxhighlight lang="pascal" enclose="none">const</syntaxhighlight>-section]] comes before a [[Resourcestring|<syntaxhighlight lang="pascal" enclose="none">resourcestring</syntaxhighlight>-section]]. | * Generally you go from general into specifics: For example a <syntaxhighlight lang="pascal" enclose="none">var</syntaxhighlight>-section comes in front of a [[Threadvar|<syntaxhighlight lang="pascal" enclose="none">threadvar</syntaxhighlight>-section]]. A [[Const|<syntaxhighlight lang="pascal" enclose="none">const</syntaxhighlight>-section]] comes before a [[Resourcestring|<syntaxhighlight lang="pascal" enclose="none">resourcestring</syntaxhighlight>-section]]. | ||
* <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. |
Revision as of 23:02, 29 November 2018
│
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.]