Fortran 77コードのC#への変換


14

Fortan77プログラムをC#に変換しようとしています。約650行のコードと恐ろしいGOTOステートメントを含むサブルーチンが至る所にあります。サブルーチンのフローを視覚化して、それが何をするのかを理解し始めることさえ、私は多くの問題を抱えています。

この種の経験があり、このサブルーチンの概要を取得する方法についてアドバイスしてくれる人はいますか?このタイプの変換を高速化または促進するために使用できるツールはありますか?


1
この質問はより開かれたものであり、アドバイスを求めているので、プログラマーSE

4
silverfrost.com/11/ftn95/ftn95_fortran_95_for_windows.aspxを使用して.NETにコンパイルし、アセンブリを参照することを検討しましたか?

@ショーン、それは素晴らしいアイデアですショーン。再プログラミングでどこにも行けない場合は、それを見ていきます。
user643192

2
私は...あなたに同情
マルコ

1
私はあなたの場所にいました。それは私のキャリアの最悪の日でした。
ユーザー

回答:


10

私の経験では、これを実行する良い方法は、Fortranコードのフローチャートを作成することです。GOTOステートメントのターゲットを別々のブロックに分離し、ダイアグラムを使用して、高レベルでコードを理解しようとします。

GOTOを論理的にループまたは関数呼び出しに置き換えることができるかどうかを確認してください。結果の図がツリー構造の形式である場合、GOTOに頼らずにC#に変換するのは比較的簡単です。ただし、最終的には、コードを十分に理解して、結果を自信を持って維持および使用できるようにする必要があります。


良い提案、ありがとう!GOTOステートメントは禁止する必要があります。
user643192

6
@ user643192 gotoは、賢明に適用すると非常に便利です。なしでは、効率的な大規模な状態オートマトンを実装することはできませんgoto。もちろん、生成されたコードでもそれらが必要になります。
SKロジック

3
Fortranコードからフローチャートを作成できるツールがあります。例:home.comcast.net/~lchen223621
NoChance

OP:遡及的に禁止することはできません。@EmmadKareem:非常に便利な提案。
クリス

私はここでダニエルBが提案したことを実行し、Fortranコードのブロックバージョンを作成しました。大いに役立ったので、ありがとう。SK-logicにとって、あなたはおそらくGOTOについて正しいでしょう。私のコメントは、私の最初の日の午後には、コードを見た後に行われた...そしてその中の型GOTOがたくさんあります。o(
user643192

12

ダニエルBが上に書いたことに加えて、私は次のように言うでしょう:

まず、Fort for DotNetで使用するFortranコードを入手します。「再プログラミングでどこにも行けない」場合ではなく、再プログラミングを試みる前です。小さな一歩ですが、正しい方向に向かっています。

次に、C#でテストスイートを記述します。テストスイートは、Fortranコードに入力したものを入力し、出力を保存します。テストスイートを1回実行し、出力を保存します。次に、テストスイートを拡張して、保存された出力に対して生成された出力をテストします。Fortranコードが同じ入力を与えられたときに常に同じ出力を生成すると仮定すると、テストはもちろん成功するはずです。

次に、C#でコードを書き換えている間、テストスイートでコードを実行し、コードが適切に機能しているかどうか、つまり、Fortranとまったく同じ出力を生成しているかどうかを確認します。同じ入力が与えられたコード。それがなければ、あなたは失われます。

@ SK-logicには同意しません。C#コードでgotoを使用する必要はまったくありません。

(ただし、FortのコードをDotNetで動作させると、スパゲッティコードをC#に変換するのに時間を浪費する理由がなくなることを願っています。)


1
説明する心、なぜ「あなたはすべきではない」?任意の合理的な引数は、ほかに「誰もが、それは悪であると考えていますか」? gotoを使用する必要ある非常に重要な2つのケースを挙げました。そうしないと、読み取り不能または非効率的なコード(あるいはその両方)を書くことになります。
SKロジック

@ SK-logic「あなたはするべきではない」と書いたのではなく、「するべきではない」と書いた。いずれにせよ、gotoステートメントを使用すると、ほとんどすべての状況下でコードの理解と検証が非常に難しくなります。もちろん、これらはさらに明確にされる可能性がありますが、それを行うことは控えましょう。これはこの議論の場所ではありません。同意しないことに同意します。
マイクナキス

2
政治家の不在はgoto、場合によってはコードを理解するのを非常に難しくする可能性があります(そして、そのような場合の最も重要な例はステートマシンです)。私はこの愚かなゴトーバッシング宗教に耐えられません-人々は、ゴトーが有害であると考えられる理由を理解しようとすることなく、同じ無意味なBSを繰り返し続けています。
SKロジック

あなたは彼らが最後の言葉を持っていなければ、ただ我慢できない人々の一人ですよね?C-:=
マイクナキス

1
@ ridecar2、私は常に良い状態のマシンを書いています。列挙型とswitchステートメントを使用し、コンパイラーに生成された機械語でGOTOを記述させます。GOTOで明示的に記述されたステートマシンの例を実際に見たことがありません。例へのポインタを投稿してもよろしいですか?
ジョンR.ストローム

3

あなたの仕事は難しいです。あなたは本当にFortranをよく知る必要があります。Fortranが計算をどのように類似/異なるものにするか、および切り捨てと丸めの規則がどのように適用されるかに注意する必要があります。また、C#およびFortranでのプリミティブ型の意味に注意する必要があります。

提案されているものからの別のアプローチ(必ずしもより良いものではなく、単に別のものです):

A-ビジネス知識と機能に基づいてC#でコードを書き直すことを検討し、Fortranコードを参照として使用する

B-変換ジョブを実行する商用ツールの使用を検討 -例:DataTek

ルーチンが標準機能または既製のdllを購入できる機能(数値統合など)を表す場合は、手動翻訳の代わりに標準機能または商用製品を使用して、問題を解決します。

上記で解決しない場合は、次の質問に答えてください。

コードを最適化する必要がありますか、それとも単に実行する必要がありますか。言い換えれば、コードを改善するために500時間を費やすことのビジネス価値は何ですか?

最適化に値がない場合は、コードを行ごとに翻訳して完了です。

それでもうまくいかない場合:

0-行ごとにFortranコードをC#に変換します(またはFortan CLRを使用します)

1-簡単なテストを実行して、実行されていることを確認します

2-リファクタリング(市販のツールが利用可能)を使用して、コードをより最適化された方法で記述できるようにします。

幸運を。


2

たくさんのgotoを使用してコードを再コーディングする簡単な方法は、フローチャートを描画し、文字列をまっすぐに引くことです。F77プログラムは、古いF66プログラムである場合もあれば、さらに悪いFIIプログラムである場合もあります。F66にはif-then-elseコンストラクトがないため、gotoが必要でした。必要なのは、if-thenを取得するために条件を反転することだけです。

F66にもdo-whileはありませんでしたが、F77にはあります。コーダーがF66からF77への変換(今日の多くがCからC ++へ、またはC ++からC#へ)であったかどうかは、F66のようなF77を使用しているかどうかによって異なります。コーディングでパターンを見つけることができれば、変換がはるかに簡単になります。


1

始める前に、既存のコードをテストするためのテストスイートを作成します。これは行動に光を当てるのに役立つので、非常に徹底してください。その後、このスイートを使用して、コンバージョンの有効性を評価できます。

それを超えて、整然として、急いで、機能を追跡するために大量の紙を使用しないでください。


1

コードをC#に実際に翻訳した方法を次に示します。.NETはgotoステートメントをサポートしているため、最初にFortranコード全体を取得して、新しいメソッドに貼り付けました。Fortranのルーチンやサブルーチンと同じ数のメソッドを貼り付けました。

コンパイラは、主に未宣言の変数と不正なブロックステートメントのフォーマットに関する100万のエラーを思い付きました。また、I / OステートメントなどのFortran固有のコードの一部を書き直す必要がありました。それが行われたとき、私は元のコードの正確なレプリカを持っていました。

Visual Studioの優れた書式設定により、論理ブロックは元のコードよりも簡単に識別できました。そして、gotoステートメントを1つずつ解き明かすことができました。

この経験から、同じコードを何度も書き直さなくても済むようにgotoステートメントが実際に非常に役立つ場合がありますが、多くの場合、メソッドを使用してそれらを繰り返し呼び出すことで同じことが実現できます。

また、無料版のSilverfrostを使用して元のコードをコンパイルし、再フォーマットされたコードを定期的にチェックして、再フォーマットでエラーが発生しないことを確認しました。


0

このようなコードを「逆コンパイル」する一般的な方法は次のとおりです。

  • 最初に低レベルの形式(LLVMなど)にコンパイルします
  • SSA変換を実行します(ローカル変数をクリーンアップするのに役立ちます)
  • 既約制御フローを分割します(ある場合)
  • ループとifを検出し、適切な高レベルの構造に置き換えます

LLVM独自のCバックエンドは、最初のドラフトを提供できます。


0

間違いなく最善の方法は、最初にFORTRANコードをより構造化された論理的な方法に書き換え/リファクタリングすることです。これにより、元のロジックをC#に移植する前に理解する必要があります。

アプローチ方法は次のとおりです。

  • 既存のコードを理解し、必要に応じてリファクタリングし、FORTRANで書き直して、動作することを簡単にテストできるようにします。
  • リファクタリングされたコードをC#に移植する

Cと同じようにC#がgotosとラベルをサポートしているため、元のFORTRANと同じ混乱状態のgotoステートメントで終わる自動コードコンバーターで時間を無駄にしないでください。


0

他に失敗した場合は、C#でgotoステートメントを使用できます。

後藤の文は、ラベル付きステートメントに直接プログラム制御を転送します。

gotoの一般的な使用法は、switchステートメントの特定のswitch-caseラベルまたはデフォルトラベルに制御を移すことです。

後藤の文はまた、深くネストされたループから抜け出すために便利です...


-2

古いFORTRANコードを新しい言語に変換するには、誰かがレガシーコードで基本的な手順を実行する必要があります(1)静的型チェックのためにコードを「IMPLICIT NONE」に変換します(2)すべての切り捨てられた共通を完全な共通に変換します(3)削除等価(4)FORTRAN 90のモジュールに共通の変換

その後、他の言語への変換を試みることができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.