opensouce COBOLをMacで使ってみる

COBOL

opensouce COBOLをMacで使ってみる

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

インストール

インストールコマンド
バージョン
インストールディレクトリ
ビルドコマンド
ソースファイルの拡張子は一般的に .cbl、.cob を使用する。(これ以外でも一応コンパイルはできる)
実行
Cソースコードを出力するコマンド
コマンドの詳細はヘルプを参照のこと

ソースコードエディタ

Visual Stadio Code
EXTENSION
COBOL Source colouriser (Free)
[cob01.png]

PC環境でファイルを扱う

PCのテキストファイルを読み書きするためには、ファイルの宣言でファイル編成は行順ファイル(LINE SEQUENTIAL)とすること。

COBOLのコーディング技法について

ピリオドルール

ROCEDURE DIVISIONにおける命令文のピリオドについて整理する。
SECTION名、段落名の終わりにはピリオドをつける。
SECTIONまたは段落はひとつまたは複数の命令文から構成され、次に現れるSECTION名または段落名までをその範囲とする。このうち最後の命令文にはピリオドをつけなくてはならない。(途中の命令文はピリオドをつけてもつけなくてもかまわない)
命令文には、次のようにステートメントとEND-ステートメントの間に複数の命令文を構成するもがある。(構造化構文と言うらしい?)
これは全体で1命令文とみなし、最後のEND句のみにピリオドをつけること。内側の命令文にピリオドをつけてはならない。内側に構造化構文がネストする場合もピリオドはつけない。
サンプルのコーディングを示す。

段落・SECTIONの構造

前掲のコーディングは言語仕様に則っているのでこれでも良いが、標準的なコーディング例として、段落の終わりにラベルとEXIT文を書くという方法がよく紹介されている。一般的な作法として私もこの方式を採用している。
この形式が意味を持つのは、 段落の途中でGOTO文により段落の終わりに飛び、次のEXIT文を実行する場合である。このようにする目的は、処理の途中で何らかの異常が起こり、そのあとの処理をスキップして、呼び出し元に戻りたいときなどである。
また、EXIT文の前に、エラー時の共通的な後処理(ファイルのクローズなど)を記述することができる。これは一種の try〜catch パターンといえる。
構造化されたプログラムにおいて、GOTO文を使って良いのは、このようなフローだけとするのが一般的なルールである。

[例題] 順編成ファイルの単純な入出力

本プログラムでは、3バイトの英数字を1レコードとしたデータを順編成ファイルから読み込み、それをそのまま別ファイルに書き出すという処理を行う。
順編成ファイルの入出力について
COBOLでは、順編成ファイルの入力はファイルの先頭から固定長のデータを順次に読み込み、出力は、固定長のデータをファイルの最後尾に順次追加していくという動作になる。
opensouce COBOLでは、扱える順編成ファイルは2種類ある。ひとつめは、固定長のレコードがファイルの先頭から順番に並ぶものである。ファイルの形式は SEQUENTIAL(順編成)を指定する。本例では3バイトのレコードが3件並ぶデータを使用するが、ファイルをエディタで表示すると次のようになる。
これは、従来の汎用機の処理で行っていた一般的な COBOLの順編成ファイルの形式であり、バイトストリーム方式によりデータの入出力を行うことと等しい。
ふたつめは、改行コードが含まれるテキストファイル(.txt)である。ファイルの形式は LINE SEQUENTIAL(行順編成)を指定する。改行コードを含むテキストファイルは、可読性が高く、エディタで容易に操作することができる。本例のデータであれば、3バイトの固定長レコードの後ろに改行コードを挿入したものになる。なお、EOFの判定を正しく行うために最終レコードの後ろにも改行コード付加する必要がある。データをエディタで表示すると次のようになる。
レコードとして読み込むときは、改行コードは無視して、SEQUENTIAL(順編成)と同じように固定長のレコードとして読み込む。(したがって、LINE SEQUENTIALを指定しても、改行コードがないファイルを読み込むことができる。ただしファイルの最後には一つの改行コードが必要になる。)レコードを書き出すときは、固定長のレコードに後ろに自動的に改行コードが挿入される。
なお、固定長のデータの中に改行コードがあると、改行コードまでを1レコードして読み込む。"ABCDE↩️F↩️" は、"ABC" と "DE" と "F" の3件のレコードとなる。そもそも固定長の区切りと改行コードの位置は合わせなくてはいけないという話である。