web-dev-qa-db-ja.com

現代のFortranは現代のC ++に比べてどのような利点がありますか?

私は科学計算のアプリケーションのためにFortranとC++の間で決定しようとしています。パフォーマンスに関しては、Fortranが他の言語よりも優れているかどうかははっきりしません。たとえば、Fortranは厳密なエイリアシングを実施するので、C99より前のCと比較して、コンパイラーにより良い最適化を行うことができると思います。ここでC++がどのように適合するかはわかりません。

何かアドバイスは?

30
royco

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

Fortranは、50年に渡ってエンジニアリング業界で頻繁に使用されています。これらのサークルで作業する場合、2つの利点があります。まず、これらの人々は最適化についてたくさん気にしています。つまり、Fortranコンパイラーは、最高のオプティマイザーを使用する傾向があります。言語自体は、エイリアシングがないため、Cish言語よりもはるかに最適化可能です。

2番目の利点は、数値演算に対するFortranのライブラリサポートに勝るものはありません。最良のコードは、ほとんどの場合、書く必要のないよくデバッグされたコードです

アプリケーションが一般的に科学的、工学的、または数値計算に該当しない場合は、上記のどちらも大きな問題にはならないので、他の場所を探す方がよいでしょう。

46
T.E.D.

もう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を必要とせずに並列プログラミングを行うためのCo-Arrayがあり、一部のFortranコンパイラーはすでにそれをサポートしています(g95およびCray)。

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

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

22
user4562

Fortranでは、配列全体の操作と配列セクションの操作も可能です。配列にはC++クラスがありますが、x(:、2:、1:N3:2)などのスライスをFortranほど簡単に参照できないと思います。これにより、一部のアルゴリズムを簡潔に表現できます。

Fortranの配列操作の利便性は、派生型の配列にも拡張されます。日付の配列があるとします。

タイプ日付
整数::月、日、年
終了タイプ日付

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

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

Fortranに関する以前のコメントの一部-「古くて嫌」-は偏っており、それに応じて割り引く必要があります。私は反対を議論させてください。私の意見では、Fortran 90のフリーフォーマットは、中括弧とセミコロンを使用して、CおよびC++の構文よりもよく見えます。それらを省略したり、誤って配置したりすると、CおよびC++でエラーが発生し、Fortranには対応しないエラーが発生する可能性があります。

14
Fortranner

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

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

それはあなたにとってより重要です。

以下に示すように、C++には最適化されたマトリックスライブラリがあります。
しかし、Fortranの全体的な目的は、数学的プロセス(特に行列演算)の最適化です。これらの最適化は(ライブラリーではなく)言語の基礎に組み込まれており、C++に関する研究を20年ほど前から始めているという事実は、この領域ではFortranが進んでいることを疑っています(しかし、事実はわかりません)。勝つために。

12
Martin York

Fortran95以降のC++(2003)に対する利点:

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

要するに、プログラムまたはアプリケーションが純粋に科学的な計算である場合は、fortran 95以上を使用し、数の計算がストーリーの一部にすぎない場合は、C++を使用します(またはuの方が良いと感じます)。

8
fedvasu

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

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

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

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

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

6
user922475

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

5
user1591744

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

4
Doc Brown

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

2