NP 困難な問題を効率的に解決するためのツールを実装する必要があり、メモリ使用量の爆発 (場合によっては出力サイズが入力サイズに対して指数関数的) が避けられない可能性があり、実行時のこのツールのパフォーマンスが特に心配であるとします。時間。基礎となる理論が理解できたら、ソース コードも読みやすく理解しやすいものでなければなりません。この要件は、ツール自体の効率と同じくらい重要です。
個人的には、これらの 3 つの要件を満たすには、c++、scala、java の 3 つの言語が適していると考えています。それらはすべて、異なる構造を比較したり、同じアルゴリズム (これも重要です) を異なるデータ型に適用したりできるようにする、データ型の適切な抽象化を提供します。
C++ には、静的にコンパイルおよび最適化されるという利点があり、関数のインライン化 (データ構造とアルゴリズムが慎重に設計されている場合) およびその他の最適化手法を使用すると、かなり良好な可読性を維持しながら、純粋な C に近いパフォーマンスを実現できます。データ表現にも細心の注意を払うと、キャッシュ パフォーマンスを最適化できます。これにより、キャッシュ ミス率が低い場合に桁違いの速度が得られます。
Javaは代わりにJITコンパイルされているため、実行時に最適化を適用できます。このカテゴリのアルゴリズムでは、異なる実行間で異なる動作を持つ可能性があり、プラスになる可能性があります. 代わりに、そのようなアプローチがガベージコレクターに悩まされる可能性があることを恐れていますが、このアルゴリズムの場合、メモリを継続的に割り当てるのが一般的であり、Java ヒープのパフォーマンスは C/C++ よりも優れていることで有名です。言語内に独自のメモリマネージャーを実装すると、優れた効率を実現します。代わりに、このアプローチではメソッド呼び出しをインライン化することができず (パフォーマンスが大幅に低下します)、キャッシュ パフォーマンスを制御することもできません。長所の中には、C++ よりも優れた簡潔な構文があります。
scala に関する私の懸念は、多かれ少なかれ Java と同じであり、さらに、コンパイラーと標準ライブラリーに関する深い知識がなければ、言語がどのように最適化されるかを制御できないという事実です。しかしまあ、私は非常にきれいな構文を取得します:)
この件についてどう思いますか?あなたはすでにこれに対処しなければなりませんでしたか?これらの言語のいずれかで、そのようなプロパティと要件を持つアルゴリズムを実装しますか、それとも何か他のことを提案しますか? それらをどのように比較しますか?