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
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.
これは全体で1命令文とみなし、最後の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 処理パターン 多段階集計
COBOL 処理パターン マッチング
COBOL 処理パターン テーブル展開
COBOL 処理パターン 外部サブプログラム呼ぶ
COBOL 処理パターン C言語で作成した外部サブプログラムを呼ぶ