Difference between revisions of "Program"

From Free Pascal wiki
Jump to navigationJump to search
(review)
(→‎main program: ISO mode)
Line 18: Line 18:
 
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 error.
 
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 error.
  
The file descriptor list is completely ignored.
+
The file descriptor list is completely ignored, but in [[Mode iso|<syntaxhighlight lang="pascal" enclose="none">{$mode ISO}</syntaxhighlight>]].
The [[Text|<syntaxhighlight lang="pascal" enclose="none">text</syntaxhighlight>]] [[Variable|variables]] {{Doc|package=RTL|unit=system|identifier=input|text=<syntaxhighlight lang="pascal" enclose="none">input</syntaxhighlight>}}, {{Doc|package=RTL|unit=system|identifier=output|text=<syntaxhighlight lang="pascal" enclose="none">output</syntaxhighlight>}} and {{Doc|package=RTL|unit=system|identifier=stderr|text=<syntaxhighlight lang="pascal" enclose="none">stderr</syntaxhighlight>}} are always opened and their names can not be changed. (cf.: <syntaxhighlight lang="pascal" enclose="none">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>])
+
The [[Text|<syntaxhighlight lang="pascal" enclose="none">text</syntaxhighlight>]] [[Variable|variables]] {{Doc|package=RTL|unit=system|identifier=input|text=<syntaxhighlight lang="pascal" enclose="none">input</syntaxhighlight>}}, {{Doc|package=RTL|unit=system|identifier=output|text=<syntaxhighlight lang="pascal" enclose="none">output</syntaxhighlight>}} and {{Doc|package=RTL|unit=system|identifier=stderr|text=<syntaxhighlight lang="pascal" enclose="none">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" enclose="none">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>])
  
 
Thus with FPC the following complete source code example compiles identically as does the previous example.
 
Thus with FPC the following complete source code example compiles identically as does the previous example.

Revision as of 18:29, 25 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. There can be at most one uses-clause and it has to be at the top of the program right after the (depending on used compiler possibly optional) program header.

program hiWorld(input, output, stderr);

uses
	// sysutils for applicationName
	// gettext for internationalization routines
	sysutils, gettext;

resourcestring
	helloWorld = 'Hi!';

begin
	translateResourcestrings(applicationName() + '.%s.mo');
	writeLn(helloWorld);
end.

What comes thereafter, the exact order and number of various sections after the 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 block 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