3. プログラムヘッダと宣言部
プログラムはヘッダとブロックで構成されています。ブロックは宣言部と実行部で構成されており、実行部は複合文で構成されています。
プログラム =
[プログラムヘッダ (program)]
プログラムブロック.
プログラムブロック =
[uses 句]
ブロック.
ブロック =
[ラベル宣言部 (label)]
[定数定義部 (const)]
[型定義部 (type)]
[変数宣言部 (var)]
[手続き・関数宣言部 (procedure / function)]
実行部 (begin~end).
実行部 =
複合文.
Delphi の場合、ブロック内にある実行部以外の節 (宣言部 / 定義部) は、順序を入れ替えたり、同じ節を複数回記述する事ができますが、標準 Pascal では記述順序が決まっています。Delphi のコードを標準 Pascal で動作させる際に忘れがちなので注意してください。
3.1. プログラムヘッダ (Program heading )
プログラムヘッダはプログラムと外部環境とのコミュニケーションのためにあります。
プログラムヘッダ =
PROGRAM 識別子 ["(" パラメータリスト ")"] ";".
パラメータリスト =
識別子 { "," 識別子}.
プログラム名は殆どの環境でファイル名です。例えば Hello.pas
のプログラム名は Hello
となります。
program Hello(output);
begin
Writeln('Hello, World.');
end.
パラメータリストに書かれた識別子はプログラムのブロックの変数宣言部 (3.5. 節) で局所変数と同じように宣言する必要があります。
C 言語の main() 関数の argc / **argv をご存知でしたら一旦完全に忘れてください。あれを想定していると混乱すると思います。
さらに混乱させてしまうかもしれませんが、Delphi 等のモダンな Pascal はこのプログラムヘッダを無視します。つまり記述する必要はありません。しかしながら、標準 Pascal での存在意義を知ることも大事だと思いますので、プログラムヘッダはあるものとして話を続けます。
See also:
3.2. ラベル宣言部 (Label declaration part)
プログラムの文には goto 文で参照できるように ラベル + ':'
を書きます。ラベルは使用する前にラベル宣言部で宣言しておく必要があります。ラベルはカンマ区切りで複数登録できます。
ラベル宣言部 =
label (符号なし整数 | 識別子) {"," (符号なし整数 | 識別子)} ";".
符号なし整数は 0~9999 (Delphi の場合 0~4294967295) の範囲内の値です。
program labeltest(output);
label
1;
begin
1:
goto 1;
end.
Delphi の場合にはラベルに識別子が使えます。
program labeltest(output);
label
loop;
begin
loop:
goto loop;
end.
3.3. 定数定義部 (Constant declaration part)
定数定義部では定数の同義語となる名前を定義します。
定数定義部 =
const 識別子 "=" 定数 ";" {識別子 "=" 定数 ";"}.
定数 =
(数値 | 文字列 | 定数名).
定数の右辺には前方で定義した定数名を指定する事もできます。
program consttest(output);
const
STR = 'Hello,world.';
INT = 60;
INT2 = INT; // 60
begin
end.
See also:
(3.3.1.) 定数式 (Constant Expressions)
Delphi の場合、定数式も使えます。
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 識別子 ":" 型識別子 "=" 定数 ";" {識別子 ":" 型識別子 "=" 定数 ";"}.
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: 型付き定数を使った定数式
See also:
3.4. 型定義部 (Type definition part)
型定義部ではユーザー定義の型を定義します。
型定義部 =
type 識別子 "=" 型 ";" {識別子 "=" 型 ";"}.
型 =
(単純型 | 構造型 | ポインタ型).
See also:
3.5. 変数宣言部 (Variable declaration part)
変数宣言部では変数を使えるように宣言します。
変数宣言部 =
var 識別子 {"," 識別子} ":" 型 ";" {識別子 {"," 識別子} ":" 型 ";"}.
こんな感じです。
var
i, l: Integer;
c: Char;
Delphi ではグローバル変数に限り、変数の宣言と同時に初期化を行うことができます。
var
i: Integer = 7;
グローバル変数宣言が初期値を伴わない場合、その変数が占有するメモリはゼロで初期化されます。
See also:
(3.5.1.) プログラムヘッダのパラメータ
プログラムヘッダのパラメータリストに書かれたパラメータは外部実体であり、通常はファイルです。
定義済み変数である Input と Output は例外的に変数宣言部に記述する必要はありませんが、それ以外のパラメータはこの変数宣言部で宣言する必要があります。
変数 | 型 | 説明 |
---|---|---|
Input | テキストファイル | 標準入力 |
Output | テキストファイル | 標準出力 |
例えば標準出力を使いたい場合にはプログラムヘッダのパラメータに Output が必要で、標準入力を使いたい場合にはプログラムヘッダのパラメータに Input が必要です。
例えば標準入出力を使うにはプログラムヘッダのパラメータを次のように指定します。Input と Output の並びは逆でも構いません。
program Console(Input, Output);
begin
end.
次の例ではパラメータ ABC と DEF を宣言しています。
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 変数が標準入力に割り当てられるようになります。
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 and Function declaration part)
手続きや関数はこの手続き・関数宣言部で使用前に宣言する必要があります。手続き・関数宣言部は基本的にプログラムと同じ形式です。
手続き・関数宣言部 =
手続き・関数 {手続き・関数}.
手続き・関数 =
手続き・関数 (procedure | function) [指令]
手続き・関数ブロック.
手続き・関数ブロック =
[ラベル宣言部 (label)]
[定数定義部 (const)]
[型定義部 (type)]
[変数宣言部 (var)]
[手続き・関数宣言部 (procedure / function)]
実行部 (begin~end).
実行部 =
複合文.
手続きと関数は、まとめてルーチンと呼ばれます。
3.7. 識別子とラベルの有効範囲
同じレベルかつ同じ有効範囲 (スコープ) の中では同じ識別子 (やラベル値) を 2 回以上宣言できません。
索引
[ ← 2. データの概念: 単純データ型 ] [ ↑ 目次へ ] [ → 4. 記法: 動作の概念 ]