Fortran 77 コードの大きな (私たちのコードは 550,000 行です) プログラムを C++ に変換した人はいますか? どのような落とし穴に遭遇しましたか? 変換は成功しましたか? for_c
( http://www.cobalt-blue.com/fc/fcmain.htm )のようなツールを使用しましたか? 結果の C++ コードは大幅に高速化されましたか、それとも低速化されましたか?
6 に答える
これは、EvilTeach のアドバイスに追加されます。Fortran 77 と C/C++ コードをリンクするのは非常に簡単であるため、アプリケーションの一部を段階的に変換し、それらを古い部分と一緒にリンクできます。これを行う場合、すべての通常の fortran/c の不一致 (行/列優先の配列、配列のインデックス付けなど) について考える必要がありますが、自動翻訳されたコードベース全体を一度にデバッグする手間を省くことができます。 .
国立 (DOE) 研究所には、このような大規模なハイブリッド コードが多数あり、古い Fortran コードに多大な投資が行われています。このルートに進む場合は、同じアプリ内の C、C++、Fortran、Fortran90、Python、および Java の間でコンポーネントを共有できるように開発されたBabelの使用を検討してください。ラボでのこれの動機は、さまざまなチームが作成した物理モデルを結び付けて非常に大規模なシミュレーションを行うことですが、コードの移行にも役立つ場合があります。多くのプロジェクトで積極的に維持され、使用されていますが、あなたがやろうとしていることには少し複雑すぎるかもしれません.
考慮すべきことがたくさんあります。
取るべき道は、実は二つあります。1 つは、c への行ごとの直接変換を行うことです。つまり、すべての fortran ステートメントから同等の c ステートメントを意味します。
もう 1 つの方法は書き直しです。500k loc+ の場合は、はるかに多くの作業が必要になります。そのようなサイズでは、f2c のような翻訳を行うためのツールを探すことは間違いありません。
ストレートポートの問題...
goto を直接変換するには、goto ターゲットのラベルを作成する必要があります。
label10:;
goto label10;
配列の添え字は潜在的な問題です。c は 0 から始まり、fortran は 1 から始まるため、配列は fortran コードで 1 つ大きくする必要があります。
real*4 a(10,20)は
#define XMAX 10 + 1
#define YMAX 20 + 1
float a[XMAX][YMAX];
ループをこのように記述できるようにします。
for (x = 1; x <= XMAX; x++)
for (y = 1; y <= YMAX; y++)
a[x][y] = 0.0f;
c の配列アクセスは行優先ですが、fortran は列優先です。これはパフォーマンスの問題になる可能性があります。それが問題になる場合は、順序または配列の添字を逆にする何らかのマクロ定義で解決できる場合があります。実際、マクロで各添字から 1 を減算して、1 から始まる配列のように見せ、実際には 0 から始まる配列にマップすることもできます。
実数*8 a(XMAX,YMAX) a(4,2) = 3.14
#define A(X,Y) a[Y][X]
double a[XMAX][YMAX];
A(4,2) = 3.14;
fortran ユニット io は stdio タイプのファイルでシミュレートできます。ユニット 19 を使用している場合は、
FILE *fp19 = fopen("file","mode");
ファイルで fortran キャリッジ コントロールを使用している場合、キャリッジ コントロールに問題がある可能性があります。ユニット 5 と 6 は、標準入力で簡単に参照でき、fopen なしで標準出力を参照できます。
printf ファミリの関数を使用すると、多くの形式を処理できます。Fortran 配列 io の一部を処理するために、追加のループを追加する必要がある場合があります。
WRITE(6, 200) (PROJ(z,4),z = 1, 20)
int z;
for (z = 1, z <= 20; z++)
printf("%lf ", proj[z][4]);
o f2c を使用するのがおそらく最速の方法です。次に、そのrtlで立ち往生しています。
o 直接ポートを実行することは実行可能なことです。時間がかかりますが、実行
可能です o 長期的に維持したい場合は、書き直すことをお勧めします。非常に時間がかかり、おそらくより高速ですが、長期的には保守性が高くなります
幸いなことに、開発作業に役立つ一連の単体テストを作成するためのベースラインとして使用する元のプログラムがあります。
私の反応は、なぜあなたはそれを変換したいのですか.
大規模な Fortran コード ベースを使用して製品を開発する方法の問題は、1990 年代に多くの企業で検討されました。つまり、変換するか、Fortran を使用するか、ハイブリッドを作成するかです。大多数がハイブリッド アプローチを選択したと思います。通常は、ユーザー インターフェイスに C++ を使用し、バックグラウンドで元の Fortran コード ベースを使用します。
私の提案は、 http: //arnholm.org/software/cppf77/cppf77.htm で入手可能な Carsten Arnholm による「C++ と FORTRAN 77 を使用した混合言語プログラミング」を参照することです。インターネットの初期の頃、このドキュメントはよくリンクされていました。
このドキュメントでは、C++ と Fortran を含むアプリケーションを作成する方法について説明します。技術的な詳細の一部が古くなっている可能性があるかどうかはわかりませんが、このドキュメントは、開発に C++ を使用したいが巨大な Fortran コード ベースを持っていたプロジェクトから生まれました。
Barton と Nackman による "Scientific and Engineering C++: An Introduction with Advanced Techniques and Examples" も良い書店で入手できます。この本は、Fortran プログラマー向けに C++ を教えています。C++ から Fortran コードへのラッパーを記述する例がいくつかあります。Fortran の側面を無視した優れた C++ の本です。基準が設定される前に書かれましたが、違いはそれほど大きくありません。
私はかつてこれを使用しました:http://manpages.ubuntu.com/manpages/hardy/man1/f2c.html小さなFortranプログラムをCに変換する.変換は成功しました. コードは、速度の変化を検出するほど複雑ではありませんでした。
あなたのプログラムはより大きく割り当てられているので、私と同じようにすべてが実行されるかどうかはわかりません。
Promulaを調べてみてください。他の多くの自動トランスレーターよりも読みやすい C コードを生成します。私は Promula を直接使用したことはありませんが、かなりの量の Promula 出力を C から C++ に変換しました。C コードを正規の C++ にクリーンアップするのは簡単ですが、もちろん、本当に優れた C++ にするためにはより多くの労力が必要です。
私は、for_cを使用して FORTRAN から変換されたコードを中心としたアプリケーションに取り組んできました。それが作成したコードはひどいものでした。ほとんどが解読不能だったので、維持するのは非常に困難でした。幸いなことに、そのコードは非常に安定しており、何かを行う必要があることはめったにありませんでした。
ただし、これは何年も前に行われたもので、Windows の 16 ビット初期の頃です。多分 for_c は今より良いですか?