対象読者: COBOLを全く触ったことがないが、人が書いたものを保守するくらいには今後触るかもしれないので、基本的なことだけ知っておきたい(完全理解したい)、どうせなら小ネタくらいは語れるようになりたい人。
動機
恥ずかしがる必要はないと思いつつ恥ずかしながら、筆者と筆者のチームはまだ稀にCOBOLの保守作業をすることがある。先日若者に「COBOLのソースの中のAUTHORという文言がコメントアウトされていないがこれは何なのか?」と聞かれショックを受けた。
助けてGoogle先生...。
COBOLのプログラムは、次の4つのDIVISIONをこの順番で記述するのが基本となっている。
IDENTIFICATION DIVISION……見出し部
ENVIRONMENT DIVISION……環境部
DATA DIVISION……データ部
PROCEDURE DIVISION……手続き部
IDENTIFICATION DIVISION.
PROGRAM-ID. HOGE010.
AUTHOR. HOGEHOGE
知っている人には空気のような話、つまりそれは見出し部なわけなんだが、こういう小ネタが満載のCOBOL。よくぞ聞いてくれたという思いと、こういうことをちゃんと知識として残すということも上の世代の責任かもしれないな(?)と思い、書くことにしました。
COBOLとは
- 事務計算処理向けに開発された言語。
- 名前は「Common Business Oriented Language」(共通事務処理用言語)に由来するらしい。
- バッチ処理 で活躍してきた。
- 小数点演算に強い。
- 文法が英語に近く、またソースの初めから順番に処理を行う構造である。
- このためプログラム経験者でなくとも意味がわかりやすくかつ読みやすい、とは言われる。
- ファイル 例
- .cbl, .ccb COBOLソースファイル
- .cpy コピーファイル
- .inc インクルードファイル
そんなCOBOLの処理とは
PERFORM <手続き名>
<手続き名>で記述された処理を1回実行します。
PERFORM <手続き名> UNTIL <終了条件>
例:PERFORM <手続き名> UNTIL END-FLG = “END”
<手続き名>で記述された処理を「END-FLG」に「END」が入力されるまで繰り返します。
PERFORM <繰り返す回数> TIMES
例:PERFORM 5 TIMES
ADD 3 TO WRK-NUM
END-PERFORM.
5回繰り返します。
アルゴリズムそのままの手続き型。なのでフローチャートが書ければ、およそ書ける。他参考。
そんなCOBOLのHello world、Fizzbuzzとは
000010 IDENTIFICATION DIVISION.
000020 PROGRAM-ID. SAMPLE-01.
000030*
000040 ENVIRONMENT DIVISION.
000050*
000060 DATA DIVISION.
000070*
000080 PROCEDURE DIVISION.
000090 MAIN.
000100 DISPLAY "HEllO WORLD!" UPON CONSOLE.
000110 STOP RUN.
000100 IDENTIFICATION DIVISION.
000200 PROGRAM-ID. SAMPLE-02.
000040 ENVIRONMENT DIVISION.
000050*
000300 DATA DIVISION.
000400 WORKING-STORAGE SECTION.
000500 01 HELLO1 PIC X(15).
000600 01 HELLO2.
000700 03 FILLER PIC X(06) VALUE 'HELLO,'.
000800 03 FILLER PIC X(01) VALUE SPACE.
000900 03 FILLER PIC X(06) VALUE 'WORLD!'.
001000 03 FILLER PIC X(01) VALUE SPACE.
001100 03 FILLER PIC 9(01) VALUE 2.
001200 PROCEDURE DIVISION.
001300 MOVE 'HELLO, WORLD! 1' TO HELLO1.
001400 DISPLAY HELLO1.
001500 DISPLAY HELLO2.
001600 STOP RUN.
000100 IDENTIFICATION DIVISION.
000200 PROGRAM-ID. FIZZBUZZ.
000300 DATA DIVISION.
000400 WORKING-STORAGE SECTION.
000500 01 I PIC 9(3).
000600 01 HENSHU-IKI PIC X(8).
000700 PROCEDURE DIVISION.
000800 PERFORM VARYING I FROM 1 BY 1 UNTIL I > 100
000900 MOVE SPACE TO HENSHU-IKI
001000 IF FUNCTION MOD(I 3) = ZERO
001100 MOVE 'FIZZ' TO HENSHU-IKI
001200 END-IF
001300 IF FUNCTION MOD(I 5) = ZERO
001400 STRING
001500 HENSHU-IKI DELIMITED BY SPACE
001600 'BUZZ' DELIMITED BY SIZE
001700 INTO HENSHU-IKI
001800 END-STRING
001900 END-IF
002000 IF HENSHU-IKI = SPACE
002100 MOVE I(3 - FUNCTION INTEGER(FUNCTION LOG10(I)):)
002200 TO HENSHU-IKI
002300 END-IF
002400 DISPLAY HENSHU-IKI
002500 END-PERFORM.
002600 STOP RUN.
これらを見てお気づきだろうが、**COBOLの予約語の数は非常に多い。**よく使われる英単語のかなりの数が予約語になっている。その理由として次のような点らしい。
- 英語風の記述が出来ることを原則にしているために他の言語では関数の呼び出しで処理されるようなことがすべて文で処理される。そのため、関数名やパラメータに相当するものまですべて予約語になる。
- 他の言語では記号で書かれるものまで英単語で書く手段を用意するために予約語としている。
- 「PICTURE」と「PIC」のように、正規形と短縮形が、どちらも予約語とされている。
- 「ZERO」と「ZEROS」のように、単数形と複数形が、どちらも予約語になっている場合がある。
COBOLの過去記事
つまりなにかと見てくれは良くないが、普通に色々できる奴なのである。
最近のCOBOL
「COBOL=DXの足かせ」は誤解
――COBOLを誤解して「DX のために、COBOL以外に変えるべき」と議論している企業があったとしたら、どんな提言をしますか?
言語には得手不得手があるので、「COBOLだから」「Javaだから」というのではなく、適材適所でシステムを構築することが一番大切だと提言します。例えば、並列処理ができない時間を要する夜間バッチをJavaや他言語に書き換える場合は、性能面でのリスクを考慮しなければならないなど、メリット、デメリットを把握したうえで、公平な目で判断する必要があると思います。COBOLからツールで変換された、1クラスに1メソッドが定義されるようなJavaソースでは、本来のオブジェクト指向型言語の良さを享受できないと思いますし、手続き型言語をオブジェクト指向型言語に変換することは無理があります。
COBOLで書かれたソースや人材のスキル、過去何十年にもわたる実績・経験といった、お客様が蓄積してきた資産。それを単純にJavaなどで書き換えてしまうと、場合によっては資産が継承されないことになり、企業にとって大きな損失です。
――全世界のトランザクションの7割がCOBOLでさばかれているという調査結果もあって、実は世の中のいろいろなところでCOBOLアプリケーションが動いています。一方で、若い人がCOBOLに触れる機会が少ないように思います。COBOLが使えると高給だという話も聞きますが(笑)、若い人にぜひ伝えておきたい魅力はありますか?
COBOLのアプリケーションは膨大に積み重ねてきたものが今も残っています。ただ、技術者の年齢が高くなっていて、同時に若手が減っています。高給かどうかはともかく(笑)、今後、若手技術者の存在価値が高まるのは間違いないでしょう。大きなチャンスとして、前向きに捉えてくれたら嬉しいですね。
おわりに: COBOLが秘伝のタレ化しないために
COBOL記事追記。
以下は余談。
具体的には、「ドキュメントよりも動くもの」を重視した結果、「ソースコードを読めばわかる」仕様になっていたり、少数精鋭の少数もいいところで、プロジェクトが1人メンバーという「ぼっちプロジェクト」と呼ばれるプロジェクトもあったりしました。
なんて、それは少々悲しい話なので、この記事で秘伝のタレ化を防げたら。そのためには今より少しだけCOBOLに興味を持ち、COBOLを完全理解して、COBOLをちょっと読んだり書いたりしてみたいな、という気持ちに少しでもなっていただけたら、さいわいです。