回答:
多くの場合、選択は(1)解決しようとしている問題、(2)持っているスキル、および(3)一緒に働く人々(ソロプロジェクトでない限り)に依存します。(3)は、個々の状況に依存するため、とりあえず残しておきます。
問題の依存関係:Fortranは配列処理に優れています。問題を単純なデータ構造と特定の配列の観点から説明できる場合、Fortranはうまく適応しています。Fortranプログラマーは、非自明な場合(たとえば、グラフの表現など)でも配列を使用することになります。C ++は、複雑で動的なデータ構造により適しています。
スキル依存:優れたFortranプログラムを書くよりも優れたC ++プログラムを書くには、はるかに多くのプログラミング経験が必要です。プログラミングの経験がほとんどなく、仕事のその側面を学習する時間があまりない場合は、C ++を学習するよりも、Fortranを学習する方が投資収益率が高くなる可能性があります。もちろん、あなたの問題がFortranに適していると仮定します。
ただし、プログラミングには、FortranとC ++だけではありません。Pythonなどの動的な高レベル言語から始めることを、計算科学に興味のある方にはお勧めします。あなたの時間はCPU時間よりも価値があることを常に覚えておいてください!
C ++とFortranの両方が十分であり、うまく機能すると思います。
ただし、Fortranは数値科学計算、配列を使用して表現できるアルゴリズム、および他の高度なデータ構造を必要としないため、有限差分/要素、PDEソルバー、電子構造計算などの分野で優れていると思います。Fortranはドメイン固有の言語です。特に、科学者(必ずしもコンピューター科学の専門家である必要はない)によって、C ++よりもFortranで高速プログラムを作成する方が簡単だと思います。
C ++は汎用言語なので、その中で任意のアルゴリズムを表現できます。配列を使用して表現できないアルゴリズムには、HPCフィールドから、おそらくいくつかのグラフ、メッシュジェネレーター、シンボリック操作などの方が間違いなく優れています。
C ++で配列アルゴリズムを書くことも可能ですが、私の経験では、より多くのコンピューターサイエンスの知識と一般に多くの作業が必要です(つまり、配列操作のためにクラスを作成または再利用し、メモリ管理を手動またはTrilinosのTeuchosのようなライブラリ)。非専門家はかなり良いFortranプログラムを書く傾向がありますが、恐ろしいC ++プログラム(私自身の経験から話しています)。
免責事項:私は個人的にFortranが大好きで、数値計算ではC ++よりもFortranを好みます。私は2年以上毎日C ++でプログラミングに費やし、ほぼ1年は現代のFortran(毎日、有限要素領域)でプログラミングしました。私もPythonとCythonをよく使います。
あと2セントも投げますが、このスレッドを見たばかりで、後世のために、必死にやらなければならない点がいくつかあると感じています。
以下では、C ++ではなくCについて説明します。どうして?さもなければ、本格的な動的型付けされたオブジェクト指向言語をFortranのような静的なものと比較するのはリンゴとオレンジです。はい、最新のFortran標準の一部の最新の実装はそれ以上のことを実行できますが、実際にそれらを使用する人は非常に少ないため、Fortranについて話すとき、単純で静的で命令型の言語だと思います。ここでCも使用されているため、次の点でCをC ++に置き換えます。
まず第一に、より優れたコンパイラーを持つFortran / Cの議論は議論の余地があります。専用のC / Fortranコンパイラーは過去のものです。gcc / gfortranとicc / ifcはどちらも、同じバックエンドに対する異なるフロントエンドです。つまり、プログラムはフロントエンドによって抽象記述に変換され、その後、バックエンドによって最適化およびアセンブルされます。意味的に、FortranまたはCで同じコードを記述すると、コンパイラーはどちらの場合も同じアセンブリを生成し、同じ速度で実行されます。
これは今、私の2番目のポイントにつながります:なぜまだ違いが見られるのですか?問題は、FortranプログラマーがCで何かを試したり、その逆を行ったりすることで、ほとんどの比較が行われることです。ほとんどの作家や詩人が母国語で書くことを好むことに気付いたことはありませんか?あなたは完全に自信がない、または家にいると感じない言語で詩を書きたいですか?もちろんそうではありません...私自身は、Cを私の「ネイティブ」プログラミング言語だと考えています。ただし、Fortranのみを使用したグループで3年間働き、ある程度の流さを達成しました。ただし、Cの方が使いやすいので、Fortranで自分で何かを書くことは決してありません。その結果、定義するコードはより良くなります。
主な違いは、言語ではなくプログラマーです。違いはありませんか?まあ、そうではありません。以下に例を示します。
SIMD:SSE、SSE3、またはAltiVecのいずれであっても、Fortranで使用したい場合は、コンパイラーが目的を正確に推測し、実行することを望みます。幸運を。Cでは、一般に各アーキテクチャの組み込み関数、または最近ではgccの一般的なSIMDベクトル型があります。ほとんどのFortranコンパイラはSIMD命令のみを使用してループを展開しますが、データの短いベクトルで非自明な方法で動作するカーネルを使用している場合、コンパイラはおそらくそれを認識しません。
異なるハードウェアアーキテクチャ:CUDAアーキテクチャ全体がCのカーネルを中心に構築されています。はい、ポートランドグループにはCUDA対応のFortranコンパイラもありますが、商用であり、最も重要なのはNVIDIA製ではありません。同じことがOpenCLにも当てはまります。OpenCLについては、いくつかの基本的な呼び出しのみをサポートする最近のプロジェクトが最高です。
並列プログラミング:はい、MPIとOpenMPの両方がCとFortranの両方で問題なく動作します。ただし、スレッドの実際の制御が必要な場合、つまり、完全に動的な共有メモリ計算がある場合は、Fortranを使用することになります。Cには、標準のpthreadがあります。これは、暖かくあいまいではありませんが、それでも嵐を乗り越えます。一般に、スレッド、プロセス、ファイルシステムなど、オペレーティングシステムへのアクセスに依存するほとんどの計算は、Cを使用したほうが適切です。Fortranで独自のネットワークを作成しようとしないでください。
使いやすさ:FortranはCよりもMatlabに近いです。さまざまなキーワードと変数の宣言方法をすべて理解すると、残りのコードはMatlabのようになり、プログラミングの経験が限られているユーザーにとってアクセスしやすくなります。
相互運用性:Cで構造体を作成すると、実際のデータのレイアウトは単純で決定的です。Fortranでは、ポインター配列または構造化データを使用する場合、データの実際のレイアウトはコンパイラーに強く依存しており、単純ではなく、通常は完全に文書化されていません。CをFortranから呼び出すこともできますが、Cを静的配列以外のものに渡したり戻したりするのは簡単だとは思わないでください。
これはややギークで低レベルなものですが、これは私たちが話している高性能コンピューティングですよね?基盤となるハードウェアパラダイムを最大限に活用する方法、つまり共有/分散メモリ、スレッド、SIMDベクトル化、SIMTを使用するGPUなどに最適なアルゴリズムを実装および/または開発する方法に興味がない場合は、コンピューターで計算するだけです。
これは私が書いたものよりもずっと長くなったので、ここに要約があります-ある種の持ち帰りメッセージのセットです:
科学ソフトウェアについての15年間の考えから:Fortranで記述したためにコードの実行が25%速くなったが、記述に4倍の時間がかかった場合(STLなし、複雑なデータ構造の実装の難しさなど)、Fortran 1日のかなりの部分を親指をいじり、計算が完了するのを待っている場合にのみ勝ちます。ほとんどすべての人にとって最も価値のあることは私たち自身の時間であるということを考えると、結論は次のとおりです。コードを開発、デバッグ、テストできる言語を使用します。 Fortranで作成しました。
私のアプローチは、通常はアセンブリで作成するのが最適な計算カーネル以外のすべてにC ++を使用することでした。これにより、従来のHPCアプローチのすべてのパフォーマンスが得られますが、たとえばSGEMM / DGEMM / CGEMM / ZGEMMなどの計算カーネルを単一のルーチンにオーバーロードするなどして、インターフェイスを簡素化できます。明らかに、生のポインタを避け、不透明なクラスに切り替えることで、抽象化レベルをはるかに高くすることができますが、それは素晴らしい最初のステップです。
C ++の最大の欠点は圧倒的にコンパイル時間の増加ですが、私の経験では、開発時間の節約はそれを補う以上のものです。もう1つの欠点は、ベンダーのC ++コンパイラーがベンダーのCおよびFortranコンパイラーよりも多くのバグを持つ傾向があることです。過去1年で、C ++コンパイラの10個近くのバグに遭遇したと思います。
以上のことから、低レベル言語(およびFortran)で作成された科学パッケージを取り消すことは、洗練されたデータ構造の便利なインターフェイスを公開することに抵抗があると思います。ほとんどの人は、Fortran BLASインターフェイスに満足しているだけです。ポインターと主要な次元を使用して行列を記述しますが、通常の40整数Fortranスパースダイレクトソルバーインターフェイスは便利に近いと主張する人はほとんどいません(UHM、SuperLU、PETSc、Trilinosを参照)。
要約すると、低レベルの計算カーネルにはアセンブリを使用しますが、特に重要なデータ構造を操作する場合は、他のすべてに高レベルの言語を使用することをお勧めします。
私はここに新しいので、私は古い質問を探していて、これを見つけました。古いものに答えることはタブーではないことを願っています!
他の誰もこれに言及していないので、私はそう思いました。Fortran 2003は、ほとんどの主要コンパイラ(intel、ibm、cray、NAG、PCG)でほぼ完全にサポートされており、最新のリリース4.7のgccもサポートしています。Fortran 2003(および2008)はオブジェクト指向言語ですが、C ++より少し冗長ですが。Fortranの良い点の1つは、標準委員会が科学コンピューティングを主な対象と見なしているという事実です(先日、これを指摘してくれたDamian Rousonに感謝します)。
これをすべて取り上げて、C ++プログラマーがFortranプログラマーになるのではなく、Fortranの人々が、C ++に切り替えるか、Fortran 90/95でオブジェクト指向の概念をエミュレートする以外に、より多くのオプションがあることを知っているようにします。
私が付け加える一つの注意点は、コンパイラーに実装されているものの最先端にいるためのコストがあるということです。現在Fortran 2003で主要なプロジェクトに着手している場合、バグに遭遇し、コンパイラを更新する必要があります(特にgccを使用している場合)。ただし、過去数か月で大幅に改善されました。
C ++の問題は、たとえばSTL、例外、クラス(仮想オーバーヘッドに加えてアライメントの問題)、オペレーターのオーバーロード(冗長な新規/削除)またはテンプレート(終わりのないコンパイルと不可解なエラー)良さそうに見えますが、この方法で何時間も無駄にすることができます。
ただし、一般的なライブラリへのアクセスが向上し、コードの可視性が向上する可能性が高くなります(ただし、これはフィールドに大きく依存しますが、純粋なCが残っています)。また、R、Lush、Matlab / Scilab、さらにPython、Ruby、Luaなどのスクリプト言語でコードをラップすることで、Fortranの柔軟性の欠如を補うことができます。
3つの事実:
CのF77スタイルのn次元配列:CnD(恥知らずなプラグイン)を使用しても問題ありません
F90のモジュールシステムは設計が不十分で、環境を構築するのに敵対的です。(モジュールの名前はそのファイル名と一致する必要はありません、例えば)
個人的な印象:
transfer()
、ここに来る)Fortranは配列/行列の計算用に最適化されており、あらゆる種類のテキスト解析で作業するのは大変な苦痛です。CおよびC ++は数値計算でFortranと一致しない場合があります(近い)が、C / C ++でテキストを処理し、データ(カスタムデータ構造)を整理する方がはるかに簡単です。
他の人が述べたように、動的なインタプリタ言語を数えないでください(Pythonなど)。Fortanの顔を溶かす速度を前もって提供することはできませんが、実装のすべての詳細よりも、計算の問題を解決することに集中することができます。多くの場合、ソリューションをPythonで実装できます。パフォーマンスが許容できない場合は、プロファイリングを行い、問題領域を特定し、Cythonを使用してそのコードを最適化するか、プログラム全体をコンパイル済み言語で再実装します。問題解決ロジックを具体化したら、残りは単なる実装であり、コンピューティングの基礎を十分に理解していれば、さまざまなプログラミング言語で簡単に表現できます。
私は現在、国立研究所のいずれかで働いています。私の周りの人々のほとんどは機械エンジニアです。HPCグループの何人かの人々とおしゃべりして、彼らはほとんどがLinuxで、ほとんどがC ++です。私が現在所属しているグループは、主にデスクトップアプリケーションを実行しており、C#、FORTRAN、Python、VBAおよびVB(.NETではなく6)の降順でWindowsを使用しています。使用するシミュレーションエンジンの一部は、FORTRANの他の国立研究所で作成されました。
古いスレッドを掘り下げてすみませんが、2015年でもFortranが多く使用されているようです。
私はちょうどこの(代替リンク)リストに出会いました。これは基本的に、2018年に研究者が利用できる300ペタFLOPSサミットマシンで実行するためにDOEのOCLF施設によって承認された13コードのリストです。コード(クイックGoogle検索に基づいて)のために、ここに私が見つけたものがあります:
XGC Fortran
SPECFEM Fortran
ACME Fortran (Bunch of climate codes)
DIRAC Fortran (Mostly)
FLASH Fortran
GTC Fortran
HACC C/C++
LS-DALTON Fortran (some C)
NAMD C/C++
NUCCOR Fortran
NWCHEM Fortran
QMCPACK C++
RAPTOR Fortran
したがって、13のコードのうち、少なくとも10(私のクイック検索に基づく)はFortranで書かれているようです。50歳の言語にとって悪くない。
注:言語比較は役に立たないことはよく知っていますが、Fortranの口数の少ない人(特にC ++ユーザー)を考えると、言及する価値があると思いました。
Jack P.が言おうとしていることは、あなたはミックスとマッチをすべきだということです。優れたソフトウェアは慎重に階層化されています。異なるレイヤーは、より自然に、または効率的に、異なる言語にマッピングできます。各レイヤーに最適な言語を選択する必要があります。また、言語がどのように相互運用できるかを理解する必要があります。これは、どのレイヤーでどの言語を選択するかに影響する可能性があります。
より良い質問は、優れた設計のソフトウェアの例があり、階層化されたソフトウェアの設計方法を学ぶために勉強する価値があるものです。