32

科学計算のアプリケーションに Fortran と C++ のどちらを使用するかを決めようとしています。パフォーマンスに関して、Fortran が他の言語より優れているかどうかは、私にはわかりません。たとえば、Fortran では厳密なエイリアシングが強制されるため、C99 より前の C と比較すると、コンパイラによる最適化が改善される可能性があると思います。ここで C++ がどのように適合するかはわかりません。

ガイダンスはありますか?

4

10 に答える 10

53

私は最新のFortran標準のいくつかを見て、率直に言って感銘を受けました。20年前に私がこの言語について嫌っていたものの多くは、今ではなくなっています。行番号や特別な列はもうありません(地獄で燃えるかもしれません)。

Fortranは、50年間、エンジニアリング界で頻繁に使用されてきました。あなたがそれらのサークルで働くならば、それはあなたに2つの利点を与えます。まず、これらの人々は最適化に大きな関心を持っています。つまり、Fortranコンパイラーは最高のオプティマイザーを備えている傾向があります。言語自体は、エイリアシングがないため、Cish言語よりもはるかに最適化できます。

2番目の利点は、Fortranのライブラリによる数値計算のサポートに勝るものがないことです。最良のコードは、ほとんどの場合、記述する必要のない適切にデバッグされたコードになります

アプリケーションが一般的に科学、工学、または数値計算に該当しない場合は、上記のいずれも大したことではないため、他の場所を探す方がよい場合があります。

于 2011-01-27T21:25:15.363 に答える
26

もう 1 つの主要な問題は、C++ では非常に大きく、Fortran (90 以降) では非常に小さい学習曲線です。Fortran は MATLAB に似ており、...

  • B'DBはmatmul( matmul(transpose(B), D), B )
  • ベクトルの L2 ノルムはnorm2(x)
  • LAPACKを使用した行列のSVDはcall gesvd(A,S,u,vt)

Fortran には、ポインタ、動的メモリ、ユーザー定義のデータ型などもあります。

主要ベンダー (Intel/Sun/IBM/Cray/PGI/NAG など)、オープン ソース (gfortan/g95) コミュニティ、および PETSc、MPI などの数値ライブラリ/API の開発者によって十分にサポートされています。

新しい標準 (Fortran 2008) には、MPI/OpenMP を必要とせずに並列プログラミングを行うための共同配列があり、一部の Fortran コンパイラは既にそれをサポートしています (g95 および Cray)。

基本的に、数値計算に必要な優れた品質をすべて備えており、MATLAB よりも簡単で、標準化されており、無料で、スケーラブル (MPI/OpenMP および Co-Array を使用) であり、非常に高速な並列コードを生成します。

数値に関しては Fortran に勝るものはありませんが、残念なことに、それ以外の場合はすべて Fortan に勝ります。したがって、安全な仕事をしている科学者で、数値/HPC コンピューティングのみを行う場合は、Fortran を使用します。それ以外の場合は、数値以外のソフトウェアで広く使用されている C++ を学習して使用します。

于 2011-01-28T17:24:03.393 に答える
15

Fortran では、配列全体の操作と、配列のセクションに対する操作が可能です。配列用の C++ クラスはありますが、Fortran のように x(:,2:,1:N3:2) のようなスライスを簡単に参照できるとは思いません。これにより、いくつかのアルゴリズムをかなり簡潔に表現できます。

Fortran の配列操作の便利さは、派生型の配列にまで及びます。日付の配列があるとします。

type date
integer :: 月、日、
年末型 date

タイプ(日付) :: x(1000)

次に、x は日付の配列を参照し、x%month は月の配列を参照し、pack(x,x%month==1) は 1 月のすべての日付を参照します。この便利さを提供するプログラミング言語は他にいくつありますか?

Fortran に関する以前のコメントの一部 (「古くて気持ち悪い」) は偏ったものであり、それに応じて割り引かれるべきです。逆に反論させてください。私の意見では、Fortran 90 の自由形式は、中括弧とセミコロンを使用した C および C++ の構文よりも優れているように見えます。これらを省略したり、誤って挿入したりすると、C および C++ でエラーが発生する可能性がありますが、Fortran には対応するものはありません。

于 2011-02-07T17:57:29.590 に答える
12

Fortran は、数学 (特に行列) のような演算用に高度に最適化されています。

C++ は、オブジェクトの使用のために高度に最適化されています。

どちらがあなたにとってより重要です。

以下に示すように、C++ には最適化された行列ライブラリがあります。
しかし、Fortran の全体的な目的は、数学的プロセス (特に行列演算) の最適化です。これらの最適化が (ライブラリではなく) 言語の基盤に組み込まれており、C++ の研究で約 20 年間有利なスタートを切っているという事実は、この分野で Fortran が進んでいるとは思えません (しかし事実はわかりません)。勝つために。

于 2011-01-27T21:18:10.660 に答える
8

c++(2003) に対する fortran95 以降の利点:

  1. 以前に (user4562 が) 短い学習曲線について述べたように (私の最初の言語は C でしたが、まだ習得できていません。C++ についても同様です)。
  2. (私の個人的な意見) Octave からのコード移行は簡単です (Matlab については) 同様の構文、同じモジュール性 [Octave を使用してプログラムのプロトタイプを作成し、速度を上げるために fortran95 で書き直します]、ただし、C++ で Octave コードを直接使用できます。
  3. 動的メモリ割り当ては非常に単純です (f77 にはこれがまったくありませんでした!)。
  4. ライブラリのサポート (c++ でこれを行うこともできますが、fortran を使用するのが自然です)
  5. 並列計算のための Co-Array サポート (2011 年 2 月現在、cray だけがサポートしているのは残念ですが、gfortran の作業は gfortran4.6 から開始されましたが、まだ先は長いです)

要するに、あなたのプログラムまたはアプリケーションが純粋に科学計算である場合は、fortran 95 以降を使用し、いくつかの数値を計算することがストーリーの一部にすぎない場合は、C++ を使用します (または、あなたがより良いと感じるものは何でも)

于 2011-02-14T21:09:53.340 に答える
7

プログラミングは初めてです。約 1 年間、有限要素の分野でプログラミングを行っています。ネットで調べた結果、fortran 2003 を使うことにしました。Chapman の本を読んで、約 10 日間でモジュラー スタイルのプログラミングを学びました。それから 1 年が経ちましたが、約 4,000 行のコード行をモジュラー形式 (保守可能で再利用可能できちんとしたコード) で書きましたが、文字変数はまったく使用していません。C++、matlab、python、java などを 10 日間勉強しても、Fortran のように効率的な数値コードを書けるとは思えません。fortran 2003 には、私が現在学んでいる必要な OOP 機能もすべて含まれています。したがって、数値面での言語強度に関しては、fortan には何も欠けていません (モジュラー スタイル、OOP スタイル、強力な配列機能、強力なライブラリ、無料で商用の最新のコンパイラで、習得が非常に簡単で、非常に効率的です...)。python/numpy のような言語は、これらの機能のほとんどを備えていますが、効率に欠けています。C++ のような言語も fortran の機能のほとんどを備えています (ただし、数値計算の主要なコアである配列計算の場合は、いくつかのライブラリをインポートする必要があります!!) が、おそらく私のような誰かが fortran で作成したプログラムは、fortran よりも効率的です。 10年以上の経験を持つc ++プログラマによって書かれたもの。
最後に、fortran (モジュラーまたは OOP 形式) で大量の数値計算を行い、小さなサイズの計算 (プロットの作成、小さなサイズの配列の計算など) には python\numpy を使用します。

于 2012-08-28T15:58:33.537 に答える
6

Fortran に関する私の経験からすると、Fortran は簡単に習得でき、クリーン (高度にモジュール化されている) であるため、高度に最適化された数値計算を主な関心事とする非プログラマーに適しています。C++ でも同等の最適化を実行できますが (おそらく、より大きな範囲で)、それらのレベルの最適化を実現するには、多くの本質的な理解が必要です。行列の計算に関しては、通常、Fortran コンパイラはすぐに使用できる C++ コンパイラよりも優れたパフォーマンスを発揮します。また、Fortran には、プログラマーが数値ルーチンからより多くのパフォーマンスを引き出すのに役立つように特別に設計されたキーワードがあることも付け加えておきます。C++ にもこれがありますが、Fortran ほどではありません。

もう 1 つの利点は、Fortran がオペレーティング システムまたはアーキテクチャ固有ではないことです。つまり、あるオペレーティング システムまたはアーキテクチャで作成した Fortran コードは、Fortran コンパイラがある別のオペレーティング システムに簡単に移植できるはずです。

もう 1 つの利点は、最新の Fortran は通常、Fortran の古いコード ベースと下位互換性があることです。Fortran で何年にもわたって構築されてきたコード ベースは巨大で非常に洗練されています (主に科学者や数学者によって行われています)。

また、個人的には、データ ファイルを読み込んでほぼ瞬時に操作を実行できる、組み込みのファイル処理関数が非常に気に入りました。Fortran の他の多くの組み込み関数は、この便利さを実現するように設計されています。C++ は主にこれを行うためのビルディング ブロックを提供します。これには、データ ファイルを読み取るためだけに少し汗をかく必要があります。区切り文字について知っておく必要があります (Fortran では区切り文字を指定できます)。

これ以上のメリットは思いつきません。他のほとんどのものは、文字列操作、または言語としての c++ と一般的にはコンパイラーがより適しているアルゴリズムベースの操作であり、ほとんどの場合、パフォーマンスが向上します。十分な知識のあるプログラマーは、Fortran でコンパイルされたルーチンよりも優れたパフォーマンスを発揮する方法で数値ルーチンを最適化する方法を理解しているため、C++ を好む可能性があります。さらに、信頼できる優れた Fortran コンパイラは、信頼できる優れた C++ コンパイラほど簡単には入手できません。

于 2012-10-19T20:50:03.710 に答える
4

IMHO、本当に重要な唯一の利点は、FORTRANをプログラミングすることで、多くの既存のFORTRANコードとライブラリをより簡単に再利用できることです。また、プロジェクトに50人のFORTRANプログラマーがいて、時間枠が限られている場合、最初にすべてのC ++を教えるのですか、それとも彼らに好きな言語を使用させることを受け入れますか?

于 2011-01-27T21:23:21.160 に答える
3

すでに高度に最適化されている LAPACK++ のような科学計算パッケージの存在を考えると、最新の Fortran にはパフォーマンス上の利点さえありません。C++ には欠点があるかもしれませんが、パフォーマンスはその 1 つではありません。

于 2011-01-27T21:19:48.230 に答える
-1

テンプレート メタ プログラミング (特に式テンプレート)の出現により、C++ は数値計算で FORTRAN のリーグに到達したため、速度はもはや問題ではありません。ただし、その他の問題については、まだいくつかのことが言えます。

Pro FORTRAN : 年配の方は C++ よりもよく知っているかもしれません。
対照的な FORTRAN :プロジェクトを開始した瞬間に既に時代遅れになっている、うんざりするような、古くて、ほとんど放棄された言語です。現在プログラミングを学んでいる人が FORTRAN を学ぶ可能性は非常に低いため、後でプロジェクトのプログラマーを見つけるのに問題が発生する可能性があります。

Pro C++ : 比較的現代的であり、コンパイラは依然としてかなりの進歩を遂げています。非常に表現力豊かなコードを書くことができます。
Contra C++ : これらのテンプレート エラー メッセージのいくつかは、あなたを泣かせます。

于 2011-01-27T21:32:01.793 に答える