🦕

COBOLで遊ぼう(2):COBOLのプリプロセッサ

に公開

C言語と比べてみる

C言語のプリプロセッサは、例えばこんな感じ。

#define DLEVEL  3
#if DLEVEL > 2
    display( debugptr );
#else
    #define STACK 200
#endif

同じ事をCOBOL言語で書いてみるとこう。

001000 >>DEFINE  DLEVEL AS 3
001010
001020 >>IF DLEVEL > 2
001030     DISPLAY debugptr .
001040 >>ELSE
001050     >>DEFINE STACK AS 200
001060 >>END-IF

とてもよく似ています。

この書き方はCOBOLの国際規格で追加された正式な仕様ですが、実際に使われているのをあまり見たことがありません(苦笑)。

C言語と似ているように見えて実はちょっと違う

ここからが本題です。
C言語の#defineはソース中の字句も置換できます。例えば以下のように書けます。

#define DLEVEL  3
printf("value=%d\n", DLEVEL);

ところがCOBOLではソースの中の字句は置換できません。「>>」で始まる行でしか効かないのです。
以下はコンパイルエラーになります。

001000 >>DEFINE  DLEVEL AS 3
001070 DISPLAY DLEVEL.

COBOLでソースの中の字句を置換するにはどうしたらよいでしょうか?
そのために置換専用の機能があります。その名もREPLACE文です。以下は動きます。

001000 REPLACE  ==DLEVEL== BY ==3==.
001070 DISPLAY DLEVEL.

はい。ここで変態的仕様の僕が大好きなREPLACE文が出てきました。
実はCOBOLという言語ではコンパイラが走るときの前処理として複数段階のソース変換処理が走ります。そして「>>」による変換処理とREPLACE文の変換処理は独立して動きます。
このあたりがCOBOLコンパイラ独特のおもしろさだと思っています。

Discussion