【入門編】INTERNAL属性によるスコープの限定 – PL/Iの基本構文とデータ制御実践ガイド

PL/Iの「名前」と「守備範囲」:INTERNAL属性で安全なコードを書こう

こんにちは!メインフレームの世界へようこそ。
JavaやCOBOLを触ってきた方にとって、PL/Iは「なんだか古臭そうだけど、実は懐が深い言語だな」と感じるかもしれません。

今日は、そんなPL/Iのちょっと変わった、でも非常に強力な「名前のルール」と「変数の守備範囲(スコープ)」についてお話しします。特に、「なぜ予約語がほとんどないのか?」「INTERNAL属性って何のためにあるのか?」という疑問を、現場の視点でスッキリ解消していきましょう。

1. PL/Iには「予約語」がない? 自由すぎて怖いあなたへ

Javaなどで「`class`とか`if`を変数名に使っちゃダメ!」と怒られた経験はありませんか?
PL/Iの面白い(そして最初は戸惑う)ところは、「予約語」という概念がほぼ存在しないという点です。

例えば、こんな無茶苦茶な宣言もPL/Iなら通ってしまいます。

/i
IF: PROCEDURE;
DECLARE IF FIXED BIN(31) INITIAL(10);
DECLARE THEN FIXED BIN(31) INITIAL(20);

IF = THEN + 5; / 15が代入される。コンパイラは混乱しないの? /
END IF;

「え、`IF`や`THEN`が変数名に使えたら、制御構文と区別がつかないのでは?」と思いますよね。
実はPL/Iのコンパイラは、文脈(コンテキスト)を見て「あ、ここでは`IF`はキーワードだな」「ここは変数名だな」と賢く判断しています。

ただし、「できること」と「やるべきこと」は違います。 現場では絶対にやめてくださいね。コードを読む人がパニックになりますから(笑)。

2. 変数の守備範囲を決める「INTERNAL」属性

さて、今回の本題です。大規模なバッチシステムを改修していると、「あれ?この変数、どこから触られてるんだ?」と迷子になることはありませんか?

PL/Iには、変数の有効範囲をそのプロシージャ(関数)内に閉じ込める強力な属性があります。それが `INTERNAL` です。

データの「家」を限定する

`INTERNAL` は、「この変数はこの部屋(プロシージャ)の中だけで使いますよ。外からは見えませんよ」という看板を掲げるようなもの。意図しない場所からの書き換えを防ぐ、いわば「カプセル化」の先駆けですね。

/i
CALC_TOTAL: PROCEDURE(INPUT_VAL);
/ このプロシージャ内だけで有効な変数 /
DECLARE WORK_AREA FIXED BIN(31) INTERNAL;

WORK_AREA = INPUT_VAL 2;
/ 処理… /
END CALC_TOTAL;

もし、別のプロシージャから `WORK_AREA` を覗こうとしても、コンパイラは「そんな変数、知りませんけど?」と門前払いしてくれます。これが、大規模システムにおける「名前の衝突」を防ぐ最強の盾になるわけです。

3. なぜ「INTERNAL」を意識する必要があるのか?

メインフレームの基幹システムは、何万行ものコードが絡み合っています。
もし変数に `INTERNAL` を付け忘れると、デフォルトの規則(`EXTERNAL`になる場合がある)によって、うっかり他のプログラムから値を書き換えられてしまうリスクがあります。

現場でよくある悲劇

「なぜかこのバッチを通すと、計算結果がたまに狂う……」
そんなバグの原因を追うと、「共通で使っている変数の名前が、別のプロシージャでも使われていた」というケースが意外と多いのです。

これを防ぐための鉄則を伝授します。

1. 基本はローカルで宣言する: 必要な変数は、必ずそのプロシージャの先頭で `DECLARE` する。
2. スコープを意識する: 「これ以上外で見せる必要はない」ものは、明示的に `INTERNAL` を意識する(PL/Iのデフォルト動作を過信しないことが、ベテランへの第一歩です)。

まとめ:PL/Iは、あなたの「意図」を大切にする言語

PL/Iの自由度は、「何でも書いていいよ」という放任主義ではなく、「プログラマが意図を持って記述するなら、最大限の柔軟性を提供するよ」というエンジニアへの信頼から来ています。

  • 予約語がないこと=コンパイラが文脈を汲み取ってくれる信頼の証。
  • INTERNAL属性=変数という「大切なデータ」を、守るべき範囲に閉じ込めるための鍵。

最初は少し奇妙に感じるかもしれませんが、一つずつ「この変数はどこまで見えていてほしいか?」を整理しながらコードを書いてみてください。そうすれば、PL/Iの堅牢な世界観が見えてくるはずです。

もし分からないことがあれば、いつでも聞いてくださいね。一緒にレガシーの海を泳ぎ切りましょう!

タイトルとURLをコピーしました