0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Posted at

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の前処理は正確にはプリプロセッサではなくて、原始文操作とか翻訳指示とか言いますが、ここではわかりやすさを優先してプリプロセッサと書いています。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?