Edited at

<3> プログラムヘッダと宣言部 (標準 Pascal 範囲内での Delphi 入門)


3. プログラムヘッダと宣言部

プログラムはヘッダブロックで構成されています。ブロックは宣言部と実行部で構成されており、実行部は複合文で構成されています。

プログラム = 

 [プログラムヘッダ (program)]
 プログラムブロック.

プログラムブロック =
 [uses 句]
 ブロック.

ブロック =
 [ラベル宣言部 (label)]
 [定数定義部 (const)]
 [型定義部 (type)]
 [変数宣言部 (var)]
 [手続き・関数宣言部 (procedure / function)]
 実行部 (begin~end).

実行部 =
複合文.


3.1. プログラムヘッダ

プログラムヘッダはプログラムと外部環境とのコミュニケーションのためにあります。

プログラムヘッダ = 

 PROGRAM 識別子 ["(" パラメータリスト ")"] ";".
パラメータリスト =
識別子 { "," 識別子}.

プログラム名は殆どの環境でファイル名です。例えば Hello.pas のプログラム名は Hello となります。


Hello.pas

program Hello(output);

begin
Writeln('Hello, World.');
end.

パラメータリストに書かれた識別子はプログラムのブロックの変数宣言部 (3.5. 節) で局所変数と同じように宣言する必要があります。

C 言語の main() 関数の argc / **argv をご存知でしたら一旦完全に忘れてください。あれを想定していると混乱すると思います。

さらに混乱させてしまうかもしれませんが、Delphi 等のモダンな Pascal はこのプログラムヘッダを無視します。つまり記述する必要はありません。しかしながら、標準 Pascal での存在意義を知ることも大事だと思いますので、プログラムヘッダはあるものとして話を続けます。

See also:


3.2. ラベル宣言部

プログラムの文には goto 文で参照できるように ラベル + ':' を書きます。ラベルは使用する前にラベル宣言部で宣言しておく必要があります。ラベルはカンマ区切りで複数登録できます。

ラベル宣言部 = 

label (符号なし整数 | 識別子) {"," (符号なし整数 | 識別子)} ";".

符号なし整数は 0~9999 (Delphi の場合 0~4294967295) の範囲内の値です。


labeltest.pas

program labeltest(output);

label
1;
begin
1:
goto 1;
end.

Delphi の場合にはラベルに識別子が使えます 1


labeltest.pas

program labeltest(output);

label
loop;
begin
loop:
goto loop;
end.


3.3. 定数定義部

定数定義部では定数の同義語となる名前を定義します。

定数定義部 = 

const 識別子 "=" 定数 ";" {識別子 "=" 定数 ";"}.

定数 =
(数値 | 文字列 | 定数名).

定数の右辺には前方で定義した定数名を指定する事もできます。


consttest.pas

program consttest(output);

const
STR = 'Hello,world.';
INT = 60;
INT2 = INT; // 60
begin
end.

See also:


(3.3.1.) 定数式 (Constant Expressions)

Delphi の場合、定数式も使えます。


consttest.pas

program consttest(output);

const
STR = 'Hello,’ + ’world.';
INT = 20 * 30;
begin
end.

定数式には次の関数も利用可能です。

関数
パラメータ
説明

Abs()
単純型の定数または
単純値
値の絶対値を返す

Chr()
順序型の定数または
順序数
順序数をもつ文字を返す

Hi()
整数型の定数または
整数値
上位バイトを
符号なしの値として返す

High()
順序型の定数または
順序数
型の範囲内での最大値を返す

Length()
文字列または配列
文字の数や配列の要素数を返す

Lo()
整数型の定数または
整数値
下位バイトを
符号なしの値として返す

Low()
順序型の定数または
順序数
型の範囲内での最小値を返す

Odd()
順序型の定数または
順序値
値が奇数のときに
True を返す

Ord()
文字型の定数または
文字定数
現在の文字集合での
順序数を返す

Pred()
整数型の定数
値の一つ前の値を返す

Round()
実数型の定数または
実数値
値を丸めた整数を返す

Succ()
整数型の定数または
整数値
値の一つ次の値を返す

Swap()
整数型の定数または
整数値
整数値(ワード)の上位バイトと
下位バイトを入れ替える

Trunc()
実数型の定数または
実数値
値の整数部を返す

See also:


(3.3.2.) 型付きの定数 (Typed Constants)

Delphi の場合、型付きの定数も定義できます。

定数定義部 = 

const 識別子 ":" 型識別子 "=" 定数 ";" {識別子 ":" 型識別子 "=" 定数 ";"}.


consttest.pas

program consttest(output);

const
STR: string = 'Hello,world.';
INT: Integer = 60;
begin
end.

但し、型付きの定数を定数式の中に含める事はできません。

const

INT1 = 60; // 真の定数
INT2: Integer = 60; // 型付き定数
INT3 = INT1 + 10; // OK: 真の定数を使った定数式
INT4 = INT2 + 10; // NG: 型付き定数を使った定数式

この型付きの定数はDelphi 5 までは書き込み可能でした。実質的には初期化済み変数という事になります。

image.png

型付きの定数の挙動は Delphi 2 から {$J} コンパイラ指令で制御できるようになり 2、Delphi 6 において {$J-} (書き込み不可能な型付き定数) がデフォルトとなりました 3

See also:


3.4. 型定義部

型定義部ではユーザー定義の型を定義します。

型定義部 = 

type 識別子 "=" 型 ";" {識別子 "=" 型 ";"}.

型 =
(単純型 | 構造型 | ポインタ型).

See also:


3.5. 変数宣言部

変数宣言部では変数を使えるように宣言します。

変数宣言部 = 

var 識別子 {"," 識別子} ":" 型 ";" {識別子 {"," 識別子} ":" 型 ";"}.

こんな感じです。

var

i, l: Integer;
c: Char;

Delphi ではグローバル変数に限り、変数の宣言と同時に初期化を行うことができます。

var 

i: Integer = 7;

グローバル変数宣言が初期値を伴わない場合、その変数が占有するメモリはゼロで初期化されます。

See also:


(3.5.1.) プログラムヘッダのパラメータ

プログラムヘッダのパラメータリストに書かれたパラメータは外部実体であり、通常はファイルです。

定義済み変数である InputOutput は例外的に変数宣言部に記述する必要はありませんが、それ以外のパラメータはこの変数宣言部で宣言する必要があります。

変数

説明

Input
テキストファイル
標準入力

Output
テキストファイル
標準出力

例えば標準出力を使いたい場合にはプログラムヘッダのパラメータに Output が必要で、標準入力を使いたい場合にはプログラムヘッダのパラメータに Input が必要です。

例えば標準入出力を使うにはプログラムヘッダのパラメータを次のように指定します。InputOutput の並びは逆でも構いません。

program Console(Input, Output);

begin

end.

次の例ではパラメータ ABCDEF を宣言しています。

program Console(ABC, Output, Input, DEF);

var
ABC: file of Text;
DEF: file of Text;
begin

end.

さて、


Delphi 等のモダンな Pascal はこのプログラムヘッダを無視します。つまり記述する必要はありません。


と書きましたが、Delphi で標準出力や標準入力を使いたい場合にはどうすればいいのでしょうか?

program Console;

{$APPTYPE CONSOLE}
begin

end.

Delphi では {$APPTYPE CONSOLE} 指令を記述するか、プロジェクトオプションでコンソールアプリケーションを生成するように指定すると、Output 変数が標準出力に、Input 変数が標準入力に割り当てられるようになります。

image.png

See also:


(3.5.2) インライン変数宣言 (Inline Variable Declaration)

Pascal ではブロック中で変数を宣言することはできないのですが、Delphi は 10.3 Rio から型推論可能なインライン変数宣言が可能になりました。

例えば従来このように記述していた for 文は、

var

i: Integer;
begin
for i := 0 to 9 do
writeln(i);
end;

インライン変数宣言と型推論のおかげで次のように記述可能になっています。

begin

for var i := 0 to 9 do
writeln(i);
end;


3.6. 手続き・関数宣言部

手続き関数はこの手続き・関数宣言部で使用前に宣言する必要があります。手続き・関数宣言部は基本的にプログラムと同じ形式です。

手続き・関数宣言部 = 

手続き・関数 {手続き・関数}.

手続き・関数 =
 手続き・関数 (procedure | function) [指令]
 手続き・関数ブロック.

手続き・関数ブロック =
 [ラベル宣言部 (label)]
 [定数定義部 (const)]
 [型定義部 (type)]
 [変数宣言部 (var)]
 [手続き・関数宣言部 (procedure / function)]
 実行部 (begin~end).

実行部 =
複合文.

手続きと関数は、まとめてルーチンと呼ばれます。


3.7. 識別子とラベルの有効範囲

同じレベルかつ同じ有効範囲 (スコープ) の中では同じ識別子 (やラベル値) を 2 回以上宣言できません。


索引

[ ← 2. データの概念: 単純データ型 ] [ ↑ 目次へ ] [ → 4. 記法: 動作の概念 ]





  1. この拡張は BLS Pascal (Turbo Pascal の前身) 由来のようです。 



  2. つまり、Turbo Pascal や Delphi 1 では型付きの定数は常に書き込み可能でした。 



  3. Delphi 2 のマニュアルには {$J-} がデフォルトであるかのように書かれていますが、実際には {$J+} がデフォルトです。