1. 導入:なぜ配列サイズを「動的」にする必要があるのか?
メインフレーム開発において、配列のサイズをあらかじめ固定(静的宣言)してプログラムを書くことは一般的ですが、処理対象のデータ件数が実行時まで分からない場合、固定サイズでは「領域不足」や「メモリの無駄」が発生します。今回紹介するCONTROLLED属性を活用すれば、実行時に必要な分だけメモリを確保し、不要になれば解放することが可能です。これは、現代のプログラミング言語における可変長配列に近い柔軟性を、PL/Iで実現するための重要なテクニックです。
2. 基礎知識:CONTROLLED属性とは
PL/IにおけるCONTROLLED属性は、プログラマが明示的にメモリの確保(ALLOCATE)と解放(FREE)を制御するための記憶域クラスです。通常の静的な配列と異なり、宣言時にはサイズを確定させる必要はありません。コンパイラは、プログラムから指示があったタイミングで、指定されたサイズ分だけメモリを割り当てます。これにより、大規模なデータ処理でも効率的なメモリ管理が可能になります。
3. 実装・解決策:ALLOCATEとFREEの基本
動的配列を扱う手順は非常にシンプルです。
1. 宣言: 配列名にCONTROLLED属性を付与します。
2. 確保: ALLOCATE文でサイズを指定してメモリを確保します。
3. 操作: 通常の配列と同じように要素にアクセスします。
4. 解放: 処理終了後にFREE文でメモリを解放します。
4. サンプルプログラム
以下のコードは、実行時に決まる変数Nを使って配列サイズを動的に決定し、使用後にメモリを解放する例です。
/ 配列をCONTROLLED属性で宣言(サイズはまだ未定) / DCL MY_ARRAY() FIXED BIN(31) CONTROLLED; DCL N FIXED BIN(15) INIT(100); / 処理対象の件数 / / 1. 実行時にサイズを決定してメモリを確保 / ALLOCATE MY_ARRAY(N); / 配列への操作 / MY_ARRAY(1) = 10; MY_ARRAY(N) = 999; / 日本語コメント:最後の要素に値を代入 / / 2. 不要になったら明示的に解放 / FREE MY_ARRAY;
5. 応用・注意点:ライフサイクル管理の重要性
この技術で最も注意すべき点は、メモリリークとスタック的な挙動です。CONTROLLED属性の配列を複数回ALLOCATEすると、古い領域は隠れますが解放はされません。再度ALLOCATEする前には、必ずFREEを実行する習慣をつけましょう。また、サブルーチン内でALLOCATEした場合は、戻る前にFREEを忘れないよう注意してください。この「確保」と「解放」の対を意識することで、メインフレームの限られたリソースを賢く使いこなす堅牢なプログラムが書けるようになります。

コメント