LoginSignup
2
0

More than 1 year has passed since last update.

opensouce COBOLをMacで使ってみる

Last updated at Posted at 2021-10-22

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
[cob01.png]

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言語で作成した外部サブプログラムを呼ぶ

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0