1. 導入:なぜこの技術を知る必要があるのか
プログラミングの世界には、現代では「絶対に使ってはいけない」とされる技術が存在します。その代表格が、古いFORTRANで使われていた「割り当て型GOTO(Assigned GOTO)」です。なぜ今さら古い技術の話をするのかというと、レガシーシステム(数十年前に作られた古いプログラム)の保守や解析を行う際、これに遭遇して頭を抱えるエンジニアが後を絶たないからです。プログラムの流れが動的に変化するこの仕組みを理解することは、トラブルシューティングの第一歩となります。
2. 基礎知識:割り当て型GOTOとは何か
通常、プログラムのジャンプ先(GOTO文)は「100行目へ飛ぶ」といったように、コードを書いた時点で固定されています。しかし、割り当て型GOTOは、「変数に格納された行番号」に向かってジャンプするという特殊な挙動をします。
例えるなら、地図上の目的地が、その時の状況によってコロコロ変わるようなものです。プログラムが次にどこへ行くのかが実行するまで分からないため、コンピューターによる静的な解析が極めて困難になります。これが、コードが複雑に絡まり合う「スパゲッティコード」の主犯とされる理由です。
3. 実装と仕組み
割り当て型GOTOは、主に以下の2つのステップで動作します。
1. ASSIGN文で、特定の行番号を変数に代入する。
2. GOTO文で、その変数を呼び出し、ジャンプさせる。
Fortran 95以降では廃止されましたが、古いFortran 77などのコードでは頻繁に見かけます。この構造は、現代のプログラミングにおける「関数ポインタ」や「動的ディスパッチ」の原始的な形態とも言えます。
4. サンプルプログラム
以下は、割り当て型GOTOを使用した古いFortranコードのイメージです。動作確認用としてご覧ください。
PROGRAM ASSIGNED_GOTO_SAMPLE
INTEGER :: LABEL_VAR
! 行番号100を変数LABEL_VARに割り当てる
ASSIGN 100 TO LABEL_VAR
! 変数の中身に従ってジャンプする
GOTO LABEL_VAR
100 CONTINUE
PRINT , “100番にジャンプしました!”
! 割り当て先を変えてみる
ASSIGN 200 TO LABEL_VAR
GOTO LABEL_VAR
200 CONTINUE
PRINT , “200番にジャンプしました!”
STOP
END PROGRAM ASSIGNED_GOTO_SAMPLE
5. 応用・注意点:バグを回避するために
もしあなたがレガシーシステムの改修を任されたら、以下の点に注意してください。
・現代的な構造への書き換えを検討する
割り当て型GOTOが使われている箇所は、ほぼ間違いなく「SELECT CASE」文や「IF-ELSEIF」文で書き換えることができます。論理構造を整理することで、バグの温床を解消できます。
・変数の追跡が最優先
解析が必要な場合、その変数がプログラムのどこで「ASSIGN」されているかを徹底的に追跡してください。変数の値が予期せぬ場所で書き換えられていると、プログラムがどこに飛ぶか分からなくなり、原因不明のクラッシュや無限ループを引き起こす原因となります。
古い技術を知ることは、現代の洗練されたプログラミングがいかに「読みやすさ」を重視しているかを再認識する良い機会になります。もし古いコードで迷子になったら、まずは変数の行方を確認することから始めてみてください。

コメント