Fortran コードの改良 (GOTO 文)

もう Fortran なんて使っている人はほとんどいないでしょうけど、とっくに退職した社員が遺産として古いコードを残している会社もあるかもしれないので、ちょっとしたノウハウを紹介。

古い人間が作った Fortran プログラムを現代人が扱えるように VB.Net や C# にコンバートする作業を行ったことがありますが、そういうプログラムには例外なく大量の GOTO 文が使われていて、それはそれは香ばしいほどのスパゲティコードになっているわけです。

簡単な例ではこんな感じ。

     IF(X.EQ.0.0) GOTO 100
     IF(X.LT.0.0) GOTO 200
     Y=1.0
     GOTO 300
 100 Y=0.0
     GOTO 300
 200 Y=-1.0
 300 CONTINUE

こういうコードを見て、現代人なら「なんで IF~END IF を使わないんだよ!」と思ったりするわけですが、かつてハードの性能が低かった時代には少しでも処理速度を上げるために GOTO 文を多用するのが普通でした。おかげで作った本人以外には(おそらく時間がたてば本人にとっても)著しく可読性の低いコードが出来上がってしまうというわけです。

こういうコードを他言語にコンバートする場合や、または現代人が読みやすいように書き換える場合、まずは GOTO 文をなくすことから始めるのが近道です。例えば前述のコードならこんな感じ。

  IF(X.EQ.0.0) THEN
    Y=0.0
   ELSE IF(X.LT.0.0) THEN
    Y=-1.0
   ELSE
    Y=1.0
  END IF

こういう例なら容易ですが、よくこれだけの処理を GOTO 文だけで作り上げたと感動するほど入り組んだコードが見つかることもあります。作った本人もよく間違えなかったと感心しますが、これを解読する側は本当に死にそうになります。

すべての GOTO 文を IF 文や DO LOOP 等に書き換え、実行結果が同じになることを十分に確認してから、ようやく他言語へのコンバートになります。遠回りに見えても、動作確認まで含めたら結局はそれが一番早いと考えています。

合同会社アイナックエンジニアリングでは、このようなレガシーシステムのマイグレーションも可能ですので、会社に古いコードが残っていて扱いに困っているような場合はお問い合わせください。

ロジック

前の記事

3D Model での球の作り方
VB.Net

次の記事

4面体の内部か外部か