1.はじめに
COBOLは現在も尚、企業システムにおいて重要な役割を果たしています。COBOLで書かれたシステムをJavaで書きなおすことを目的としたプロジェクトも一定数存在します。よって、COBOLエンジニアでなくとも、この言語について多少の理解を持っておくのは有益と考えます。
この記事では、COBOLエンジニアの思考プロセスを解説することにより、モダンなプログラミング言語のエンジニアがこの言語を理解する助けになることを目的としています。今回は、COBOLの代表的な処理パターンである、順次アクセスファイルの読み書きを解説したいと思います。
2.COBOLエンジニアの頭の中
COBOLエンジニアが何らかの処理を設計したりコーディングしたりする時の頭の中をシミュレーションしてみます。例えば、次のようなデータがあったとします(便宜上CSV形式で表現しています)。このデータのすべてのレコードのすべての値を10倍するという処理を考えてみます。
10,100,1000,10000
20,200,1000,20000
30,300,3000,30000
40,400,40000,40000
50,500,50000,50000
モダンなプログラミング言語のエンジニアであれば、このデータを見た時、頭の中で瞬時に配列に格納するでしょう。
例えば、((10,100,1000,10000),(20,200,1000,20000),(30,300,3000,30000),(40,400,40000,40000),(50,500,50000,50000))
というような形で認識していると思います。この配列のすべての要素を10倍するというような処理が求められた時は、配列をハンドリングするための関数を作成して、そこにこの配列をそのまま代入するようなプログラムを想起するのではないでしょうか。一方、COBOLエンジニアの場合は、頭の中でまず、次の形でこのデータを認識します。数値なので各カラムはゼロ埋めされています。一度に認識するのは1レコードだけです。
000010000100001000010000
次に、これをカラムに分解します。各カラムが何桁目で区切られているかは、プログラム中の最初の方で定義されていて、このエンジニアはそれを頭に入れつつ次のように分解し、1つ1つのカラム値に10を掛けます。
10 * 10 = 100
100 * 10 = 1000
1000 * 10 = 10000
10000 * 10 = 100000
そしてこれを次のようなレコードにまとめた上で、アウトプットの順次アクセスファイルに1レコード書き込みます。
000100001000010000100000
そして、次のレコードを、1行読み、
000020000200002000020000
このように認識して、以下最後のレコードまで同様に処理していきます。
上記の処理のように、ある断面を取ると、エンジニアの頭の中では1レコードしか存在していません。これは、コンピューターのメモリの中でも同じで、メモリの消費量が非常に少ない。COBOL当時のハードウエアの価格や技術水準を考えると非常に合理的な設計になっています。今後説明する予定のコントロール・ブレイクという処理でも、一度にメモリ上に存在するのは多くとも数レコードです。
3.最後に
元々COBOLエンジニアの私が、Pythonを勉強した時のことです。そこそこ大きなテキストファイルを処理するプログラムを書いていました。最初はfor文を使って、1レコードずつ処理していました。ある時、テキストファイルの中身が配列に見えるようになったのです。私がモダンなプログラミング言語を理解し始めたのはその時だと思います。
COBOLエンジニアがモダンな言語を習得するためには配列の概念を理解しなければなりません。尚、COBOLにも仕様として配列という型はありますが、それはレコード内で繰り返しの処理を楽にプログラミングしたい時に使うのであって、モダンな言語の配列とは違うように思います。
一方、モダンな言語のエンジニアが何らかの理由でCOBOLやRPG、PL/1といったクラッシックな言語の理解が必要な局面もあるかもしれません。その場合には、「一度に一行」という原則を理解してください。そして、COBOLにおける配列の考え方は、あなたのそれとは違っていることを念頭においてください。
続編を書きました。
COBOL脳を解説する(2)