opensouce COBOLをMacで使ってみる

opensouce COBOLコンパイラは、COBOLソースコードをCソースコードに翻訳し、GNUコンパイラによりUNIX環境で実行可能な exeファイルを作成する。

#### macOS 10.14.6

####インストール
インストールコマンド

```
brew install open-cobol
```

インストールディレクトリ

```
/usr/local/Cellar/open-cobol/1.1_2

$ ls -go /usr/local/Cellar/open-cobol/1.1_2/bin
-r-xr-xr-x  1     1424  6 14 15:09 cob-config
-r-xr-xr-x  1   421032  2  6  2009 cobc
-r-xr-xr-x  1    13280  6 14 15:09 cobcrun

$ ls -go  /usr/local/bin/cobc
/usr/local/bin/cobc -> ../Cellar/open-cobol/1.1_2/bin/cobc
```
バージョン

```
$ /usr/local/Cellar/open-cobol/1.1_2/bin/cobc  -V
cobc (OpenCOBOL) 1.1.0
```

ビルドコマンド
  ソースファイルの拡張子は一般的に .cbl、.cob を使用する。（これ以外でも一応コンパイルはできる）

```
cobc -x ABC.cbl         # 実行ファイル ABC を作成する
cobc -x ABC.cbl -o XYZ  # 実行ファイルの名前を XYZ で出力する 
```

実行

```
./ABC
```

Cソースコードを出力するコマンド

```
cobc -C ABC.cbl
```

コマンドの詳細はヘルプを参照のこと

```
cobc -h
```

#### ソースコードエディタ
Visual Stadio Code
EXTENSION: COBOL Source colourise
<img class="lm70 tm10 bm0" src="https://mikomokaru.sakura.ne.jp/cobol/1/cob01.png" alt="[cob01.png]" width="550">

#### PC環境でファイルを扱う
PCのテキストファイルを読み書きするためには、ファイルの宣言でファイル編成は行順ファイル（LINE SEQUENTIAL）とすること。

```
SELECT  F1  ASSIGN  TO  "./F001.txt"
ORGANIZATION IS LINE SEQUENTIAL.
```

### COBOLのコーディング技法について
#### ピリオドルール
ROCEDURE DIVISIONにおける命令文のピリオドについて整理する。

**SECTION名、段落名の終わりにはピリオドをつける。**
SECTIONまたは段落はひとつまたは複数の命令文から構成され、次に現れるSECTION名または段落名までをその範囲とする。このうち最後の命令文にはピリオドをつけなくてはならない。（途中の命令文はピリオドをつけてもつけなくてもかまわない）


命令文には、次のようにステートメントとEND-ステートメントの間に複数の命令文を構成するもがある。（構造化構文と言うらしい？）

```
IF 〜 END-IF.
EVALUATE 〜 END-EVALUATE.
PERFORM 〜 END-PERFORM.
READ 〜 END-REA.
```

これは全体で１命令文とみなし、最後のEND句のみにピリオドをつけること。内側の命令文にピリオドをつけてはならない。内側に構造化構文がネストする場合もピリオドはつけない。

サンプルのコーディングを示す。

```
 PROCEDURE               DIVISION.
***** 主処理 ***** 
 PERFORM INIT-RTN
 PERFORM LOOP-RTN UNTIL END-FLG NOT = 0
 PERFORM END-RTN
 STOP RUN.              ←プログラム最後の命令文のピリオド
***** 前処理 *****
 INIT-RTN  SECTION.     ←SECTION名のピリオド
     INITIALIZE END-FLG TOTAL
     OPEN INPUT F1.   ←SECTIONの途中の命令文のピリオドはあってもなくても構わない
     PERFORM READ-RTN.  ←SECTIONの最後の命令文ピリオド
***** 繰り返し処理 ***** 
 LOOP-RTN.              ←段落名のピリオド
     IF KIND OF F1R = 1 THEN
         ADD QUANTITY OF F1R TO TOTAL
         PERFORM VARYING I FROM 1 BY 1 UNTIL I > 3
             DISPLAY I 
         END-PERFORM    ←命令文の終わりでないから、ピリオドを打ってはならない。
     END-IF.            ←段落の途中の命令文のピリオドはあってもなくても構わない
     PERFORM READ-RTN.  ←段落の最後の命令文ピリオド
***** 後処理 *****
 END-RTN.               ←段落名のピリオド
     DISPLAY "合計=" TOTAL
     CLOSE  F1.         ←段落の最後の命令文ピリオド
***** 入力処理 *****  
 READ-RTN.              ←段落名のピリオド
     READ  F1 
         AT END
             ADD 1 TO END-FLG
     END-READ.          ←段落の最後の命令文ピリオド
```

#### 段落・SECTIONの構造

前掲のコーディングは言語仕様に則っているのでこれでも良いが、標準的なコーディング例として、段落の終わりにラベルとEXIT文を書くという方法がよく紹介されている。一般的な作法として私もこの方式を採用している。

この形式が意味を持つのは、 段落の途中でGOTO文により段落の終わりに飛び、次のEXIT文を実行する場合である。このようにする目的は、処理の途中で何らかの異常が起こり、そのあとの処理をスキップして、呼び出し元に戻りたいときなどである。

また、EXIT文の前に、エラー時の共通的な後処理（ファイルのクローズなど）を記述することができる。これは一種の try〜catch パターンといえる。

```
 LOOP-RTN.             
     ....
     
     IF エラー発生 THEN
         GO TO LOOP-RTN-EX.
     END-IF            
     ....
     
     正常フローはここ（段落の終わり）で抜ける.   
 LOOP-RTN-EX.
     必要であればエラー発生後の後処理を実行
     EXIT.  
```
構造化されたプログラムにおいて、GOTO文を使って良いのは、このようなフローだけとするのが一般的なルールである。

関連記事
[COBOL 処理パターン　多段階集計](https://qiita.com/mikomokaru-jpn/items/09f6b0f056e329550854)
[COBOL 処理パターン　マッチング](https://qiita.com/mikomokaru-jpn/items/ec75da8319cf642c33f5)
[COBOL 処理パターン　テーブル展開](https://qiita.com/mikomokaru-jpn/items/ffb340cb0d647fc56597)
[COBOL 処理パターン　外部サブプログラム呼ぶ](https://qiita.com/mikomokaru-jpn/items/967036b9bd3a11af601f)
[COBOL 処理パターン　C言語で作成した外部サブプログラムを呼ぶ](https://qiita.com/mikomokaru-jpn/items/85bb6a3b15dfe845b3e4)