翻訳集団の概念

指定しなくてもよい部、節、段落の見出し

このCOBOLシステムでは、ANSI標準COBOLで必要とされる"red-tape"文のうち、指定してもしなくてもよいものがある。しかし、FLAG指令を使用すると、それらの文が抜けているときに、COBOLコンパイラに警告メッセージを出させるようにすることができる。このマニュアルでは、指定しても指定しなくてもよい文を示すために、それらの文の前後を角かっこ[ ]で囲み、その回りを四角でを囲んでいる。その隣に示した記号は、その機能が任意指定となっている方言を表わす。

予約語

すべての予約語(reserved word)を、付録、予約語に列挙してある。

外部リポジトリ

外部リポジトリには、プログラム定義、クラス定義、インターフェイス定義に指定された情報が格納される。

これらのソース単位について格納された情報には、起動および妥当性のチェックに必要なすべての情報が含まれていなければならない。具体的には、下記の情報が必要である。

ソース単位に関するこれらの情報のうち、外部名を除いたものをシグネチャと呼ぶ。

REPOSITORY指令がON指定と共に指定された場合、コンパイラは各翻訳単位をコンパイルするさいにその情報を外部リポジトリに入れる。

REPOSITORYが明示的にまたは省略値としてCHECKING指定と共に指定された場合、定義およびプロトタイプのそれらの特性が指定されていて外部リポジトリ中の対応する定義と合致しないと、コンパイラは警告メッセージを発する。

ソース単位の名前と外部リポジトリ中の情報の関連の詳細は、環境部の章のリポジトリ段落の節に指定される。  

CALLプロトタイプ

CALLプロトタイプは、呼び出されるサブプログラムの特性を定義するのに役立つ、プログラム宣言ないしプログラムの骨組みである。それらの特性には、必要なパラメータの数、それらのパラメータの型、呼出し方式がある。プロトタイプが存在するサブプログラムを参照するCALL文がソース要素中に入っている場合、そのCALL文はそのプロトタイプと照合チェックされる。明確な不一致がある場合には、エラーとされる。CALL文中に定義されていない特性が何かある(たとえば、呼出し方式)場合、それらプロトタイプから引き出される。

CALLプロトタイプは完全なプログラムとして定義され、そのPROGRAM-ID段落中にEXTERNAL句が指定される。そのプログラム構造は、プログラム名段落を伴う見出し部、連絡節を伴うデータ部、手続き部の見出し、およびENTRY文のみから構成されなければならない。ただし、ENTRY文は指定してもしなくてもよい。これらのCALLプロトタイプは他の型の翻訳単位の前に置かれる。その方法はマルチプログラム原始ファイルの場合と同様である。

CALL文をチェックさせるすべてのサブプログラムに関して、そのCALL文が含まれる翻訳単位の見出し部の見出しの前に、CALLプロトタイプのコピーを含めなければならないことに注意。

ファイル

ファイル結合子

ファイル結合子はファイルに関する情報が格納されている領域であって、ファイル名と物理ファイルの間およびファイル名とそれに関連するレコード領域との間の連絡に使用される。

順ファイル

この章において、特に「行」または「レコード」と断らずに「順ファイル」または「順編成」という用語を使用している場合、その記述内容は両方のファイルに当てはまる。省略時解釈の順ファイルの動作は、SEQUENTIALコンパイラ指令の影響を受ける。

レコード順ファイル

レコード順ファイルでは、ファイル中のレコードを確立されている順に呼び出すことができる。レコードの順序は、ファイルにレコードを書き込むことによって確立される。

行順ファイル

行順ファイルでは、テキストファイルのレコードを確立されている順序に従って呼び出すことができる。行順ファイルのフォーマットは、オペレーティングシステムのエディタによって作成されるフォーマットと同じである。格納されるレコードの末尾の空白は削除される。

レコード順ファイルおよびdialm.gif行順ファイルの編成

順ファイルにおいては、各レコードに先行レコードと後行レコードが必ず存在する。ただし、先頭のレコードには先行レコードはなく、 末尾のレコードには後行レコードはない。先行/後行関係は、ファイルを作成するときのWRITE文によって決まる。いったん確立された先行/後行関係は通常は変わらない。ただし、ファイルの末尾にレコードが追加された場合は、例外である。

呼出し法

順ファイルに適用できる呼出し法は、順呼出し法だけである。つまり、レコードを呼び出す順序は、 レコードが書き出された順序である。

相対ファイル

相対ファイルを使用すると、プログラマは大記憶ファイル内に書かれているレコードを、乱呼び出しすることも順呼び出しすることもできる。 相対ファイル中の各レコードは、正の整数値によって識別される。この整数値は、ファイル中のレコードの位置の順序番号を表わしている。

相対ファイルの編成

相対ファイル編成は、ディスク装置上でだけ使用できる。相対ファイルは、相対レコード番号(relative record number)によって識別されるレコードから構成される。相対ファイルは、1論理レコードを保持する領域が連続して並んでいるものと考えることができる。各領域には相対レコード番号が付けられている。たとえば、相対レコード番号10番は10番目のレコード領域を指す。

呼出し法

順呼出し法(sequential access method)では、ファイル中に現存するレコードを相対レコード番号の昇順に呼び出す。

乱呼出し法(random access method)では、レコードを呼び出す順序はプログラマが制御する。求 めるレコードを呼び出すには、相対レコード番号を相対キーデータ項目に設定する。

動的呼出し法(dynamic access method)では、プログラマが順呼出しと乱呼出しを自由に切り替えることができる。このためには、適切なファイル入出力文を使用する。

索引ファイル

索引ファイルを使用すると、プログラマは大記憶ファイル内に書かれているレコードを、乱呼び出し することも順呼び出しすることもできる。索引ファイル中の各レコードは、その中の1つ以上のキー項目の値によって識別される。

索引ファイルの編成

索引ファイルは大記憶ファイルであり、その中のレコードはキーの値によって呼び出される。キーはレコード記述に定義する。1つ以上の項目をキーに指定できる。各キー項目には索引が付けられる。各索引はレコード中のキーデータ項目の内容に基づいて、そのデータレコードを呼び出す論理的な経路となる。

ファイルのファイル管理記述項のRECORD KEY句に指定したデータ項目が、そのファイルの主レコードキー(primary record key)となる。 ファイル中のレコードの挿入、更新、および削除の対象となるレコードは主レコードキーによってのみ識別される。したがって、主レコードキーの値は一意でなければならず、レコードを更新する際に変更されてはならない。

ファイルのファイル管理記述項のALTERNATE RECORD KEY句に指定したデータ項目は、そのファイルの副レコードキー(alternate record key)となる。DUPLICATES指定をしておけば、副レコードキーの値は一意でなくてもよい。副レコードキーを使用することによって、ファイルからレコードを検索する際の代わりの呼出し経路とすることができる。

このCOBOLシステムでは、分割キーを使えるように機能が拡張されている。分割キーとは、いくつかのデータ項目から構成されるキーである。レコード記述の中では、それらのデータ項目は互いに隣接し ていなくても構わないものである。

呼出し法

順呼出し法では、レコードキーの値の昇順にレコードを呼び出す。同じレコードキーの値をもつレコードの組の中では、レコードはその組の中で書き出された順に呼び出される。

乱呼出し法では、レコードを呼び出す順序はプログラマが制御する。求めるレコードを呼び出すには、レコードキーデータ項目にレコードキーの値を設定する。

動的呼出し法では、プログラマが順呼出しと乱呼出しを自由に切り替えることができる。そのためには、適切なファイル入出力文を使用する。

共有モード

共有モードとは、ファイルを共有しレコードのロックを行うか否かを示すとともに、ファイルに関して許す共有(または非共有)の度合いを表す。共有モードには、該当のOPENの期間中に、他のファイル結合子を通じて共有ファイルに加えることのできる処理を指定する。

共有モードの確立に関して、OPEN文中のSHARING指定はファイル管理記述項中のSHARING句よりも優先する。OPEN文中にSHARING指定がない場合には、共有モードはファイル管理記述項中のSHARING句によって完全に決定される。どちらにも指定がない場合には、下記の条件のうちの最初に満足されるものによって、共有モードが決定される。

共有モードがOPEN文かファイル管理段落の中に指定されている場合でも、上記のリストから決まる場合でも、標準の共有モードに関する規則は同じである。

COBOLのファイル共有機能とその環境内の他のファイル共有機能との間に相互運用性はない。

共有ファイルはディスク上に存在しなければならない。

OPEN文を通じて共有ファイルへのアクセスが許可される前に、ファイルに現在関連している他すべてのファイル結合子によって、共有モードとオープンモードが許可される。それに加えて、現在のOPEN文の共有モードによって、ファイルに現在関連している他すべてのファイル結合子用のすべての共有モードとオープンモードが許可される。(手続き部 - MERGE - OPEN の章のOPEN(開く)文、とくに表、現在は他のファイル結合子によって開かれている利用可能な共有ファイルを開く処理を参照。)

共有モードでは、ファイルへのアクセスは下記のように制御される。

  1. SHARING WITH NO OTHERはファイルを排他的にアクセスすることを指定する。その指定のあるファイルが現在他のファイル結合子を通じて開かれているならば、そのファイル結合子をファイルに関連付けようとしても失敗する。OPEN文が成功したならば、そのファイル結合子が閉じられてないうちに、他のファイル結合子を通じてそのファイルを開こうとする以降の要求は不成功に終わる。レコードロックは無視される。

  2. 読み取り専用モードで共有すると、該当のもの以外のファイル結合子を通じてそのファイルに同時にアクセスするのは、入力モードのみに限定される。入力以外のモードで開かれているファイルをこのファイル結合に関連付けようとすると、エラーとなる。OPEN文が成功したならば、そのファイル結合子が閉じられないうちに、入力以外のモードにある他のファイル結合子を通じてそのファイルを開こうとする以降の要求は不成功に終わる。レコードロックは効力を有する。

  3. 上記以外のいかなるモードで共有する場合も、INPUT, I-O, EXTENDのどれかを指定した他のファイル結合子を通じて、ファイルに同時アクセスすることができる。ただし、他に制限が適用される場合がある。レコードロックは効力を有する。

同じ実行単位または別の実行単位内のランタイム要素や内包されている要素や別のランタイムモジュールの中に、複数のアクセス経路が存在する可能性がある。開く対象のファイルのファイルロックを保持しているファイル結合子のロケーションに関係なく、ファイル共有に矛盾を来す条件が存在する可能性がある。

ファイルロックを設定することは、入出力文の不可分な処理の一部である。

あるファイル結合子に用に確立されたファイルロックおよびすべてのレコードロックは、そのファイル結合子に関して明示的または暗黙的に実行されたCLOSE文によって解除される。

オブジェクト指向COBOLの概念

オブジェクト指向プログラミングについて詳しくは、マニュアル、オブジェクト指向COBOLプログラミング を参照。

オブジェクトとクラス

オブジェクトとは、独自のデータを持ちクラス定義中に定義されているメソッドを共有する、ランタイム要素であるオブジェクトはクラスによって定義される。クラス定義には、データおよびクラスの各オブジェクトに対して呼び出される可能性あるメソッドの特性が記述されている。

各クラスには、ファクトリオブジェクトが1つある。ファクトリオブジェクトには独自の一連のデータとメソッドが備わっている。ファクトリオブジェクトは通常、オブジェクトのインスタンスを生成し、クラスのすべてのインスタンスに共通のデータを維持更新する働きをする。.

オブジェクト参照

オブジェクト参照とは、あるオブジェクトが存在している間そのオブジェクトを一意に参照する値(オブジェクト参照値)を含む、暗黙的(または明示的)に定義されたデータ項目を意味する。暗黙的に定義されたオブジェクト参照とは、予め定義されているオブジェクト参照および、オブジェクトプロパティ、オブジェクトビュー、行中のメソッド呼出しまたは関数から返されるオブジェクト参照である。明示的に定義されたオブジェクト参照とは、USAGE OBJECT REFERENCE句を定義しているデータ記述項によって定義されているデータ項目である。

2つの別個のオブジェクトが同じオブジェクト参照値を持つことはない。各オブジェクトには少なくとも1つのオブジェクト参照がある。

定義済みオブジェクト参照

定義済オブジェクト参照とは、一意名、NULL、SELF、

SELFCLASS、

およびSUPERのいずれかによって参照される、暗黙的に生成されたデータ項目である。各定義済オブジェクト参照にはそれなりの意味がある。それについては、COBOL言語の概念の章の定義済みオブジェクト一意名節に説明がある。

メソッド

ブジェクト中の手続きコードはメソッドに収められる。各メソッドには、独自のメソッド名とデータ部と手続き部がある。メソッドが呼び出されると、その中の手続きコードが実行される。メソッドを呼び出すためには、そのオブジェクトを参照する一意名と該当のメソッド名を指定する。メソッドにパラメータと返却する項目を指定することができる。

メソッド呼出し

INVOKE文を用いてメソッドを呼び出すと,その中の手続きコードが実行される。その際、INVOKE文、行中のメソッド呼出し、

動詞シグネチャの参照、または

オブジェクトプロパティの参照が使用される。メソッド呼出しに対応するメソッド処理系は、メソッド呼出しの対象のオブジェクトの実行時のクラスによって決まる。それは必ずしもオブジェクト参照の定義中に静的に指定されているクラスであるとは限らない。メソッド呼出しを具体的なメソッド処理系に対応付けるために使用されるのは、実行時に実際に参照されるオブジェクトのクラスである。

オブジェクト参照を用いてオブジェクトを指定してメソッドを呼び出す場合は下記のようになる。

  1. 識別されたオブジェクトがファクトリオブジェクトである場合は、ファクトリメソッドが呼び出される。

  2. そうでない場合は、オブジェクトメソッドが呼び出される。

クラス名を用いてオブジェクトを指定してメソッドを呼び出す場合、指定したクラスのファクトリオブジェクトがメソッドを呼び出す対象のオブジェクトとして使用されて、ファクトリメソッドが呼び出される。

メソッドの解明処理は下記のように進められ、該当する最初のものが適用される。

  1. 呼出しに指定されたメソッド名のメソッドがオブジェクトのクラス中に定義されている場合は、そのメソッドが対応付けられる。そうではなく、

  2. 呼出しに指定されたメソッド名のメソッドがオブジェクトのクラスによって継承されたクラス中に定義されている場合は、そのメソッドが対応付けられる。継承されるクラスにはクラス階層のさらに上位の任意のクラスを含む。

  3. メソッドが見つからない場合は、実行時にエラーとなる。

適合性とインターフェイス

このドキュメントで使用する「適合性」という用語にはいくつかの意味がある。オブジェクト指向の観点からは、「適合性」という用語はオブジェクトインターフェイス間の関連を記述するために使用され、継承やインターフェイス定義や適合性チェックといった基本的な機能の基盤となる。


注: 適合性チェックはコンパイル時にのみ行われる。ただし、オブジェクト修飾子を使用する場合、および一般的オブジェクト参照を用いてメソッドを呼び出す場合は、例外である。


オブジェクト指向への準拠

オブジェクトが適合性のあるものであると、オブジェクト自体のクラスのインターフェイス以外のインターフェイスに従ってクラスを指定することができる。適合性とは、あるインターフェイスから別のインターフェイスへの、およびあるオブジェクトからあるインターフェイスへの、一方向性の関連である。

インターフェイス

どのオブジェクトにもインターフェイスがある。オブジェクトのインターフェイスは、名前およびそのオブジェクトでサポートされている各メソッドのパラメータ仕様から構成される。そのメソッドには継承されたメソッドも含む。各クラスにはインターフェイスが2つある。具体的には、ファクトリオブジェクト用のインターフェイスとオブジェクト用のインターフェイスである。

個々のクラスから独立にインターフェイスを定義することもできる。そのためには、インターフェイス定義中に、メソッドプロトタイプを指定する。

インターフェイス間の適合性

下記の条件に該当する場合にのみ、インターフェイス「インターフェイス-1」はインターフェイス「インターフェイス-2」に準拠する。

  1. インターフェイス-2中の各メソッドに対応するメソッドがインターフェイス-1中に存在し、その名前が同じで同じ数のパラメータを取りBY REFERENCEおよびBY VALUEの仕様が一貫している。

  2. インターフェイス-2中のあるメソッドの仮パラメータがオブジェクト参照であるならば、インターフェイス-1中の対応する仮パラメータは下記の規則に従ったオブジェクト参照である。

    1. インターフェイス-2中のパラメータが一般的オブジェクト参照であるならば、インターフェイス-1中の対応するパラメータも一般的オブジェクト参照である。

    2. インターフェイス-2中のパラメータがインターフェイス名を用いて記述されているならば、インターフェイス-1中の対応するパラメータも同じインターフェイス名を用いて記述されている。

    3. インターフェイス-2中のパラメータがクラス名を用いて記述されているならば、インターフェイス-1中の対応するパラメータも同じクラス名を用いて記述されている。また、FACTORY指定およびONLY指定の有無が両方のインターフェイスで同じである。

    4. インターフェイス-2中のパラメータがACTIVE-CLASS句を用いて記述されているならば、インターフェイス-1中の対応するパラメータもACTIVE-CLASSACTIVE-CLASS句を用いて記述され、両方のインターフェイス中でのFACTORY句の有無も同じとなる。

  3. インターフェイス-2中のあるメソッドの仮パラメータがオブジェクト参照でないならば、インターフェイス-1中の対応する仮パラメータに同じANY LENGTH、PICTURE、USAGE、SIGN、SYNCHRONIZED、JUSTIFIED、およびBLANK WHEN ZERO句が指定されている。ただし、下記の例外がある。

    1. 対応する通過文字列が同じである場合に限り、通貨記号は一致する。

    2. DECIMAL-POINT IS COMMA句が両方のインターフェイス中で有効または無効である場合に限り、終止符は一致する。DECIMAL-POINT IS COMMA句が両方のインターフェイスで有効または無効である場合に限り、コンマは一致する。

  4. 対応するメソッド中では、手続き部内のRETURNING指定の有無が同じである。

  5. インターフェイス-2のあるメソッド中の返却する項目がオブジェクト参照であるならば、インターフェイス-1中の対応する返却する項目も下記の規則に従ったオブジェクト参照である。

    1. インターフェイス-2中の返却する項目が一般的オブジェクト参照であるならば、インターフェイス-1中の対応する返却する項目はオブジェクト参照である。

    2. インターフェイス-2中の返却する項目がインターフェイスint-rを識別するインターフェイス名を用いて記述されているならば、インターフェイス-1中の対応する返却する項目は下記のどちらかである。

      1. int-rまたは、int-rを参照するINHERITS句で記述されたインターフェイスを識別するインターフェイス名を用いて記述されているオブジェクト参照。

      2. 下記の規則に従って、クラス名を用いて記述されているオブジェクト参照。

        1. 記述にFACTORY指定が含まれているならば、指定されたクラスのファクトリオブジェクトは、int-rを参照するIMPLEMENTS句で記述される。

        2. 記述にFACTORY指定が含まれていないならば、指定されたクラスのインスタンスオブジェクトは、int-rを参照するIMPLEMENTS句で記述される。

    3. インターフェイス-2中の返却する項目がクラス名用いて記述されているならば、インターフェイス-1中の対応する返却する項目はオブジェクト参照である。ただし、下記の規則に従う。

      1. インターフェイス-2中の返却する項目の記述にONLY指定があるならば、インターフェイス-1中の返却する項目の記述にもONLY指定および同じクラス名が指定されている。

      2. インターフェイス-2中の返却する項目の記述にONLY指定がないならば、インターフェイス-1中の返却する項目の記述には同じクラス名またはそのクラス名のサブクラスが指定されている。

      3. FACTORY指定の有無が同じである。

    4. インターフェイス-2中の返却する項目の記述にACTIVE-CLASS指定が指定されているならば、インターフェイス-1中の対応する返却する項目の記述にもACTIVE-CLASS指定が指定されている。そして、FACTORY指定の有無が同じである。

    インターフェイス-1中のメソッドの返却する項目の記述においてインターフェイス-2が直接的または間接的に参照されているならば、インターフェイス-2中の対応するメソッドの返却する項目の記述においてインターフェイス-1を直接的にも間接的にも参照しない。

  6. インターフェイス-2のあるメソッド中の返却する項目がオブジェクト参照でない場合、対応する返却する項目のPICTURE, USAGE, SIGN, SYNCHRONIZED, JUSTIFIED, BLANK WHEN ZEROの各句が同じである。ただし、下記の例外がある。

    1. 対応する通過文字列が同じである場合に限り、通貨記号は一致する。

    2. DECIMAL-POINT IS COMMA句が両方のインターフェイス中で有効または無効である場合に限り、終止符は一致する。DECIMAL-POINT IS COMMA句が両方のインターフェイスで有効または無効である場合に限り、コンマは一致する。

  7. 適合性チェックの観点からは、集団項目は同じ長さの英数字の基本項目であるとみなされる。

  8. 対応するパラメータでは、OPTIONAL句の有無は同じである。.

パラメータ化されたクラスおよびインターフェイスのための適合性

パラメータ化されたクラスまたはインターフェイスを使用するときは、クラス定義またはインターフェイス定義の全体を通じて、パラメータの代わりに実パラメータのクラスまたはインターフェイスが用いられているかのように、クラスまたはインターフェイスは扱われる。

多相性

多相性とはあるひとつの文で種々の事柄を行えるようにする機能である。COBOLにおいては、ひとつのデータ項目に種々のオブジェクトまたは異なるクラスを保持できることは、そのデータ項目に対するメソッド呼出しは可能性のある多くのメソッドのうちのどれかひとつに対応することを意味する。時には実行前にそのメソッドを識別できることがある。しかし、一般的には、実行するときまでそのメソッドを識別することはできない。

あるクラスのオブジェクトまたはそのクラスの任意のサブクラスを保持するものとして、データ項目を定義することができる。また、あるインターフェイスに準拠するオブジェクトクラスを保持するものとして、データ項目を定義することもできる。インターフェイスを使用する場合、オブジェクト同士のクラス間に関係がまったくないことがありえる。

クラスの継承

クラスの継承とは、あるクラスのインターフェイスと処理系を、他のクラスの基盤として使用する仕組みである。下位のクラス(サブクラスとも言う)は上位のクラス(スーパークラスとも言う)から継承する。サブクラスは継承元のクラス中に定義されているすべてのメソッドを受け継ぐ。その中には、継承元がさらに上位から継承したメソッドも含まれる。サブクラスは継承元のクラス中に定義されているすべてのデータ定義を受け継ぐ。その中には、継承元がさらに上位から継承したデータ定義も含まれる。


注:これは、データを記述した実際のソースコードがアクセス可能であるという意味ではなく、このソースコードに記述されたデータ項目がサブクラスで直接参照可能であるという意味でもない。サブクラスは、そのソースコードにスーパークラス定義のコピーが含まれているかのように取り扱われる、つまり、継承されたデータ項目がサブクラスで定義されていると見なされるという意味である。


継承されたデータ定義には、継承されたデータが、サブクラスのすべてのオブジェクトおよびそのファクトリのために定義されている。各インスタンスオブジェクトそれぞれ、継承されたクラスのインスタンスオブジェクトが持つコピーとは異なる、継承されたデータのコピーを持つ。各ファクトリオブジェクトはそれぞれ、継承されたクラスのファクトリオブジェクトが持つコピーとは異なる、継承されたデータのコピーを持つ。継承されたデータ項目の名前と属性は、継承されたクラス内では不可視である。継承されたオブジェクトデータは、オブジェクトが作成されるときに初期化される。継承されたファクトリデータは、継承元のひとつまたは複数のクラスのファクトリデータから独立して割り当てられ、サブクラスのファクトリが作成されるときに初期化される。継承されたファクトリデータは、データを記述するクラスのファクトリ定義で指定されたメソッドとプロパティを介してのみ、アクセス可能である。継承されたオブジェクトデータは、データを記述するクラスのオブジェクト定義で指定されたメソッドとプロパティを介してのみ、アクセス可能である。サブクラスは、データ定義と同様に、すべてのファイル定義を継承し、データ定義と同様の条項の対象となる。サブクラスが定義するメソッドには、継承されたメソッドが含まれない場合もある。また、サブクラスはデータ定義およびファイル定義を指定できるが、これには、継承されたデータ定義およびファイル定義が含まれなければならない。

サブクラスのインターフェイスは継承元のクラスのインターフェイスに必ず準拠する。ただし、継承元のクラスのメソッドの一部をサブクラスにおいて修正して、別の処理系を用意することができる。

継承元のクラス中でユーザが定義した語はサブクラスに継承されない。したがって、それが継承元のクラスに定義されていないかのように、サブクラスの中で定義することができる。

インターフェイスの継承

インターフェイスの継承とは、インターフェイスの定義を、他のインターフェイスの基盤として使用する仕組みである。インターフェイスを継承すると、継承元のインターフェイスに定義されているすべてのメソッド仕様が受け継がれる。その中には、継承元がさらに上位から継承したメソッド定義も含まれる。継承を受けるインターフェイスにおいて新しいメソッドを定義して、一連の継承したメソッドを補強することができる。継承を受けるインターフェイスは継承元のインターフェイスに必ず準拠しなければならない。.

インターフェイスの処理系

インターフェイスの処理系とは、クラスの基盤として1つ以上のインターフェイス定義を使用する仕組みである。処理するクラスには、処理するインターフェイス定義に指定されたメソッドのすべてを処理しなければならない。これには、処理定義が継承したあらゆるメソッドが含まれる。処理するクラスのファクトリオブジェクトのインターフェイスは、ファクトリオブジェクトで処理されるインターフェイスに準拠していなければならず、処理するクラスのインスタンスオブジェクトのインターフェイスは、インスタンスオブジェクトで処理されるインターフェイスに準拠していなければならない。

パラメータ化されたクラス

パラメータ化されたクラスは一般形をしたクラスないしクラスの骨組みである。その中には仮パラメータが指定されていて、それが後でいくつかのクラス名またはインターフェイス名で置き換えられる。仮パラメータが実パラメータのクラス名またはインターフェイス名で置き換えられて、パラメータ化されたクラスが展開されたときに、パラメータ化されていないクラスとして機能するクラスが生成される。この拡張について詳しくは、ACTUAL-PARAMSコンパイラ指令を参照。

パラメータ化されたクラスのライフサイクルは、この章で後述する、パラメータ化されたクラスのライフサイクル中に定義する。.

パラメータ化されたインターフェイス

パラメータ化されたインターフェイスは一般形をしたインターフェイスないしインターフェイスの骨組みである。その中には仮パラメータが指定されていて、それが後でいくつかのクラス名またはインターフェイス名で置き換えられる。仮パラメータが実パラメータのクラス名またはインターフェイス名で置き換えられて、パラメータ化されたクラスが展開されたときに、パラメータ化されていないインターフェイスとして機能するインターフェイスが生成される。この拡張について詳しくは、ACTUAL-PARAMSコンパイラ指令を参照。

パラメータ化されたインターフェイスのライフサイクルは、この章で後述する、パラメータ化されたインターフェイスのライフサイクル中に定義する。

オブジェクトのライフサイクル

オブジェクトのライフサイクルは、オブジェクトが生成されたときに始まり、オブジェクトが破棄されたときに終わる。

ファクトリオブジェクトのライフサイクル

ファクトリオブジェクトは、実行単位によって最初に参照される前に、生成される。

ファクトリオブジェクトは、実行単位によって最後に参照された後で、破棄される。

オブジェクトのライフサイクル

ファクトリオブジェクトに対してNEWメソッドが呼び出された結果として、オブジェクトが生成される。

実行単位が終了したときに、オブジェクトが破棄される。

実行単位が終了する前に、オブジェクトに対してFINALIZEメソッドが呼び出された場合は、その結果として、オブジェクトが破棄される。

パラメータ化されたクラスのライフサイクル

パラメータ化されたクラスが展開されると、あらゆる点で、パラメータ化されていないクラスと同様に扱われるようになる。

REPOSITORY段落中にパラメータ化されたクラスが指定されたときに、パラメータ化されたクラスの仕様に基づいて、新しいクラス(パラメータ化されたクラスのインスタンス)が生成される。そのクラスは独自のファクトリオブジェクトを持ち、同じパラメータ化されたクラスの他のインスタンスとは完全に別物である。

実行単位内で、パラメータ化された同じクラスを同じ実パラメータで展開して作成された2つのクラスの外部クラス名が同じ場合、その2つは同じクラスインスタンスである。パラメータ化されたクラスを異なる実パラメータで展開して作成された2つのクラスは同じクラスインスタンスではなく、同じ外部クラス名を持たない。

パラメータ化されたインターフェイスのライフサイクル

パラメータ化されたインターフェイスが展開されると、あらゆる点で、パラメータ化されていないインターフェイスと同様に扱われるようになる。

REPOSITORY段落中にパラメータ化されたインターフェイスが指定されたときに、パラメータ化されたインターフェイスの仕様に基づいて、新しいインターフェイス(パラメータ化されたインターフェイスのインスタンス)が生成される。

実行単位内で、パラメータ化された同じインターフェイスを同じ実パラメータで展開して作成された2つのインターフェイスの外部インターフェイス名が同じ場合、その2つは同じインターフェイスインスタンスである。パラメータ化されたインターフェイスを異なる実パラメータで展開して作成された2つのインターフェイスは同じインターフェイスインスタンスではなく、同じ外部インターフェイス名を持たない。

実行単位における通信

共通プログラム、初期プログラムおよび再帰プログラム

その初期状態に影響する属性、またはその呼び出し方法を定義する属性を用いて、プログラムを記述することができる。

共通プログラム(common program)とは、他のプログラムの中に直接的に含まれていながら、そのプログラムに直接的または間接的に含まれる他のプログラムからも呼び出せるものをいう(COBOL言語の概念の章の名前の適用範囲 節を参照)。この共通属性(common attribute)は、プログラムの見出し部内にCOMMON指定を書くことによって付与される。この指定によって、あるプログラムに含まれるすべてのプログラムによって使用される、副プログラムを容易に作成できる。COMMON指定が記述されていない場合は、再帰的でない、内包されるプログラムは直接内包しているプログラムによってのみ呼び出しが可能となる。COMMON指定により、プログラムに内包される全プログラムにより使用可能なサブプログラムの記述が容易になる。

初期プログラム(initial program)とは、呼ばれたときに状態が初期化されるプログラムをいう。初期プログラムの初期化処理の過程で、そのプログラムのデータが初期化される。詳しくは、メソッド、オブジェクトまたはプログラムの状態の節で解説する。 初期属性は、プログラムの見出し部内にINITIAL句を書くことによって付与される。

再帰プログラム(recursive program)は、直接または間接的に自信を呼び出すことができるプログラムである。このプログラムの内部データの初期化については、 関数、メソッドまたはプログラムの状態の節で解説する。再帰属性の獲得については、見出し部の章のプログラム名段落の節で解説する。

メソッドはつねに、再帰的である。そのデータは、再帰プログラムと同様に初期化される。

初期プログラムでも再帰プログラムでもないプログラムは、プログラムのデータは、最終使用状態(最初の起動時を除く)である。これについては、関数、メソッドまたはプログラムの状態の節で解説する。再帰属性を持つプログラム以外のプログラムは、実行中に起動することはできない。

データの共有

1つの実行単位の中の2つのランタイム要素は、下記の状況において、共通データ(common data)を参照できる。

ファイル結合子の共有

1つの実行単位の中の2つのランタイム要素は、下記の状況において、共通ファイル結合子(common fileconnector)を参照できる。

データ部

概要

データ部は下記の節に分割される。

  1. ファイル節

  2. 作業場所節n

  3. スレッド局所記憶節

  4. オブジェクト記憶節

  5. 局所記憶節

  6. 連絡節

  7. 報告書節

  8. 画面節

ファイル節では、データファイルの構造を定義する。各ファイルを定義するには、ひとつのファイル記述項といくつかのレコード記述を書く。レコード記述はファイル記述項の直後に書く。

作業場所節には、外部データファイルに属するのではなく、内部的に作成され処理されるレコードおよび非連続的なデータ項目を記述する。また、作業場所節には、値が原始文内で割り当てられて実行中には変化しないデータ項目も記述する。

スレッド局所記憶節には、各スレッドに固有であり、呼出しの間に一貫しているデータを記述する。スレッド局所記憶節はスレッドに固有の作業場所節であると見ることができる。これは再入可能なプログラムの大部分における競合問題を解決するのに役立つ。多くの場合、節の見出しをWORKING-STORAGEからTHREAD-LOCAL-STORAGEに変更するだけで、ファイル処理を伴わないプログラムを完全に再入可能にすることができる。

オブジェクト記憶節には、クラスオブジェクトデータおよびインスタンスオブジェクトデータを記述する。その構造は連絡節および作業場所節と同様である。

局所記憶節では、プログラムの再帰可能性を明示する。再帰可能なメソッド中にも、局所記憶節を記述できる。ランタイム要素が起動されるたびに局所記憶節の別立てのコピーが作成される。そのコピーはそのランタイム要素の寿命がある間だけ存在する。

連絡節は別のソース要素によって起動されるソース要素の中に置かれる。連絡節には、起動する側と起動される側の両方の要素によって参照されるデータ項目を記述する。その構造は作業場所節と同様である。

報告書節にはいくつかのレポート記述項(RD記述項)が含まれる。各レポート記述項はひとつのレポートを完全に記述したものである。

画面節では、画面の属性を定義する。それを通じて、画面上に表示するフィールドの位置を正確に指定したり、ACCEPTやDISPLAYの操作の間にある種のコンソール機能を制御したりすることができる。

同じ方法で記述したデータレコードとデータ項目の型は同じである。型定義を宣言することによって、そのような項目の記述を便利に操作できる。型定義は作業場所節と連絡節に置くことができる。呼出しプロトタイプ中の型定義をプログラム定義内で参照できる。

データの種類と状態

内部データ項目およびファイル結合子には3つの種類がある。具体的には、自動的、初期的、静的の別がある。項目を自動的、初期的、静的のいずれに指定するかによって、実行単位を実行中のそれらの項目およびその内容の持続性が変わってくる。

データ項目およびファイル結合子には初期状態および最終使用状態がある。データ項目の初期状態は、そのデータ項目が記述されているデータ記述項中のVALUE句の有無およびそのデータ項目の記述に左右される。ファイル結合子の初期状態はオープンモードにないということである。

最終使用状態は、データ項目またはファイル結合子の内容はそれが最後に変更された時点の内容であることを意味する。

自動的項目は、メソッドまたはプログラムが起動されたときに初期状態に設定される。メソッドまたはプログラムの各インスタンスにその項目のコピーが保持される。自動的項目は局所記憶性に記述されている項目である。

初期項目は初期プログラムが起動されたときに初期状態に設定される。初期プログラム中のデータ項目とファイル結合子はすべて、初期項目である。また、初期プログラム中の画面項目の属性も初期項目として扱われる。

静的項目は、メソッド、オブジェクト、プログラムのいずれかが初期状態に設定されたときに、初期状態に設定される(メソッド、オブジェクトまたはプログラムの状態節を参照)。静的項目は、初期プログラムではないソース要素の通信、ファイル、作業場所のどれかの節に記述されている項目である。また、初期プログラムではないソース要素中の画面項目の属性も静的項目として扱われる。

メソッド、オブジェクトまたはプログラムの状態

メソッド、オブジェクトまたはプログラムの状態

実行単位中の任意の時点において、メソッドまたはプログラムはアクティブまたは非アクティブのどちらかの状態にある。メソッドまたはプログラムが起動されたときに、その状態は初期状態または最終使用状態にある。

アクティブ状態

関数、メソッドまたはプログラムは再帰的に起動することができる。したがって、ある関数、メソッドまたはプログラムの複数のインスタンスが同時にアクティブ状態にある場合もある。

メソッドのインスタンスは、正常に起動されたときに、アクティブ状態に置かれる。そして、そのメソッドのインスタンス内でSTOP文が実行されるか、EXIT METHOD文が明示的または暗黙的に実行されるまで、アクティブ状態を保つ。

プログラムのインスタンスは、オペレーティングシステムによって正常に起動されるかランタイム要素から正常に呼び出されたときに、アクティブ状態に置かれる。そして、下記のどれかひとつが実行されるまで、アクティブ状態を保つ。

メソッドまたはプログラムのインスタンスが起動されたときはいつでも、そのメソッドまたはプログラムのインスタンスに含まれるPERFORM文の制御機構が初期状態に設定され、ALTER文によって参照されるGO TO文が初期状態に設定される。

データの初期状態と最終使用状態

メソッドまたはプログラムが起動されたときに、その中のデータは初期状態または最終使用状態のどちらかにある。

初期状態

自動的データおよび初期データは、それが記述されているメソッドまたはプログラムが起動されるたびに、初期状態に置かれる。

静的データは下記の場合に初期状態に置かれる。

  1. その静的データが記述されているメソッドまたはプログラムが実行単位内で最初に起動されたとき。

  2. 初期属性を持ち、その静的データが記述されているプログラムを直接的または間接的に含むプログラムを参照する起動文が実行された後で、その静的データが記述されているプログラムが最初に実行されたとき。

  3. その静的データが記述されているプログラムまたはそのプログラムを直接的または間接的に含むプログラムをCANCELする起動文が実行された後で、その静的データが記述されているプログラムが最初に実行されたとき。

メソッドまたはプログラム中のデータが初期状態に置かれると、下記の事柄が起こる。

  1. 作業場所節、局所記憶節、通信節に記述されている初期データが、データ部 - データ記述の章のVALUE(値)句節の記述に従って、初期化される。

  2. そのメソッドまたはプログラムの内部ファイル結合子が、いかなるオープンモードにもないように設定されて、初期化される。

  3. 画面項目の属性が、画面記述項に指定されているように設定される。
最終使用状態

最終使用状態になりうるのは静的データと外部データだけである。外部データは、実行単位が起動されているとき以外は、常に最終使用状態にある。静的データは、上に定義された初期状態にあるとき以外は、常に最終使用状態にある。

オブジェクト初期状態

オブジェクトの初期状態はそのオブジェクトが生成された直後の状態である。内部データ、内部ファイル結合子、画面項目の属性は、メソッドまたはプログラムが初期状態に置かれた場合と同様に、上記の初期状態節の記述に従って初期化される。 .

 大域名と局所名

データ名はデータ項目の名前である。ファイル名はファイル結合子の名前である。これらの名前は大域名と局所名のどちらかに分類される。

大域名は、それが宣言されているソース要素内からでも、そのソース要素に含まれる他の任意のソース要素からでも、関連のある項目を参照するために使用することができる。

それと対照的に、局所名は、それが宣言されているソース要素内から、関連のある項目を参照するためにしか使用することができない。名前の中には常に大域的なものがある。常に局所的な名前もある。その他に、名前が宣言されているソース要素内の仕様に応じて、大域的または局所的となる名前もある。

レコード名が宣言されているレコード記述項内にGLOBAL句が指定されている場合、そのレコード名は大域的である。あるいは、ファイル節内のレコード記述の場合、そのレコード記述項に関連するファイル名のファイル記述項にGLOBAL句が指定されている場合、そのレコード名は大域的である。

データ名が宣言されているデータ記述項またはその上位のデータ記述項の中にGLOBAL句が指定されている場合、レコード名は大域的である。

データ記述項内に宣言されている条件名は、そのデータ記述項の上位のデータ記述項の中にGLOBAL句が指定されている場合、大域的である。しかし、特定の規則によって、時にはある種のデータ記述項、ファイル記述項、またはレコード記述項にGLOBAL句を指定することが禁止されることがある。

該当ファイルのファイル記述項中にGLOBAL句が指定されている場合、ファイル名は大域的である。

データ記述項中に宣言されたデータ名、ファイル名、条件名が大域的ではない場合、その名前は局所的である。

大域名は他のソース要素内に含まれるソース要素間にわたって推移的である。

外部項目と内部項目

呼出し可能なデータ項目には通常は何らかの表現のデータが格納されている必要がある。ファイル結合子にはファイルに関する何らかの情報が格納されている必要がある。データ項目またはファイル結合子に関する記憶場所は、外部または内部でありえる。

外部および内部の項目は大域名または局所名のどちらかを持てる。

作業場所節中に記述されたデータレコードは、そのデータ記述項内にEXTERNAL句があると、 外部属性を持つ。外部レコードを記述しているデータ記述項の下位のデータ記述項によって記述されているデータ項目も外部属性を取得する。レコードまたはデータ項目が外部属性を持たない場合、それは内部データである。

関連するファイル記述項にEXTERNAL句があると、ファイル結合子は外部属性を得る。外部属性を持たないファイル結合子は内部的である。

EXTERANL句が含まれないファイル記述項または整列併合ファイル記述項の下位に記述されたデータレコードならびにそれらのレコードのデータ記述項の下位に記述されたデータ項目は、常に内部的である。ファイル記述項にEXTERNAL句が含まれていると、データレコードおよびデータ項目は外部属性を得る。

局所記憶節、連絡節、通信節、報告書節、画面節に記述されたデータレコード、下位のデータ項目、関連する各種の制御情報は常に内部的である。連絡節に記述されて、記述されたデータレコードと他のランタイム要素から呼出し可能な他のデータ項目との間に関連づけがなされているデータに対しては、特別な考慮が当てはまる。

データ項目またはファイル結合子が外部的である場合、その項目に関連する記憶場所は、実行単位内の個々のランタイムモジュールとではなく、実行単位と関連する。外部項目は、それを記述する実行単位内の任意のランタイムモジュールから参照できる。異なるランタイムモジュールからデータ項目またはファイル結合子の別立ての記述を使用して外部項目を参照した場合、必ず同じ項目が参照される。実行単位内では、外部項目の表現はひとつしか存在しない。

データ項目またはファイル結合が内部的である場合、それに関連する記憶場所はそれを記述するランタイムモジュールとのみ関連する。

手続き部

実行

実行は手続き部の最初の文から開始される。ただし、宣言部分は例外である。文は原始要素内に現れる順に実行される。ただし、規則により別の順序が適用される場合は別である。

文と完結文

文は、COBOLの動詞で始まる、語と記号の構文的に有効に組み合わせである。

完結文はいくつかの文で構成され、終止符とそれに続く空白で区切られる。

文には下記の4種類がある。

  1. 条件文

  2. COBOLシステム指示文

  3. 無条件文

  4. 範囲明示文

完結文には下記の3種類がある。

  1. 条件完結文

  2. COBOLシステム指示完結文

  3. 無条件完結文

条件文

条件文(conditional statement)は、条件の真理値を判定して、その結果に基づいて以降の制御の流れを変えることを指定するものである。

条件文には以下のものがある。

条件完結文

条件文を終止符(.)に続く空白で止めたものを、条件完結文(conditional sentence)という。条件文の前に無条件文があってもよい。

COBOLシステム指示文

COBOLシステム指示文(COBOL system-directing statement)は、翻訳指示動詞とその作用対象(operand)からなる。翻訳指示動詞については翻訳指示文の章で解説する。

COBOLシステム指示文は、実行用プログラムコードを生成する際にCOBOLコンパイラに指定された動作を取らせるものである。

COBOLシステム指示完結文

COBOLシステム指示完結文は単一の指示文を終止符(.)に続く空白で止めたものである。

コンパイラ指令

コンパイラ指令はコンパイラの動作を制御するための任意選択機能である。コンパイラ指令を使用すると、種々の機能を指定することができる。具体的には、言語の種々の機能を使えるようにする、実行時の動作を選択する、コンパイル時のオプションを選択する、デバッグ情報を生成する、データファイルの形式を制御する、実行用プログラムコードを最適化する、SQLのオプションを選択する、などを行える。

標準的に用意されているコンパイラ指令については、翻訳指示文の章のコンパイラ指令節で解説する。

この処理系に用意されている各コンパイラ指令の構文と説明については、使用しているCOBOLシステムのマニュアルを参照。

無条件文

無条件文(imperative statement)は、実行用プログラムに無条件に取らせる動作を指示するものである。条件文でもCOBOLシステム指示文でもない文は、無条件文である。無条件文はいくつかの無条件文をつなげたものでもよく、その間を分離符で区切ってもよい。

無条件動詞には以下のものがある。

ACCEPT1 RELEASE
ADD2 EXIT REWRITE3
ALTER GO TO
CALL4 INSPECT SET
CANCEL MERGE SORT
CLOSE MOVE START3
COMPUTE2 MULTIPLY2 STOP
DELETE3 OPEN STRING4
PERFORM SUBTRACT2
DISPLAY1 READ5 UNSTRING4
DIVIDE2 WRITE6

1 指定は任意のON EXCEPTION句のないもの
2 指定は任意のSIZE ERROR句のないもの
3 指定は任意のINVALID KEY句のないもの
4 指定は任意のON OVERFLOWまたはON EXCEPTION句のないもの
5 指定は任意のAT END句またはINVALID KEY句のないもの
6 指定は任意のINVALID KEY句またはEND-OF-PAGE句のないもの

ANSI '85の追加の無条件動詞には以下のものがある。

CONTINUE INITIALIZE

ISO2002の追加の無条件動詞には以下のものがある。

INVOKE

OS/VS COBOL 無条件動詞には以下のものがある。

EXAMINE EXHIBIT GOBACK
TRANSFORM

VS COBOL IIの追加の無条件動詞には以下のものがある。

GOBACK

このCOBOLシステムで利用できる追加の無条件文には、以下のものがある。

CHAIN EXHIBIT GOBACK
NEXT SENTENCE

文の一般形式の中に「無条件文」が示されている場合、それは一連の無条件文を指す。その一連の無条件文は終止符によって止められるか、またはその"無条件文"が含まれる文に関連する何らかの句によって止められなければならない。

一連の無条件文中の任意の2つの無条件文の間に、連結語の"THEN"または"AND"を入れることもできる。

無条件完結文

無条件完結文(imperative sentence)とは、無条件文を終止符(.)に続く空白で止めたものである。

範囲明示文

範囲明示文(delimited scope statement)とは、対応する明示的な範囲符(scope terminator)によってその有効範囲を限られる文をいう。たとえば、IF文は範囲明示文であり、それに対応する範囲符はEND-IFである。1組の範囲明示文と範囲符との間にある文はすべて、その範囲明示文に含まれると みなされる。

範囲明示文は入れ子にすることができる。その場合、明示的な各範囲符は、その手前にある有限な範囲文のうちでまだ対になっていない最も近いものと対をなすものとみなされる。

範囲明示文を暗黙に終了させることもできる。それには次の2通りがある。手続き完結文の末尾では、分離符の終止符によって、まだ終了していない文がすべて終了される。範囲明示文を含む文が終了すると、含まれる範囲明示文も終了する。


注:すべての文がこの方法で範囲を区切れるとは限らないの。範囲を区切ることのできる文のうちで、範囲符で明示的に区切ったものだけを、範囲明示文と呼ぶ。


詳細については、COBOL言語の概念の章で前述した明示範囲符と暗黙範囲符を参照。

文の分類

分類
動詞
算術 ADD
COMPUTE
DIVIDE
INSPECT (TALLYING)
MULTIPLY
SUBTRACT
EXAMINE (TALLYING)

条件

ADD (SIZE ERROR)
CALL (OVERFLOW)
COMPUTE (SIZE ERROR)
DELETE (INVALID KEY)
DIVIDE (SIZE ERROR)
GO TO (DEPENDING)
IF
MULTIPLY (SIZE ERROR)
READ (END or INVALID KEY)
RETURN (END)
REWRITE (INVALID KEY)
SEARCH
START (INVALID KEY)
STRING (OVERFLOW)
UNSTRING (OVERFLOW)
WRITE (INVALID KEYまたはEND-OF-PAGE)
EVALUATE
ON

データ転記

ACCEPT (DATE, DAY or TIME)
INSPECT (REPLACING)
MOVE
STRING
UNSTRING
EXAMINE
TRANSFORM
INITIALIZE
INSPECT (CONVERTING)
SET (TO TRUE)
SET (TO FALSE)
SET (ADDRESS OF)
SET (POINTER)
SET (object reference)

終了

EXIT METHOD
EXIT PROGRAM
GOBACK
STOP

入出力

ACCEPT(一意名)
CLOSE
COMMIT
DELETE
DISPLAY
OPEN
READ
RECEIVE
REWRITE
ROLLBACK
START
STOP(定数)
UNLOCK
WRITE
EXHIBIT
SET (TO ONまたはTO OFF)

プログラム間連絡

CALL
CANCEL
CHAIN
ENTRY
EXEC
INVOKE
SERVICE

空操作

EXIT
CONTINUE

順序づけ

MERGE
RELEASE
RETURN
SORT

手続き分岐

ALTER
CALL
EXIT PERFORM/EXIT PARAGRAPH/EXIT SECTION
GO TO
NEXT SENTENCE
PERFORM

範囲明示

END-ACCEPT
END-ADD
END-CALL
END-DELETE
END-DISPLAY
END-DIVIDE
END-EVALUATE
END-IF
END-INVOKE
END-MULTIPLY
END-PERFORM
END-READ
END-RETURN
END-REWRITE
END-SEARCH
END-START
END-STRING
END-SUBTRACT
END-UNSTRING
END-WRITE

COBOLシステム指示

BASIS
DELETE
INSERT
$DISPLAY
$ELSE
$END
$IF
COPY
ENTER
USE
REPLACE
ENTRY
EJECT
SKIP1
SKIP2
SKIP3
TITLE
NOTE
++INCLUDE
-INC

表操作

SEARCH
SET


IFとONは、英語では動詞ではないが、COBOLでは動詞として扱う。

正書法

この節では固定方式のみを取り上げる。このCOBOLシステムは自由方式で書かれた翻訳集団をも受け付ける。自由方式の原始文の詳細については、COBOL言語の紹介 の章を参照。

正書法(reference format)は、COBOLの原始文を記述するための標準的な方法である。この正書法は入出力媒体上の行を構成する文字位置を基準として定める。COBOLシステムは正書法に従って書かれた原始文を受け入れ、正書法に従って出力リストを作り出す。 (原始プログラムの例は、COBOL言語の概要の章のサンプルプログラムに掲載。)

正書法に関する空白あけの規則は、他のすべての空白あけの規則に優先する。

正書法の表現

行の正書法は、図 3-1のとおり。



図 3-1:COBOLの原始行の正書法

一連番号領域は、境界Lと境界Cとの間の6文字分である。

標識領域は、1行の7番目の文字位置である。

A領域は、境界Aと境界Bとの間の文字位置8, 9, 10, 11である。

B領域は、境界Bと境界Rとの間の、12番目から72番目までの文字位置を占める。

プログラム原文領域はA領域とB領域の両方から構成される。プログラム原文領域のどこから原文語を書き始めてもかまわない。

一連番号

一連番号(sequence number)は、一連番号領域に書く6桁の数字であり、原始行を識別するために使用する。一連番号は通常、連続する各原始行に対して、昇順に番号付ける。

一連番号は、行を編集するためにBASIS機構によって使用される。この場合、一連番号は数字で、プログラム全体を通じて昇順になっていなければならない(翻訳指示文の章のBASIS機構節を参照)。

一連番号が昇順になっているかどうか、COBOLシステムで検証することができる。検証を行うには、SEQCHKコンパイラ指令を使用する。

一連番号領域の内容は、数字である必要はない。また、一意である必要もない。

一連番号領域の最初の文字位置に、星印(*)または印字されない制御文字(ASC II文字の照合順序で空白文字より小さいもの)を指定すると、その行は注記として扱われ、印刷用のファイルまたは装置に出力されない。 この機能を利用して、出力印刷用ファイルを次のコンパイルの原始ファイルとして使用できる。この機能は、MFCOMMENTコンパイラ指令の影響を受ける。

行のつなぎ

文、記述項、指定、句が2行以上にわたるとき、その続きの部分はB領域に書く。この続きの行を後の行(continuation line)と呼ぶ。続けられる行を前の行(continued line)と呼ぶ。この書き方をするときは、任意の語や定数、

またはPICTURE文字列

を途中で分割して後ろの行に書いてもよい。

ある行の標識領域にハイフン(‐)を書くと、現在の行のB領域の空白でない最初の文字が、前の行の空白でない最後の文字の後ろに続くことを示す。この場合、間の空白は存在しないものとみなされる。

注記行または空白行は前の行とは扱われない。

ただし、前の行にまだ引用符で閉じていない文字定数がある場合には、後の行のB領域の空白でない最初の文字は引用符とする。文字定数の続きは、この引用符のすぐ次の文字位置から書く。この書き方をすると、前の行の終わりまでの空白は、すべてその定数の一部であるとみなされる。後ろの行のA領域は空白とする。

標識領域にハイフンを書かないと、前の行の最後の文字の後ろに空白があるものとみなされる。分離符 "=="は、2文字とも同じ行に書く。

X"およびG"は、2文字とも同じ行に書く。

H"は、2文字とも同じ行に書く。

N"は、2文字とも同じ行に書く。

*>"は、2文字とも同じ行に書く。

>>は、2文字とも同じ行に書く。

空白行

境界Cから境界Rまでがすべて空白の行を、空白行(blank line)という。空白行は、 原始文内のどこにあってもよい。

仮原文

仮原文(pseudo-text)を構成する原文語(text-word)と区切り文字の空白は、A領域またはB領域のどちらから書き始めてもよい。ただし、仮原文を開始する区切り文字に続く行の標識領域にハイフンを書いた場合、その行のA領域は空白とする。その場合、行のつなぎに関する規則が、原文語を書く際にも適用される(翻訳指示文のを章参照)。

部、節、段落の正書法

部の見出し

部の見出しは、A領域から書き始める(図 3-1を参照)。

B領域から書き始めてもよい。

節の見出し

節の見出しは、A領域から書き始める(図 3-1を参照)。

B領域から書き始めてもよい。

環境部と手続き部では、節はいくつかの段落から構成される。段落がない場合もありえる。データ部では、節はいくつかの記述項から構成される。記述項がない場合もありえる。

段落の見出し、段落名、段落

段落には2通りある。1つは、先頭に段落名を書いて終止符(.)に続く空白で止め、その後ろに完結文をいくつか書いたものである。もう1つは、段落の見出しの後ろに記述項をいくつか書いたものである。段落内に注記項を含めることができる。段落の見出しおよび段落名は、部または節の最初の行よりも後ろの任意の行に、A領域から書き始める。

また、B領域から書き始めることもできる。

段落の最初の完結文や記述項は、段落名または段落の見出しを書いた行か、またはその後ろの注記行や空白行でない行のB領域から書き始める。以降の完結文や記述項は、前の完結文や記述項と同じ行のB領域か、またはその後ろの空白行でも注記行でもない行のB領域から書き始める。

完結文は、A領域またはB領域のどこから書き始めてもよい。ただし、AREACHECK指令を指定したときは別である。

段落中の完結文や記述項が2行以上にわたる場合は、行のつなぎの規則に従って書くことができる。

データ部の記述項

データ部の各記述項は、レベル指示語またはレベル番号で始め、その後ろに空白を置いて、記述項の名前を続け

(存在する場合)、

さらにその記述項について記述する一連の独立な句を続ける。最後の句は常に終止符(.)に続く空白で止める。

データ部の記述項には2種類ある。具体的には、レベル指示語で始まるものと、レベル番号で始まるものである。

レベル指示語(level indicator)には下記のものがある。

それらのデータ部の記述項がレベル指示語で始まる記述項の場合、レベル指示語はA領域から書き始め、その後ろに空白を置き、それに続けて、B領域

またはA領域に

関連する名前と適切な記述情報を書く。

レベル番号で始まる記述項を、データ記述項という。

レベル番号の値は1から49まで、66, 77,

78

および88のいずれかとする。値が1から9のレベル番号は1文字で書いてもよいし、前にゼロを付けて書いてもよい。レベル番号と後ろに続く語との間は、最低1文字の空白で区切る。

レベル番号が01または77で始まるデータ記述項の場合、レベル番号をA領域から書き始め、その後ろに空白を置き、それに続けてB領域

またはA領域

に関連するレコード名または項目名と適切な記述情報を書く。

引き続くデータ記述項は、最初のものと同じ形式にしてもよいし、レベル番号に従って階段状に書いてもよい。階段状に書いても、レベル番号の大きさは左右されない。

レベル番号を階段状に書くとき、新しいレベル番号は境界Aから任意の個数の空白を空けた位置から書き始めてよい。階段の段差の大きさは、物理的な幅によってのみ制限される。

レベル番号が01と77以外のデータ記述項を、A領域から書き始めてもよい。

宣言部分

手続き部の宣言部分の始めと終わりを示す必要語のDECLARATIVESとEND DECLARATIVESは、それぞれ1行に単独で書く。これらの語はA領域から書き始め、終止符(.)に続く空白で止める( 図 3-1を参照)。

注記行

注記行とは、標識領域に星印(*)を付けた行である。見出し部の見出しの後ろならば、注記行はソース要素中のどこに置いてもよい。注記行のA領域とB領域には、計算機文字集合の文字を任意に組み合わせて書いてよい(図 3-1を参照)。星印およびA領域とB領域内の文字は出力リストには出されるが、翻訳はされない。

注記行を、見出し部の見出しの前に置くことができる。

星印の代りに斜線(/)を使用することもできる。この場合、注記行は改ページが行われてから出力リストに出される。それ以外は、星印の場合と同じである。

注記行を2行以上にわたって書いてもよい。ただし、後ろの行の標識領域に星印を書かなければならない。

行内注記

分離符の空白に続けて"*>"と書くと、それ以降、行末までが行内注記(in-line comment)となる。この書き方をすると、文字列や分離符と同じ行に自由方式の注を書ける。COBOL 翻訳集団またはCOBOL登録集の原文の中で分離符の空白を置けるところには、どこでも行内注記を書くことができる。登録集原文、仮原文、原文を評価する際には、行内注記は1つの空白文字とみなされる。行内注記を次の行に続けることはできない。