私の計算科学博士課程プログラムでは、ほぼ独占的にC ++とFortranで作業しています。一部の教授はどちらか一方を好むようです。特定の状況でどちらが「優れている」のか、または一方が他方よりも優れているのか疑問に思っています。
コメント
- 高値の組み合わせ私の意見では、低水準言語はどちらかを排他的に使用するよりも優れています。例えば。私はPython + C ++を使用しています。
- この質問への回答はほぼ純粋に主観的なものであるため、’この質問が適切かどうかわかりません。
回答
よくあることですが、選択は(1)解決しようとしている問題、(2)あなたが持っているスキル、および(3)一緒に働く人々(それが「ソロプロジェクト」でない限り)。それはすべての人の個々の状況に依存するので、私は(3)をとりあえず脇に置きます。
問題の依存性:Fortranは配列処理に優れています。問題を単純なデータ構造、特に配列の観点から説明できる場合、Fortranは適切に適合されます。Fortranプログラマーは、自明でない場合(グラフの表現など)でも配列を使用することになります。 C ++は、複雑で非常に動的なデータ構造に適しています。
スキル依存:優れたFortranプログラムを作成するよりも、優れたC ++プログラムを作成する方がはるかに多くのプログラミング経験が必要です。経験があり、仕事のその側面を学ぶ時間があまりないので、C ++を学ぶよりもFortranを学ぶ方が投資収益率が高くなるでしょう。もちろん、あなたの問題がFortranに適していると仮定します。
ただし、プログラミングには、FortranとC ++だけではありません。計算科学に入る人にはダイナミックハイから始めることをお勧めします。 Pythonなどのレベル言語。あなたの時間はCPU時間よりも価値があることを常に忘れないでください!
コメント
- “常にそれを覚えておいてくださいあなたの時間はCPU時間よりも価値があります!” HPCで働く人として、私はその部分に同意しません。他のすべては適切です。
- “時間はCPU時間よりも価値があることを常に忘れないでください!” As科学研究に携わっている人は、’その部分にこれ以上同意できませんでした。
- “常に覚えておいてくださいあなたの時間はCPU時間よりも価値があります!”-私は’それぞれ数百のノードを使用して2セントを投入したいと思いますいくつかのプログラムを数週間実行するための10以上のコアがある場合、さらに数週間で数日で実行されるコードが生成される可能性がある場合、最も貴重なリソースの恐ろしい浪費と解釈できます。これらのHPCクラスターは、まれで高価な共通リソースです。
- “時間はCPU時間よりも価値があることを常に忘れないでください!”、1週間のコードですが、1か月間実行されます。これは、ごく普通のサーです!
- “常にCPU時間よりも時間の方が価値があることを忘れないでください!”、1か月間コーディングして、1週間で実行したいと思います。 -コードを記述すれば、さらに多くのことができ、他の人はあなたが書いたコードの方が便利だと感じるでしょう。
回答
C ++とFortranの両方で十分であり、うまく機能すると思います。
ただし、Fortranは、数値の科学計算、を使用して表現できるアルゴリズムに適していると思います。配列であり、他の高度なデータ構造を必要としないため、有限の差異/要素、PDEソルバー、電子構造計算などの分野で。Fortranはドメイン固有の言語です。特に、高速を書く方が簡単だと思います。 em> C ++よりもFortranのプログラム、科学者(必ずしもコンピュータサイエンスの専門家である必要はありません)。
C ++は汎用言語であるため、任意のアルゴリズムを表現でき、間違いなく優れています。配列を使用して表現できないアルゴリズムの場合、HPCフィールドから、おそらくいくつかのグラフ、メッシュジェネレーター、シンボリック操作など。
arraを記述することも可能です。 yアルゴリズムはC ++ですが、私の経験では、コンピュータサイエンスの知識がはるかに多く、一般的にはより多くの作業が必要です(つまり、配列操作用のクラスを作成または再利用し、手動で、またはTrilinosのTeuchosなどのライブラリを使用してメモリ管理を処理する必要があります。専門家ではない人はかなり良いFortranプログラムを書く傾向がありますが、恐ろしいC ++プログラム(私自身の経験から話しています)。
免責事項:私は個人的にFortranが大好きで、数値計算ではC ++よりも好きです。私は毎日2年以上C ++でプログラミングを行い、ほぼ1年を現代のFortranで毎日プログラミングしています(有限要素領域で)。私はPythonとCythonもよく使用しています。
コメント
- 最初の答えのバランスをとるために1つ。現代のHPCの可能性は、C ++とFortranだけではないと思います。 Fortran、C ++、Python(または好きなもの)を選ぶときは、長所と短所を知っておくとよいと思います。私は、1つのファイルに20.000行のFortranがあり、数十年にわたって有機的に成長しているのを見てきました。私は個人的に、孤立したヘビーアレイコンピューティング以外には使用しません。出力に関連するものでもありません。これまでのところ、偏ったコメントがあります。
- ‘この回答にこれ以上同意できませんでした。私たちの有限要素コードは、Fortranで書くことはできなかったでしょう。実際、それは15年前にプレーンCとFortranの混合として始まり(後者はメソッドの数値集約的な部分のためのものです)、数年の間に徐々に純粋なCに移行し、次にC ++に移行しました。コードは一貫して短く、速く、理解しやすくなり、反復するたびに機能が向上しました。私は、C ++があなたに自分自身を撃つためのたくさんのロープを与えると指摘する他の人たちに同意します。 ‘最も使いやすい言語を選択してください。
- 請求書、最新のFortran(90以降の追加)を使用しましたか?これは非常に重要です(これについての私の答えではもっと明確にすべきでした)。もちろん、” 20.000行のFortran “、またはf77は通常、適切に記述されたC ++よりも優れていません。
- @OndřejČertí k:現代の有限要素プログラムが”単純な”データ構造の場合、最近’それらのいずれも調べていません。単純なデータ構造を使用して、非構造化メッシュに適応有限要素、hpメソッド、またはマルチグリッドを実装してみてください。ビルは的を射ているので、”最新のFortran “を使用すれば、小さなこと以上のことはできなかったと言って、彼のことを話すことができると思います。違い。
- @WolfgangBangerth、たとえばPhaml( math.nist.gov/phaml )を参照して、ほとんどすべてのFortran実装を確認してください。
回答
私も2セントを遅らせていますが、私は」このスレッドを見たばかりで、後世のために、必死に作成する必要のあるいくつかのポイントがあると感じています。
以下では、C ++ではなくCについて説明します。どうして?そうでなければ、本格的な動的に型付けされたオブジェクト指向言語をFortranのような静的なものと比較するのはリンゴとオレンジです。はい、最新のFortran標準のいくつかの最新の実装はそれ以上のことを行うことができますが、実際にはごく少数の人々がそれらを使用するので、Fortranについて話すとき、単純で静的で命令型の言語だと思います。Cもそうなので、次のようにCをC ++に置き換えます。
最初に結局のところ、Fortran / Cの優れたコンパイラーに関する議論は議論の余地があります。専用のC / Fortranコンパイラーは過去のものです。gcc/ gfortranとicc / ifcはどちらも、同じバックエンド、つまりプログラムのフロントエンドが異なるだけです。フロントエンドによって抽象的な記述に変換され、バックエンドによって最適化およびアセンブルされます。意味的に、FortranまたはCで同じコードを記述する場合、コンパイラーはどちらの場合も同じアセンブリーを生成します。これは同じくらい速く実行されます。
これは私の2番目のポイントにつながります:なぜまだdiffが表示されるのですか? erences?問題は、ほとんどの比較がFortranプログラマーがCで何かを試したり、その逆を行ったりすることによって行われることです。ほとんどの作家や詩人が母国語で書くことを好むことに気づいたことがありますか?完全に自信がない、または家にいるような言語で詩を書きたいですか?もちろんそうではありません…私自身、Cを私の「ネイティブ」プログラミング言語だと考えています。しかし、私も3年間過ごしました。ある程度の流暢さを達成したFortranのみを使用するグループで作業します。ただし、Cに慣れているため、Fortranで自分で何かを書くことは決してありません。その結果、結果のコードは
したがって、主な違いは言語ではなくプログラマーにあります。それで違いはありませんか?まあ、完全ではありません。次にいくつかの例を示します。
-
SIMD:SSE、SSE3、AltiVecのいずれであっても、Fortranで使用する場合は、コンパイラが推測することを期待して祈ってください。正確に必要なものを実行します。幸運を祈ります。Cでは、通常、アーキテクチャごとに組み込み関数を使用するか、最近では一般的な SIMDベクトルタイプを使用します。 gccで。ほとんどのFortranコンパイラーはSIMD命令のみを使用してループを展開しますが、データの短いベクトルを非自明な方法で処理するカーネルがある場合、コンパイラーはおそらくそれを認識しません。
-
さまざまなハードウェアアーキテクチャ:CUDAアーキテクチャ全体がCのカーネルを中心に構築されています。はい、ポートランドグループには現在 CUDAがあります。 -対応するFortranコンパイラもありますが、これは商用であり、最も重要なこととして、NVIDIA製ではありません。 OpenCLについても同じことが言えます。私が見つけた最高のものは、いくつかの基本的な呼び出しのみをサポートする最近のプロジェクトです。
-
並列プログラミング:はい、MPIとOpenMPはどちらもCとFortranの両方で問題なく動作します。ただし、スレッドを実際に制御したい場合、つまり完全に動的な共有メモリ計算を使用している場合は、Fortranを使用する必要があります。Cでは、標準のpthreadがあり、ウォームでファジーではありませんが、一般に、スレッド、プロセス、ファイルシステムなど、オペレーティングシステムへのアクセスに依存するほとんどの計算は、Cでより適切に処理されます。ああ、自分でやろうとしないでください。 Fortranとのネットワーキング。
-
使いやすさ:FortranはCよりもMatlabに近いです。さまざまなキーワードと変数の宣言方法をすべて理解すると、残りのコードはMatlabのようになり、プログラミングの経験が限られているユーザーがアクセスしやすくなります。
-
相互運用性:Cで構造体を作成する場合、実際のデータのレイアウトは単純明快で決定論的です。Fortranでは、ポインター配列または構造化データを使用する場合、データの実際のレイアウトはコンパイラーに強く依存します。フォワードであり、通常は完全に文書化されていません。FortranからCを呼び出すことも、その逆も可能ですが、静的配列以外のものを一方から他方に受け渡しするのが簡単であると考え始めないでください。
これはすべてややこっけいな低レベルのものですが、これは私たちが話している高性能コンピューティングですよね?基盤となるハードウェアを最大限に活用する方法に興味がない場合パラダイム、すなわち、共有/分散メモリ、スレッド、SIMDベクトル化に最適なアルゴリズムの実装および/または開発、SIMTを使用するGPUなど、「コンピュータで数学を実行しているだけです。
これは私が意図したものよりもはるかに長くなっているので、ここに要約-一連の持ち帰りある種のメッセージ:
- あなたが最もよく知っている言語で できる最高のコードを書くでしょう。
- 同じバックエンドを使用する2つのコンパイラによって生成されるコードの品質に違いはありません。ある言語または別の言語で不正なコードを作成するのは私たちです。
- より低レベルに感じますが、Fortranは非常に高レベルの抽象化であり、特定のハードウェア/ OS機能に直接アクセスすることはできません。 SIMD、スレッド、ネットワーキングなど…
コメント
- 良好な応答。 ‘とは思いませんが、最終的なコメントは必ずしも真実ではありません。私自身’はCプログラマーですが、優れたプログラミング手法を通じて、Fortranの低レベルのものにアクセスできます。 SIMD opsのようなものを利用する理想的な方法は、それを強く示唆するコードを記述し(たとえば、ループをブロックする)、コンパイラーにそれを行わせることです。スレッド化には、openMPを使用するだけです(pthreadsは追加の作業で使用することもできます)。 Fortranには、あなたが言及しているすべてのものがあります’ t、その典型的なユーザーにとって重要なレベルである数値です。
- @ Reid.Atcheson:そうですね。 、コンパイラがそれをキャッチするようにすべてをブロックアウトすると、CとFortranの両方で自動的に機能します。しかし、問題は、コンパイラをどこまで信頼したいかということです。そして、あなたが何をしたいのかを正確に知っている場合に、なぜそれを信頼しなければならないのですか? OpenMPはスレッド化を行いますが、ブロック単位です。さまざまなスレッドプールを使ってさまざまなことを実行するように仕向けることができますが、それはOpenMPの誤用にすぎません。 FortranのPthreadは、C関数の単なるラッパーです。ただし、’詳細に詳しくない方がFortranの方が簡単であることに同意します。
- 確かに’コンパイラーに依存して本格的な99%のピーク効率を得るつもりはありませんが、簡単にかなり近づくことができます。これを超えると、組み込み関数またはインラインASMを使用する必要があります。プログラマー全体の効率を上げるには、どこかで譲歩する必要があります。それが、プログラミング言語がそもそも存在する理由です。’あなたが実際に組み込み関数やASMの詳細に入るのに十分狂っている段階では(私は数回行ったことがあります)、Fortranは松葉杖ではありません’。 ‘とにかく、組み立てられた手作業で最適化されたコードをリンクする方法を知っています。
- @ Reid.Atcheson:そうですね、’ dは、並列HPCアプリケーションの場合、99%のピーク効率をはるかに下回る可能性があると主張しています…そしてgccベクトルタイプにより、組み込み関数の使用は問題になりません:)
- @Pedro、素晴らしい投稿。絶対に素晴らしい。投稿ありがとうございます。興味深いスレッドをランダムに調べているときに見つけました。
回答
科学ソフトウェアについての15年間の考えから:Fortranで記述しているため、コードの実行速度が25%速くても、記述に4倍の時間がかかる場合(STLがない、複雑なデータ構造の実装が難しいなど)、Fortranが勝つのは、親指をいじり、計算が終了するのを待っている1日。私たちのほとんどすべてにとって最も価値のあることは私たち自身の時間であることを考えると、結論は次のとおりです。コードの開発、デバッグ、テストを最速で行うことができる言語を使用します。あなたはそれをFortranで書いた。
答え
私のアプローチは、計算カーネル以外のすべてにC ++を使用することでした。アセンブリで書かれました。これにより、従来のHPCアプローチのすべてのパフォーマンスが得られますが、たとえば、SGEMM / DGEMM / CGEMM / ZGEMMなどの計算カーネルを単一のルーチン(Gemmなど)にオーバーロードすることで、インターフェイスを簡素化できます。明らかに、生のポインタを避けて不透明なクラスに切り替えることで、抽象化レベルをはるかに高くすることができますが、これは良い最初のステップです。
C ++の最大の欠点は、コンパイル時間の増加です。しかし、私の経験では、開発時間の節約はそれを補う以上のものです。もう1つの欠点は、ベンダーC ++コンパイラーは、ベンダーCおよびFortranコンパイラーよりも多くのバグを抱えている傾向があることです。昨年、C ++コンパイラで10個近くのバグに遭遇したと思います。
そうは言っても、低レベル言語(およびFortran)で記述された科学パッケージを元に戻すことは洗練されたデータ構造のための便利なインターフェースを公開することに消極的:行列を記述するためにポインターと先行次元のみを必要とするため、ほとんどの人はFortran BLASインターフェースに満足していますが、通常の40整数Fortranスパースダイレクトソルバーインターフェースを主張する人はほとんどいません。便利に近いものです(UHM、SuperLU、PETSc、およびTrilinosを参照)。
要約すると、低レベルの計算カーネルにはアセンブリを使用することを主張しますが、特に重要なデータ構造を操作する場合は、他のすべてに高水準言語を使用します。
これに注意してください。投稿の結果、カーネルでのCとFortranのパフォーマンスの比較$ y:= \ alpha x + y $ 。
コメント
- 小さなカーネルをコンパイルするために適切な最適化が有効になっている標準のCコンパイラを信頼しないのはなぜですか。’そのレベルのコードサイズと複雑さでは、コンパイラーがコードから引き出すことができるものの違いは明確ではありません。
- 適切な使用制限があっても、Fortranは次のようになっていると私に言った何人かの人々と話をしました。明示的な行列転置などの操作では、Cおよび/またはC ++コードよりもさらに高速です。 ‘ CまたはC ++コードを高速化することは不可能だと言っているわけではありませんが、Fortranコンパイラーはそうする傾向があります。より良い仕事です。
- ” limit “キーワードでも同じ経験があります(私の単純なFortranコードは常に少し速く)。しかし、私の専門知識は限られており、’はgccから生成されたアセンブリを理解するために投資する時間がありません。だから私は単にFortranを使っています。それは’シンプルで、’高速です。
- @JackPoulson:コンパイラ議論は私がFortranコミュニティからかなり聞いているものです。残念ながら、ほとんどのコンパイラ、たとえばgccまたはifc / iccは、同じバックエンドに異なる言語のフロントエンドを使用します。最適化とコード生成を行う機構は同一であるため、結果の違いは、おそらくプログラマーが基礎となる言語に精通していることの違いによるものです…
- 少しだけ展望を与えるために数値カーネルではFortranの方が速いという、頻繁に繰り返され、ほとんど検証されていない主張について:しばらく前に、Trilinos ‘ Epetraパッケージのスパース行列-ベクトル乗算が30%遅いことに気付きました。取引中のものよりII。前者は単純なFortran77で記述され、後者は’ strict ‘を使用せずに単純なCで記述されています。どちらにも約10〜15行のコードがありました。今日、Trilinosはdeal.IIから引き上げられたコードを使用しています。 ‘ F77がCよりも速いケースをたくさん見つけることができると確信しています。要点は’普遍的ではないということです。今日。
回答
私はここで新しいので、古い質問を調べていて、これを見つけました。うまくいけば、古いものに答えるのはタブーではありません!
他の誰もこれについて言及していないので、私がそうするだろうと考えました。 Fortran 2003は、ほとんどの主要なコンパイラー(intel、ibm、cray、NAG、PCG)でほぼ完全にサポートされており、gccでも(間もなく)最新リリース4.7。 Fortran 2003(および2008)は、C ++よりも少し冗長ですが、オブジェクト指向言語です。私がFortranについて良いと思うことの1つは、標準委員会が「科学的コンピューティング」を主要な聴衆と見なしているという事実です(先日、これを指摘してくれたDamian Rousonに感謝します)。
私はこれをすべて取り上げて、C ++プログラマーがFortranプログラマーになるのではなく、C ++に切り替えたり、Fortran 90/95でオブジェクト指向の概念をエミュレートしたりする以外に、Fortranの人々にもっと多くのオプションがあることを知ってもらいます。
One私が付け加える警告は、コンパイラーに実装されているものの最先端にいることにはコストがかかるということです。今Fortran 2003で主要なプロジェクトに着手すると、バグに遭遇し、コンパイラーを継続的に更新する必要があります(特にgccを使用する場合)、ただし、これは過去数か月で大幅に改善されました!
回答
C ++の問題は次のとおりです。たとえば、STL、例外、クラス(仮想オーバーヘッドとアラインメント)を盲目的に使用することによって、パフォーマンスを台無しにする可能性が多数あることent問題)、演算子のオーバーロード(冗長な新規/削除)またはテンプレート(終わりのないコンパイルと不可解なエラーは無害に見えますが、この方法で時間を無駄にする可能性があります)。
ただし、一般的なライブラリへのアクセスが向上し、コードの可視性が向上する可能性があります(ただし、これはフィールドに大きく依存し、純粋なCを使用できます)。また、R、Lush、Matlab / Scilab、さらにはPython、Ruby、Luaなどのスクリプト言語でコードをラップすることで、Fortranの柔軟性の欠如を補うことができます。
コメント
- 一般に、低レベルの手法を高レベルの言語に適用することはお勧めできません。たとえば、STLは非常に抽象的なレベルで動作するように設計されています。インターフェイスが何であるかを知っておく必要があります。はのために設計されており、このタスクに使用してから、コンパイラーの邪魔にならないようにします。
- mbq ‘とMartin ポイントは不公平です。はい、std :: list < double >。しかし、その’はばかげた議論です:少なくともC ++にはあなたがリンクしたリストクラスがあります使用できますが、Fortranは’ではありません。’は”車は非常に高速で運転しているため、壁にぶつかって怪我をする可能性があります。代わりに馬車を使用する必要があります。”低水準言語もサポートする高水準言語を破棄するのはばかげた考えです’ -高レベルの機能を持つためのレベルのもの(C ++など)。
- @WolfgangBangerthいいえ、Fortranを傷つけています-“低レベル”バクテリアは”あまり進化していない” 。車の例えが必要な場合は、”のようにする必要があります。ジープとレクサスの両方を使用して沼沢地の小道を横断できますが、最初の車を使用しても痛みは少なくなります”。
- ご意見をいただければ幸いですが、FortranはC ++ほど進化していない’と主張しています:-)
回答
3つの事実:
-
F77スタイルのn次元Cの配列: CnD (恥知らずなプラグ、確かに)
-
F90のモジュールシステムを使用しても問題ありませんは設計が不十分で、環境を構築するのに敵対的です。(たとえば、モジュールの名前はファイル名と一致する必要はありません)
- Fortranはリファクタリングを適切にサポートしていません。機能の一部を引き出す関数の配列では、実際のコード、変数宣言、引数宣言、および引数リストの4つの場所に触れる必要があります。Cは2つの場所に触れることでうまくいきます。これにより、データを適切に管理できないという影響が悪化します(説明以下のリブ):小規模なモジュール性は非常に苦痛であるため、ほぼすべての人が巨大なサブルーチンを作成します。
個人的な印象:
- Fortranはうまく機能しませんデータを管理するため。 F77またはF90でユーザーが不透明なデータ構造へのポインターを返してみてください。 (
transfer()
、ここに来ました)
コメント
- こんにちはアンドレアス! CnDは興味深いです、私はそれについて知りませんでした’。ああ、あなたはそれを書いた。 :)(f90はスライスもサポートしており、配列に割り当て可能であり、最も重要なのは、乗算、加算などの配列構文です。)私はFortranでCMakeを使用しており、モジュールでうまく機能します。”引数リスト”とは正確には何ですか? ‘これらを使用しているとは思わないので、変更する必要があるのは3か所だけです。 Cでは、通常、実際のコード、パラメーター、およびヘッダーファイルを変更する必要があるため、’も3か所にあります(最も確実にC ++で)。はい、transfer()は’あまり良くありませんが、通常は’実際には必要ありません。
- 現代のFortranのリファクタリングは、EclipseのPhotranのように、適切なIDEを使用すれば簡単です。
- “モジュール’の名前’ファイル名と一致する必要はありません。例:”冗談を言う必要があります。1つのファイルに多くのモジュールを含めることができます。それらのいくつかはほんの数行にまたがっています。それぞれのファイルを作成する必要がない場合は、作成がはるかに簡単です。
- @ user389が言ったことに追加したかっただけですが、Photranは素晴らしく、FortranIDEで唯一可能です。リファクタリングでは、そのパーサーは常に失敗します。一方、’ Eclipseがメモリを大量に消費しているという事実についてコメントする必要はありません。
回答
Fortranは、配列/マトリックスの計算用に最適化されており、あらゆるタイプのテキスト解析で作業するのは非常に面倒です。 CとC ++は、数値計算ではFortranと一致しない可能性があります(近い)が、C / C ++を使用すると、テキストの処理とデータ(カスタムデータ構造)の整理がはるかに簡単になります。
As他の人は、動的に解釈された言語を数えないでくださいと述べています(Python他)。それらはFortanの顔を溶かす速度を前もって提供しないかもしれませんが、実装のすべての詳細よりも計算上の問題の解決に集中することができます。多くの場合、Pythonでソリューションを実装できます。パフォーマンスが許容できない場合は、プロファイリングを行い、問題のある領域を特定し、Cythonを使用してそのコードを最適化するか、コンパイル言語でプログラム全体を再実装します。問題解決ロジックを具体化したら、残りは単なる実装であり、コンピューティングの基礎を十分に理解していれば、さまざまなプログラミング言語で簡単に表現できるはずです。
コメント
- その’は正しいです。テキストの解析にはPythonも使用します。
- Pythonスクリプトの一部をコンパイル言語で実装することもできます。 C ++とフックします。例: Boost Python、Swigなど。
回答
私は現在国立研究所の1つで働いています。ほとんど私の周りの人々のほとんどは機械エンジニアです。HPCグループの何人かの人々とチャットして、彼らは「ほとんどLinuxとほとんどC ++をやっています。現在所属しているグループは主にデスクトップアプリケーションを実行しており、Windowsを使用し、C#、FORTRAN、Python、VBA、VB(.NETではなく6)の降順で使用しています。シミュレーションエンジンは、FORTRANの他の国立研究所で作成されました。
回答
掘り下げて申し訳ありません古いスレッドですが、2015年でもFortranが頻繁に使用されているようです。
これ(代替 link )リストは、基本的に、2018年に研究者が利用できるようになる300-petaFLOPSサミットマシンで実行するためにDOEのOCLFファシリティによって承認された13のコードのリストです。 。コードに使用されている主な言語を(グーグル検索に基づいて)見つけようとしましたが、次のようになりました。
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 ++ユーザー)の数を考えると、言及する価値があると思いました。
コメント
- 国立研究所での私の経験は、どちらかといえば反対だったので、私は同意しません。ローレンスリバモアで見た新しいプロジェクトのほとんどはC ++で書かれており、ODEソルバー、FEM離散化、および汎用科学計算ライブラリの新しい(または積極的に保守されている)最先端のオープンソースライブラリのほとんどはCまたはC ++のようです。 Fortranは、主に既存/レガシーライブラリを使用するプロジェクトで使用されているようです。 ‘言語についての私の考えとは関係なく、Fortranを使用した大きな新しいプロジェクトはあまり見られません。
- 密度汎関数理論コードの中には、 Fortranには、 VASP と CASTEP が含まれますが、@ GeoffOxberryが指摘しているように new プロジェクトはおそらくC ++に向かう傾向があります。
- @blochwaveリンクで読むことができるように、プロジェクトは2018年にオンラインになる新しいマシン(アクセラレーターなどを含む)用です。したがって、25年のコードを使用してコンパイルし、良好なパフォーマンスで実行することを望んでいるわけではありません。 上記のリストのコードの大部分は、新しいコードのように書き直されているか、書き直されていると確信しています。 多くの”新しい”気候コードもFortranにあり、多くの国の多くの機関で使用されています。
回答
ジャックP.が言いたいのは、混ぜ合わせるべきだということです。 優れたソフトウェアは慎重に階層化されています。 異なるレイヤーは、より自然に、または効率的に、異なる言語にマップできます。 各レイヤーに最も適切な言語を選択する必要があります。 また、言語がどのように相互運用できるかを理解する必要があります。これは、どのレイヤーにどの言語を選択するかに影響を与える可能性があります。
より良い質問は、階層化されたソフトウェアの設計方法について学ぶ価値のある、優れた設計のソフトウェアの例がそこにあるかどうかです。