Fortan77プログラムをC#に変換しようとしています。約650行のコードと恐ろしいGOTOステートメントを含むサブルーチンが至る所にあります。サブルーチンのフローを視覚化して、それが何をするのかを理解し始めることさえ、私は多くの問題を抱えています。
この種の経験があり、このサブルーチンの概要を取得する方法についてアドバイスしてくれる人はいますか?このタイプの変換を高速化または促進するために使用できるツールはありますか?
Fortan77プログラムをC#に変換しようとしています。約650行のコードと恐ろしいGOTOステートメントを含むサブルーチンが至る所にあります。サブルーチンのフローを視覚化して、それが何をするのかを理解し始めることさえ、私は多くの問題を抱えています。
この種の経験があり、このサブルーチンの概要を取得する方法についてアドバイスしてくれる人はいますか?このタイプの変換を高速化または促進するために使用できるツールはありますか?
回答:
私の経験では、これを実行する良い方法は、Fortranコードのフローチャートを作成することです。GOTOステートメントのターゲットを別々のブロックに分離し、ダイアグラムを使用して、高レベルでコードを理解しようとします。
GOTOを論理的にループまたは関数呼び出しに置き換えることができるかどうかを確認してください。結果の図がツリー構造の形式である場合、GOTOに頼らずにC#に変換するのは比較的簡単です。ただし、最終的には、コードを十分に理解して、結果を自信を持って維持および使用できるようにする必要があります。
goto
は、賢明に適用すると非常に便利です。なしでは、効率的な大規模な状態オートマトンを実装することはできませんgoto
。もちろん、生成されたコードでもそれらが必要になります。
ダニエルBが上に書いたことに加えて、私は次のように言うでしょう:
まず、Fort for DotNetで使用するFortranコードを入手します。「再プログラミングでどこにも行けない」場合ではなく、再プログラミングを試みる前です。小さな一歩ですが、正しい方向に向かっています。
次に、C#でテストスイートを記述します。テストスイートは、Fortranコードに入力したものを入力し、出力を保存します。テストスイートを1回実行し、出力を保存します。次に、テストスイートを拡張して、保存された出力に対して生成された出力をテストします。Fortranコードが同じ入力を与えられたときに常に同じ出力を生成すると仮定すると、テストはもちろん成功するはずです。
次に、C#でコードを書き換えている間、テストスイートでコードを実行し、コードが適切に機能しているかどうか、つまり、Fortranとまったく同じ出力を生成しているかどうかを確認します。同じ入力が与えられたコード。それがなければ、あなたは失われます。
@ SK-logicには同意しません。C#コードでgotoを使用する必要はまったくありません。
(ただし、FortのコードをDotNetで動作させると、スパゲッティコードをC#に変換するのに時間を浪費する理由がなくなることを願っています。)
goto
、場合によってはコードを理解するのを非常に難しくする可能性があります(そして、そのような場合の最も重要な例はステートマシンです)。私はこの愚かなゴトーバッシング宗教に耐えられません-人々は、ゴトーが有害であると考えられる理由を理解しようとすることなく、同じ無意味なBSを繰り返し続けています。
あなたの仕事は難しいです。あなたは本当にFortranをよく知る必要があります。Fortranが計算をどのように類似/異なるものにするか、および切り捨てと丸めの規則がどのように適用されるかに注意する必要があります。また、C#およびFortranでのプリミティブ型の意味に注意する必要があります。
提案されているものからの別のアプローチ(必ずしもより良いものではなく、単に別のものです):
A-ビジネス知識と機能に基づいてC#でコードを書き直すことを検討し、Fortranコードを参照として使用する
B-変換ジョブを実行する商用ツールの使用を検討 -例:DataTek
ルーチンが標準機能または既製のdllを購入できる機能(数値統合など)を表す場合は、手動翻訳の代わりに標準機能または商用製品を使用して、問題を解決します。
上記で解決しない場合は、次の質問に答えてください。
コードを最適化する必要がありますか、それとも単に実行する必要がありますか。言い換えれば、コードを改善するために500時間を費やすことのビジネス価値は何ですか?
最適化に値がない場合は、コードを行ごとに翻訳して完了です。
それでもうまくいかない場合:
0-行ごとにFortranコードをC#に変換します(またはFortan CLRを使用します)
1-簡単なテストを実行して、実行されていることを確認します
2-リファクタリング(市販のツールが利用可能)を使用して、コードをより最適化された方法で記述できるようにします。
幸運を。
たくさんのgotoを使用してコードを再コーディングする簡単な方法は、フローチャートを描画し、文字列をまっすぐに引くことです。F77プログラムは、古いF66プログラムである場合もあれば、さらに悪いFIIプログラムである場合もあります。F66にはif-then-elseコンストラクトがないため、gotoが必要でした。必要なのは、if-thenを取得するために条件を反転することだけです。
F66にもdo-whileはありませんでしたが、F77にはあります。コーダーがF66からF77への変換(今日の多くがCからC ++へ、またはC ++からC#へ)であったかどうかは、F66のようなF77を使用しているかどうかによって異なります。コーディングでパターンを見つけることができれば、変換がはるかに簡単になります。
始める前に、既存のコードをテストするためのテストスイートを作成します。これは行動に光を当てるのに役立つので、非常に徹底してください。その後、このスイートを使用して、コンバージョンの有効性を評価できます。
それを超えて、整然として、急いで、機能を追跡するために大量の紙を使用しないでください。
コードをC#に実際に翻訳した方法を次に示します。.NETはgotoステートメントをサポートしているため、最初にFortranコード全体を取得して、新しいメソッドに貼り付けました。Fortranのルーチンやサブルーチンと同じ数のメソッドを貼り付けました。
コンパイラは、主に未宣言の変数と不正なブロックステートメントのフォーマットに関する100万のエラーを思い付きました。また、I / OステートメントなどのFortran固有のコードの一部を書き直す必要がありました。それが行われたとき、私は元のコードの正確なレプリカを持っていました。
Visual Studioの優れた書式設定により、論理ブロックは元のコードよりも簡単に識別できました。そして、gotoステートメントを1つずつ解き明かすことができました。
この経験から、同じコードを何度も書き直さなくても済むようにgotoステートメントが実際に非常に役立つ場合がありますが、多くの場合、メソッドを使用してそれらを繰り返し呼び出すことで同じことが実現できます。
また、無料版のSilverfrostを使用して元のコードをコンパイルし、再フォーマットされたコードを定期的にチェックして、再フォーマットでエラーが発生しないことを確認しました。
間違いなく最善の方法は、最初にFORTRANコードをより構造化された論理的な方法に書き換え/リファクタリングすることです。これにより、元のロジックをC#に移植する前に理解する必要があります。
アプローチ方法は次のとおりです。
Cと同じようにC#がgotosとラベルをサポートしているため、元のFORTRANと同じ混乱状態のgotoステートメントで終わる自動コードコンバーターで時間を無駄にしないでください。
他に失敗した場合は、C#でgotoステートメントを使用できます。
後藤の文は、ラベル付きステートメントに直接プログラム制御を転送します。
gotoの一般的な使用法は、switchステートメントの特定のswitch-caseラベルまたはデフォルトラベルに制御を移すことです。
後藤の文はまた、深くネストされたループから抜け出すために便利です...
古いFORTRANコードを新しい言語に変換するには、誰かがレガシーコードで基本的な手順を実行する必要があります(1)静的型チェックのためにコードを「IMPLICIT NONE」に変換します(2)すべての切り捨てられた共通を完全な共通に変換します(3)削除等価(4)FORTRAN 90のモジュールに共通の変換
その後、他の言語への変換を試みることができます。