Difference between revisions of "Program"
(substitute legacy syntaxhighlight syntax; correct grammar mistake; insert link to Program Structure; insert information about scope) |
|||
Line 5: | Line 5: | ||
== main program == | == main program == | ||
− | <syntaxhighlight lang="pascal" | + | <syntaxhighlight lang="pascal" inline>program</syntaxhighlight> is a [[Reserved word|reserved word]] that introduces a classical program source code file: |
<syntaxhighlight lang="pascal" highlight="1"> | <syntaxhighlight lang="pascal" highlight="1"> | ||
program hiWorld(input, output, stderr); | program hiWorld(input, output, stderr); | ||
Line 16: | Line 16: | ||
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|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" | + | 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, | + | The file descriptor list is completely ignored, except in [[Mode iso|<syntaxhighlight lang="pascal" inline>{$mode ISO}</syntaxhighlight>]]. |
− | The [[Text|<syntaxhighlight lang="pascal" | + | 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 [https://svn.freepascal.org/cgi-bin/viewvc.cgi/tags/release_3_0_4/rtl/linux/system.pp?view=markup#l367 <tt>rtl/linux/system.pp</tt>]) |
− | + | Therefore with FPC the following complete source code example compiles identically as does the previous example. | |
<syntaxhighlight lang="pascal"> | <syntaxhighlight lang="pascal"> | ||
begin | begin | ||
Line 29: | Line 30: | ||
== program structure == | == program structure == | ||
− | A <syntaxhighlight lang="pascal" | + | 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" | + | # 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" | + | # 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" | + | 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. | However, there are some plausible considerations. | ||
− | * A [[Type|<syntaxhighlight lang="pascal" | + | * 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. |
− | * Since [[Goto|<syntaxhighlight lang="pascal" | + | * 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. |
− | * Generally you go from general into specifics: For example a <syntaxhighlight lang="pascal" | + | * 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="pascal" inline>threadvar</syntaxhighlight>-section]]. A [[Const|<syntaxhighlight lang="pascal" inline>const</syntaxhighlight>-section]] comes before a [[Resourcestring|<syntaxhighlight lang="pascal" inline>resourcestring</syntaxhighlight>-section]]. |
− | * <syntaxhighlight lang="pascal" | + | * <syntaxhighlight lang="pascal" 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. |
− | * 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" | + | * 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|Global compiler directives]], especially such that allow or restrict what can be written (e.g. <syntaxhighlight lang="pascal" | + | * [[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" | + | 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=" | + | <syntaxhighlight lang="delphi"> |
program sectionDemo(input, output, stderr); | program sectionDemo(input, output, stderr); | ||
Line 82: | Line 83: | ||
* [[Unit|unit]] | * [[Unit|unit]] | ||
* [[Library|library]] | * [[Library|library]] | ||
+ | * [[Program Structure|program structure]] in the Object Pascal Introduction series |
Revision as of 08:27, 23 May 2020
│
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 program name will identify the global scope, thus it can be used to write fully-qualified identifiers.
The file descriptor list is completely ignored, except 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)
Therefore 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.
- A (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.]
see also
- unit
- library
- program structure in the Object Pascal Introduction series