COBOLの構成について

1. はじめに
---------------------------------------
前回の「COBOLの私見」より、簡単ではありますがCOBOLの構成について初心者でもわかりやすく説明したいと思います。
※「COBOLの私見」
https://qiita.com/masahikoaoyama/items/2388ea7e25dbd9227989

2. コーディング（記述）フォーマット
---------------------------------------
COBOLではをコーディング（記述）していく上でルールがあります。
1行は80文字以内、その80文字の中で5つの領域に分けてコーディング（記述）を行います。

それぞれの領域には何を記述するのかが定められています。

・ 一連番号領域
先頭から6文字分を「一連番号領域」としてプログラムの行番号を6桁の数字で記述します。
※自動採番で行番号を設定される場合もあるので、コーディング（記述）時では意識する必要はありません。

・標識領域
先頭から7文字目を「標識領域」として、「*」を設定することにより、コメント行として空白の場合はCOBOLのコードとして認識されます。

・A領域
先頭から8～11文字目までを「A領域」として、各部の開始宣言、段落の宣言、データ項目のレベル番号をこの領域の先頭から書き始めます。

・B領域
先頭から12～72文字目までを「B領域」として、手続き部の命令文や作業領域のレベル番号などを記述します。

・見出し領域
先頭から73～80文字目までを「見出し領域」となります。
見出し領域は、翻訳対象外の領域であり、プログラムの修正日や修正者名などのコメント的な記述を行ったりします。
※意外と忘れがちでこの領域までコーディングを行いコンパイルエラーがでることがあります。

3. コーディング（記述）ルール
---------------------------------------
・ピリオド（終止符）
COBOLでは、部、節、段落の宣言部、1つの命令文、命令ブロック（IF～END-IFなど）の終了をピリオドで示します。

```:サンプル
+---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8
000300 SAMPLE                          SECTION.
000310*
000320     MOVE    ZERO                TO  X.
000330*
000340     IF  X = ZERO  THEN
000350         DISPLAY ”X=" X          UPON CONSOLE
000360     END IF.
000370*
000380 SAMPLE-EXIT.
```

・改行による行継続
1つの文を複数行にまたがって記述する方法として、下図のように命令文の区切りで改行できます。

```:サンプル
+---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8
000300     MOVE    
000310　　　　　”ABCDEFGHIJKLMN”
000320          TO  X.
```

・コメント行
先頭から73～80文字目の領域にコメントを記述することができますが、たったの8文字では記述できる内容は限られてしまいます。
プログラムの処理内容など、長いコメントを書きたい場合は、行全体をコメント行にしてしまう方法が使われます。
行をコメント行にするには標識領域にアスタリスク(*)を記述します。

```:サンプル
+---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8
000300 SAMPLE                          SECTION.
000310*
000320     MOVE    ZERO                TO  X.
000330* コメント領域
000340     IF  X = ZERO  THEN
000350         DISPLAY ”X=" X          UPON CONSOLE
000360     END IF.
000370*
000380 SAMPLE-EXIT.
```

4. COBOLプログラムの全体構成
---------------------------------------
COBOLプログラムは、全体が4つの部に分かれて構成され、見出し部からはじまり、環境部、データ部、手続き部と続きます。

それぞれの部で、それぞれの役割が明確になっているのがCOBOLの特徴であり、COBOLの可読性が高いと言われる要因と言えます。
しかし他言語プログラマがはじめてCOBOLを用いるときにつまづきやすいところでもあります。
例えば、VBでは変数をソース上のどこででも宣言することができますが、COBOLではデータ部でしかできません。
ささいなことのようですが、他言語プログラマにとって意外と不便に感じられる点と言えるでしょう。

・見出し部(IDENTIFICATION DIVISION)
見出し部には、プログラム名やその作成者、作成日などのプログラムのメンテナンス情報を記述します。

```:サンプル
+---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8
000010 IDENTIFICATION                   DIVISION.
000020 PROGRAM-ID.                      SAMPLE.
000030 AUTHOR.                          NAME.
000040 DATE-WRITTEN.                    2018/11/27.
000050 DATE-COMPILED.                   2018/11/27.
```

・環境部(ENVIRONMENT DIVISION)
環境部には、作成しようとしているプログラムを翻訳（コンパイル）するコンピュータ名や実行するコンピュータ名、さらに使用する環境変数の受け渡し情報やプログラムから読み書きするファイルの名前や種類などを定義します。

```:サンプル
+---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8
000070 ENVIRONMENT                      DIVISION.
000080 CONFIGURATION                    SECTION.
000090 SOURCE-COMPUTER.                 SOURCECOMPUTER.
000100 OBJECT-COMPUTER.                 OBJECTCOMPUTER.
000110 INPUT-OUTPUT                     SECTION.
000120 FILE-CONTROL.
000130     SELECT   IN-FILE             ASSIGN       TO ID01
000140                                  ORGANIZATION IS LINE SEQUENTIAL.
000150     SELECT   OUT-FILE            ASSIGN       TO OD01
000160                                  ORGANIZATION IS LINE SEQUENTIAL.
```

・データ部(DATA DIVISION)
データ部では、入出力ファイルのレイアウト、データ項目（変数）、外部プログラムとのインターフェイス（引数）などプログラム上で取り扱う全てのデータ項目の定義を行います。

```:サンプル
+---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8
000180 DATA                             DIVISION.
000190 FILE                             SECTION.
000200 FD IN-FILE.
000210 01 IN-RECORD.
000220    03  IN-SYOHIN-CODE            PIC  X(6).
000230    03  IN-SYOHIN-NAME            PIC  X(30).
000240    03  IN-SYOHIN-TANKA           PIC  9(8).
000250 WORKING-STORAGE                  SECTION.
000260 77 WRK-COUNT                     PIC  9(2).
```

・手続き部(PROCEDURE DIVISION)
手続き部では、プログラムが行う処理内容を記述していきます。

```:サンプル
+---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8
000310 PROCEDURE                        DIVISION.
000320     PERFORM  INIT-PROC.
000330*
000340     PERFORM  MAIN-PROC.
000350*
000360     STOP  RUN.
000370*
000380 INIT-PROC                        SECTION.
000390*
000400     MOVE  ZERO                   TO  WRK-COUNT.
000410*
000420     OPEN  INPUT    IN-FILE.
000430     PERFORM  INFILE-READ-PROC.
000440*
000450 INIT-PROC-EXIT.
000460*
000470     EXIT.
```

5. COBOLでHello world!
---------------------------------------
COBOLプログラミングを学んでいく手始めに、他言語でもよくあるHello worldプログラムを作成してみましょう。 

```:サンプル
+---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8
000010 IDENTIFICATION                   DIVISION.
000020 PROGRAM-ID.                      SAMPLE.
000030*
000040 ENVIRONMENT                      DIVISION.
000050*
000060 DATA                             DIVISION.
000070 01  OUT-REC.
000080     03  OUT-MSG                  PIC X(16).
000090*
000100 PROCEDURE                        DIVISION.
000110 MAIN.
000110     MOVE  "Hello world!"    TO  OUT-MSG.
000120     DISPLAY OUT-REC         UPON CONSOLE.
000130     STOP RUN.
```

コンパイル後実行すれば、ディスプレイに表示されるはずです。


6. 最後に
---------------------------------------
長くなってしまいましたが、COBOLの基本的な構成に関しては以上になります。
未経験者の方は、機会があった場合にお役に立てればと思います。