COBOL 読めますか

株式会社テイクーワンT.Mです。

金融機関の基幹システムに関わる老情報処理技術者です。
同僚である若い方から受けたCOBOLに関する質問をまとめてみました。
COBOLに関わる事になった方の参考にならば幸いです。

分離文字 "." (ピリオド)

COBOL言語ではステートメント(以降、文と略記します)を分離する為、文の最後にピリオドを付ける必要がある。
DATA DIVISIONでは、変数名(ファイル名、定数名)の定義1件毎にピリオドを打つ。(定義1件=文1件となる)
PROCEDURE DIVISIONでは、ピリオドの打ち誤りにより意図した処理手順と異なる処理手順が生成される事があるため、セクション内の個別の命令文にはピリオドの打たずセクションの最後にピリオドの打つ方式(コーディングルール)を採る場合もある。

構造体

構造体(集団項目と呼ばれる事もある)は階層的な構造を持つ情報の取り扱う場合の定義方法です。
COBOLでは構造体の転送は許容されるが、下記の様な罠もあり、注意が必要。

構造体「元帳_取引明細」を「退避_取引明細」に転送する場合、両方の情報の構造は一致しているため、問題なく転送できる。
構造体「元帳_取引明細」を「表示_取引明細」に転送する場合、元帳_取引明細の先頭から最後までの情報が表示_取引明細に転送されるため、表示_取引明細の変数名(設定すべき情報の内容)を無視した転送となる問題が発生する。

01 元帳_取引明細     01  退避_取引明細     01 表示_取引明細
   03  口座情報               03  口座情報               03  見出し文言
       05  店番                   05  店番                   03  口座情報
       05  科目                   05  科目                   05  店番
    05  口座番号               05  口座番号               05  科目
   03  取引内容               03  取引内容               05  口座番号

COMPUTE文とMOVE文

COMPUTE文は数値項目間で計算を行う命令。

COMPUTE A = B + C.   (BとCの和をAに移送する)

MOVE文は数値、英数字、日本語文字列に関係なく転送を行う命令。

MOVE  D  TO  E.         (Dの値をEに移送する)

但し、一部のコンパイラでは独自拡張でCOBOLの仕様には無い「アドレス」の取り扱いが可能であり、「アドレス」をポインタに設定する際にCOMPUTE命令の使用を指定している為に混乱がある模様。

COMPUTE F = G.         (アドレス項目Gの値をポインタであるFに移送する)

IF文

COBOLのIF文も構造化プログラミングの思想を取り入れた仕様である。

IF  条件式
  THEN   条件成立時に実行する命令
  ELSE   条件不成立時に実行する命令
END-IF

COBOL言語のデビューは1959年であり、その当時には構造化プログラミングの考え方は無い。その為、下記の様なコーディングでもコンパイラーは受け入れコンパイルエラーとしないが、ソースコードのみではコンパイラがどの様な処理内容を生成したか判断できない。

IF  条件式1
  THEN   条件式1が成立時に実行する命令
    IF  条件式2
      THEN   条件式2が成立時に実行する命令
  ELSE   条件式?が不成立時に実行する命令
END-IF

この様な場合は、コンパイルリストの左側に表示されているプログラムのネスト(入れ子)のレベルからコンパイラが生成した処理内容を判断できる。

前へ

【Linux初心者向け】覚えておくと便利なLinuxコマンド集