Object Pascal のプログラムのソースコードは、好き勝手にデータの宣言や処理を並べただけではプログラムとして成り立ちません。決められた構成にしたがって記述する必要があります。
その基本的な構成について説明します。
プログラムの構成 |
|---|
Object Pascalでは、プログラムの構成を以下のように定義しています。
【プログラム】
| @ プログラムヘッダ (program) |
| A uses句 |
| B ブロック |
| C プログラム終了記号 (.) |
プログラムは、プログラムヘッダの「program」で始まり、プログラムの終了記号「.」で終わります。
その中にuses句とブロックがあります。順序はuses句が先です。uses句が不要な場合は省略します。
プログラムファイルには、この構成を一組だけ記述します。複数記述することはできません。
プログラムヘッダ |
|---|
プログラムヘッダは、programキーワードに続けてプログラム名の識別子を指定します。末尾は「;」で終了します。
【プログラムヘッダ】
program 識別子;
標準Pascalでは、識別子の後に「(パラメータリスト)」で外部で定義されたファイルなど受け取ります。例:「program Hello(Input, Output);」。
Object Pascal(Free Pascal)ではプログラムヘッダでパラメータリストを受け取りません。指定しても無視されエラーにもなりません。
プログラム名には途中に「.」を含むことができます。「Hello」、「Hello.world」、「Hello.Hanako.Yamada」も有効です。「.」で始まったり「.」で終了することはできません。また「.」が連続するのもだめです。また「.」で分離されたものも識別子のルールに従います。「Hello.2nd」では、「2nd」が数字で始まっているので識別子になりません。
プログラム名は、コンパイルで作成されてるexeファイルの名前にはなりません。exeファイルの名前は、プログラムのソースコードのファイル名の拡張子をexeに変えたものになります。通常はソースファイル名とプログラム名は合わせるのがよいと思いますが、異なっていても問題はありません。
ソースファイル名が「Hello.pas」で、プログラムヘッダが「program Project1;」の場合、コンパイルしてできる実行ファイルは「Hello.exe」になります。コンパイルオプションで名前を指定すればその限りではありませんが。
では、識別子は何のためにあるかというと、そのプログラム内(ソースファイル内)のネームスペースになります。「Project1」で宣言された識別子「X」はそのままでも有効ですが、正式には「Project1.X」となります。他のユニットの「X」と区別するために使用することができます。しかし、プログラムの識別子はプログラムのスコープ内では他のユニットと競合することはないので(Project1.が優先となるため)、明示的に示したいという理由でもなければ特に使用する機会はないと思います。
標準Pascalではプログラムヘッダは必須ですが、Object Pascalではプログラムヘッダを省略することができます。省略時は「;」も不要です。
uses句 |
|---|
Object Pascalでは、プログラムをモジュール化してコードを管理する仕組みとしてユニット(unit)があります。ユニットは、型、定数、変数、手続き、関数などのコードをまとめプログラムで使用宣言することによりそのユニットのコードを利用することができます。ユニットが他のユニットを使用することもできます。
この使用宣言を行うのが「uses句」です。usesキーワードの後に使用するユニット名の識別子リストを並べて「;」で終了します。ユニット名リストは一つ以上のユニット名を「,」で区切って並べます。
【uses句】
uses
識別子1, 識別子2, ... , 識別子n;
使用するユニットがない場合は「uses句」を省略します。
ブロック |
|---|
ブロックは、Object Pascalプログラムの主要構成要素となります。プログラムでけではなく、手続きや関数、そしてユニットでもこのブロックまたはブロック要素の一部を利用して成り立っています。
ブロックは、宣言部と実行文部で構成されます。
【ブロック】
| @ ラベル宣言部 (label) A 定数宣言部] (const) B リソース文字列宣言部 (resourcestring) C 型宣言部 (type) D 変数宣言部 (var) E スレッド変数宣言部(threadvar) F プロパティ宣言部 (property) G 手続き・関数宣言部 (procedure / function) |
| H 実行文部 (begin 〜 end) |
@〜Gが各宣言部です。宣言部は、順序を変えたり、他の宣言や定義をはさんで複数回記述する事ができます。必要がないものは省略できます。
Hが実行分部です。実行文部は、処理をするための実行文を記述します。何もしないというのも可能ですが、その場合も begin end の組は必要です。
@〜Gについてはすべて宣言部としましたが、
参考文献[1]「Pascal User Manual and Report」では、定数と型については宣言部(declaration part)ではなく定義部(definition part)となっています。
| Block = | label declaration part constant definition part type definition part variable declaration part threadvariable declaration part property declaration part procedure and aunction adclaration part statement part. |
宣言(declaration)は、その識別子に対して型や引数/戻り値などの特徴(値や構成要素は含まない)を記述するものでストレージは割り当てられません。
定義(definition)は、その識別子に対してその内容や構成を記述してストレージを割り当てます。
定義では識別子の宣言も含まれます。宣言は、矛盾がなければ複数回行うことができます。宣言+定義の場合、2回宣言していることになり、その名前の特徴は一致する必要があります。
プログラム言語の機能が追加されることにより、それぞれが宣言のみなのか定義も含まれるのかは一概には言えません。
定義も宣言を含むので、ここでは、ブロックの@〜Fはすべて宣言部とします。
プログラム終了記号 |
|---|
プログラムの終了記号は「.」(ドット記号)です。
プログラムの記述終了を表します。
よく、Pascalのプログラムは「program」で始まって「end.」で終わると説明しているものが多くありますが、実際には、「end」はブロック内の実行文部「begin 〜 end」の一部です。Pascalのプログラムは「program」で始まって「.」で終わり、その間にuses句とブロックが存在するというのが正しいと思います。
programファイルのひな型(例) |
|---|
Object Pascalのprogramファイルのひな型について以下の投稿を参照してください。
Free PascalのOBJFPCモードを想定したひな型の例です。
特に何もしないプログラムコードです。これにプログラムの構成ルールにしたがってプログラムコードを追加すると便利です。