なぜこの知識が重要なのか
COBOLを学び始めた方が、他言語(JavaやPythonなど)の経験があると必ずと言っていいほど陥る罠があります。それは「SECTION(節)を作れば、その中の変数はローカル変数として隠蔽されるはずだ」という思い込みです。しかし、COBOLではプログラム内のすべての変数は、どのSECTIONからでもアクセス可能な「グローバル変数」として扱われます。この仕組みを知らずに設計すると、意図しない場所で変数が書き換えられ、原因不明のバグに悩まされることになります。
基礎知識:COBOLの変数のスコープ
COBOLにおいて、データ項目(変数)はすべて「DATA DIVISION」で定義されます。この定義はプログラム全体に対して有効です。一方、「PROCEDURE DIVISION」内のSECTIONは、あくまで処理をまとめるための「見出し」や「制御の単位」に過ぎません。C言語やJavaのような「関数内のローカル変数」という概念は、標準的なCOBOLには存在しないのです。したがって、どのSECTIONにいても、DATA DIVISIONにある変数はすべて「丸見え」であり、どこからでも変更できてしまいます。
実装と解決策:命名規則による擬似的なカプセル化
変数がどこからでも触れてしまうという特性上、現場で最も重視されるのが「命名規則」です。どのSECTIONで使う変数なのかを明確にするために、変数名に接頭辞をつけるのが鉄則です。例えば、「処理A」で使う変数なら「A-01-WORK-VAR」のように、どの処理の変数かを名前に含めることで、誤ったアクセスを防ぎます。
サンプルプログラム
以下のプログラムは、SECTIONを分けても変数が共有されている様子を示しています。
IDENTIFICATION DIVISION.
PROGRAM-ID. SCOPE-SAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.
- 命名規則により、どのSECTION用かを見分けやすくする
01 A-SECTION-DATA PIC X(10).
01 B-SECTION-DATA PIC X(10).
PROCEDURE DIVISION.
PERFORM SECTION-A.
PERFORM SECTION-B.
STOP RUN.
SECTION-A SECTION.
- SECTION-Aの中だが、B用の変数にもアクセスできてしまう
MOVE “A-DATA” TO A-SECTION-DATA.
DISPLAY “SECTION-A: ” A-SECTION-DATA.
EXIT.
SECTION-B SECTION.
- SECTION-BからAの変数を書き換えることも可能(バグの温床!)
MOVE “B-DATA” TO B-SECTION-DATA.
MOVE “CHANGED BY B” TO A-SECTION-DATA.
DISPLAY “SECTION-B: ” B-SECTION-DATA.
DISPLAY “SECTION-B modified A: ” A-SECTION-DATA.
EXIT.
応用・注意点:現場で生き残るための教訓
現場のベテランとしてアドバイスすると、「プログラムを巨大にしすぎないこと」が最大のバグ回避策です。変数が多すぎて管理不能になる場合は、プログラム自体を分割し、「CALL文」を使って別のプログラムとして呼び出すことを検討してください。CALLされる側(サブプログラム)であれば、DATA DIVISIONを分離できるため、真の意味での変数隠蔽が可能になります。
また、コーディング規約で「このSECTION以外からは絶対にこの変数に触らないこと」とルール化することも重要です。COBOLは自由度が高い分、設計者の規律が品質を左右する言語であることを忘れないでください。

コメント