C言語と比べてみる
C言語のプリプロセッサは、例えばこんな感じ。
#define DLEVEL 3
#if DLEVEL > 2
display( debugptr );
#else
#define STACK 200
#endif
display()はデバッグ用のユーザ関数と見てください
同じ事を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の国際規格で追加された正式な仕様ですが、実際に使われているのをあまり見たことがありません(苦笑)。
まじめな話をすると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コンパイラ独特のおもしろさだと思っています。
COBOLの前処理は正確にはプリプロセッサではなくて、原始文操作とか翻訳指示とか言いますが、ここではわかりやすさを優先してプリプロセッサと書いています。