1. 導入:なぜENTRY文は「禁忌」なのか
数値計算の世界で長く使われてきたFortranには、歴史的な経緯で生まれた機能がいくつか存在します。その中でも、サブルーチンの途中から処理を開始できる「ENTRY文」は、現代のプログラミングにおいては非常に危険な「アンチパターン」として知られています。なぜこれを使ってはいけないのか、そして代わりにどう書くべきかを解説します。
2. 基礎知識:ENTRY文とは何か
ENTRY文とは、一つのサブルーチンの中に複数の入り口(エントリーポイント)を作り、呼び出し元によって実行を開始する位置を変える仕組みです。一見、コードを共通化できて便利そうに見えますが、プログラムの論理構造を複雑にし、データの流れを追いづらくします。いわば「迷路のような構造」を作り出してしまうため、コンパイラによる最適化が阻害され、バグの温床となります。
3. 実装と解決策:代わりの設計手法
ENTRY文を使いたくなる主な動機は「共通の変数や処理を使い回したい」という点にあるはずです。これを解決する現代的な手法は、以下の2つです。
・共通処理を別のサブルーチンとして切り出す
共通する計算ロジックを独立したサブルーチン(または関数)にし、必要な場所から呼び出します。
・引数で処理を切り替える
「フラグ(引数)」を渡し、サブルーチン内部でif文を使って処理を分岐させます。
4. サンプルプログラム:推奨される書き方
以下は、ENTRY文を使わずに、引数で処理を分岐させる安全なコード例です。
[サンプルコード]
program main
implicit none
! 計算を実行する
call my_procedure(10, 20, 1) ! モード1で実行
call my_procedure(10, 20, 2) ! モード2で実行
end program main
subroutine my_procedure(a, b, mode)
implicit none
integer, intent(in) :: a, b, mode
integer :: result
! 共通処理があればここに記述する
if (mode == 1) then
! モード1の処理
result = a + b
print , “加算結果:”, result
else if (mode == 2) then
! モード2の処理
result = a b
print , “乗算結果:”, result
else
print , “無効なモードです”
end if
end subroutine my_procedure
5. 応用・注意点:現場でのバグ回避
現場で古いプログラムをメンテナンスしていると、ENTRY文に出くわすことがあります。その際、既存のENTRY文を無理に修正しようとすると、隠れた副作用(意図しない変数の共有など)で計算結果が狂う可能性があります。
もし古いコードをリファクタリングする場合は、まずそのサブルーチンの引数と変数の依存関係を徹底的に書き出してください。安易に削除せず、可能であればその機能自体を「独立したサブルーチン」として新しく書き直すのが、最も安全で効率的なアプローチです。複雑なコードを整理することは、結果として計算の信頼性を高めることにつながります。

コメント