【PL/I学習|実務向け】メインフレーム開発におけるRETURNステートメントの適切な制御と設計思想

導入

メインフレームのプログラミングにおいて、RETURNステートメントは単なる「関数の終了」以上の意味を持ちます。特にPL/Iなどの手続き型言語では、スタックフレーム(DSA:Dynamic Storage Area)の解放という物理的なメモリ管理に直結するため、不適切な記述はメモリリークや意図しないプロシージャ終了を招く恐れがあります。本稿では、RETURNステートメントの正しい運用方法と、現場で陥りやすい「暗黙的リターン」の罠について解説します。

基礎知識

RETURNステートメントは、実行中のプロシージャを中断し、制御を呼び出し元へ戻すための命令です。
スタックフレーム(DSA)の解体:メインフレームにおいて、プログラムは呼び出されるたびにメモリ上にDSAと呼ばれる作業領域を確保します。RETURNはOSに対し、この領域を解放するように要求するトリガーとしての役割を担っています。
暗黙的リターン:多くのメインフレーム言語(PL/I等)では、プロシージャの最後の行(END文)に到達することでも自動的に呼び出し元へ戻ります。これを「暗黙的リターン」と呼びますが、ロジックの複雑化により、意図せず末尾まで到達してしまうバグが頻発します。

実装/解決策

実務においては、「プロシージャの出口を明確にする」ことが保守性の鍵となります。複数の条件分岐がある場合、分岐ごとにRETURNを散らばらせるのではなく、出口となる変数を特定し、最後に単一のRETURNを記述する手法(単一出口ルール)が推奨されます。ただし、エラーハンドリングなどで早期脱出が必要な場合は、明示的にRETURNを記述し、その際に終了コードを適切に設定してください。

サンプルプログラム

以下は、PL/Iを想定した実用的な構造の例です。

/ 処理結果を判定して適切にリターンするサンプル /
PROC_SAMPLE: PROCEDURE(INPUT_VAL) RETURNS(FIXED BIN(31));

DCL INPUT_VAL FIXED BIN(31);
DCL RC FIXED BIN(31); / リターンコード用変数 /

/ 初期化 /
RC = 0;

/ 異常系:早期リターン /
IF INPUT_VAL < 0 THEN DO; RC = -1; RETURN(RC); / ここで即座にDSAを解放し呼び出し元へ戻る / END; / 正常系処理 / IF INPUT_VAL > 100 THEN DO;
RC = 1;
END;
ELSE DO;
RC = 0;
END;

/ 正常終了時のリターン /
RETURN(RC);

END PROC_SAMPLE;

応用・注意点

現場で最も注意すべきは、「条件分岐の漏れ」です。例えば、IF-THEN-ELSE構文でELSEの処理を書き忘れた場合、そのままプロシージャのEND文まで突き抜けてしまいます。これが意図した挙動であれば問題ありませんが、想定外の経路で暗黙的リターンが発生すると、後続のプログラムで戻り値の不整合が起き、デバッグが極めて困難になります。

また、大規模なプログラムでは、RETURNの前に必ず「確保したリソース(ファイルクローズや一時ストレージの解放)」が正しく行われているかを確認してください。RETURNは物理的な切断トリガーであるため、解放処理を忘れたままRETURNを実行すると、後続のバッチジョブや他タスクでリソース枯渇が発生する要因となります。出口が複数ある場合は、共通の終了処理をサブルーチン化するなどの工夫が必要です。

コメント

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