【PL/I学習|初心者向け】PL/Iの落とし穴を回避!BUILTIN属性で名前の衝突を防ぐ方法

1. 導入:なぜBUILTIN属性が重要なのか

メインフレームのPL/I開発において、頭を悩ませるのが「予約語が存在しない」という特性です。他の言語では「予約語」として禁止されている名前(例えばADDRやSUBSTRなど)を、PL/Iでは変数名として宣言できてしまいます。もしうっかり組み込み関数と同じ名前を変数に使ってしまうと、コンパイラは「これは関数呼び出しなのか?それとも変数参照なのか?」と混乱し、予期せぬエラーやバグを招くことがあります。これを防ぎ、コードの安全性を守るのがBUILTIN属性です。

2. 基礎知識:PL/Iの名前解決の仕組み

PL/Iには、他のモダンな言語のような「予約語(言語仕様で定義された特別なキーワード)」がありません。そのため、ADDR(アドレス取得)やSUBSTR(文字列抽出)といった非常に便利な関数名であっても、プログラマが自由に変数名として定義できてしまいます。しかし、コンパイラにとってそれは「名前の衝突」を意味します。BUILTIN属性を明示することで、コンパイラに対して「この名前は変数ではなく、言語標準の関数として解釈せよ」と明示的に指示を出すことができます。

3. 実装/解決策:BUILTIN属性の指定方法

解決策は非常にシンプルです。組み込み関数と同じ名前を変数として使いたい場合、あるいは特定の関数を確実に利用したい場合は、プログラムの冒頭でその名前に対してBUILTIN属性を宣言します。これにより、コンパイラは名前解決の優先順位を「関数」として固定します。

4. サンプルプログラム

以下は、組み込み関数であるADDRを明示的に指定して安全に呼び出す例です。

/ サンプル:BUILTIN属性を使用した名前の保護 /
TEST_PROG: PROC OPTIONS(MAIN);

/ ADDRという名前は組み込み関数であることを明示する /
DCL ADDR BUILTIN;

/ 通常の変数定義 /
DCL MY_VAR CHAR(10) INIT(‘DATA’);
DCL P POINTER;

/ BUILTIN属性があるため、コンパイラはこれを関数として正しく解釈する /
P = ADDR(MY_VAR);

PUT SKIP LIST(‘ポインタアドレスの取得に成功しました’);

END TEST_PROG;

5. 応用・注意点:現場での活用とバグ回避

現場の保守開発や移行作業では、既存の古いプログラムを扱う機会が多くあります。特に古いコードでは、意図的に変数名として組み込み関数名が使われているケースがあり、これが後の改修で大きなバグの温床になります。

注意点:
1. 宣言の強制: 可能な限り、利用する組み込み関数は冒頭のDCL文でまとめてBUILTIN属性として宣言しておくことを強く推奨します。
2. 移行時の判別: 他言語への移行ツールや静的解析ツールは、このBUILTIN属性の有無をチェックして「関数」か「変数」かを判別しています。この属性が漏れていると、ツールによる自動変換が失敗する原因となります。

名前の衝突は「動くから大丈夫」ではなく、「将来の誤解を招くリスク」として捉え、BUILTIN属性で明示的にガードする習慣をつけましょう。

コメント

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