web-dev-qa-db-ja.com

最速の関数型言語

私は最近、関数型プログラミング、特にHaskellとF#について深く掘り下げています。少し調べたところ、より有名な関数型言語(Scala、F#など)のベンチマーク比較を見つけることができませんでした。

一部の言語(Scalaが頭に浮かびます)は、それらがハイブリッドであることを考えると、必ずしも公平ではないことはわかっていますが、どの操作や全体でどの言語がどの言語よりも優れているかを知りたいだけです。

18
Farouk

Great Benchmarks Game によると、 [〜#〜] ats [〜#〜] は、Haskell、Scala、およびCommon LISPのバリアントの1つを使用した他のバージョンよりも高速ですその背後にあるスピードのラフなタイ。その後、OcamlとF#はほぼ同じ速度カテゴリになり、RacketとClojureが遅れています...

ただし、これはほとんど何も意味しません。問題、マシン、コンパイラー、コーディング手法、そして場合によっては運の問題です。一般的に言って、Haskellのような直接機械コード化された言語は、F#のようなVMコンパイル済み言語よりも優れており、純粋に解釈された言語よりもはるかに優れています。また、一般に、静的に型付けされた言語は、動的に型付けされた言語よりも高速です。これは、静的分析により、すべての型操作を実行時ではなくコンパイル時に計算できるためです。繰り返しになりますが、これらは一般的なルールであり、常に例外があります。 「パラダイム」はそれとはほとんど関係ありません。

25
World Engineer

プログラミング言語のパフォーマンスを測定/定量化できないことも指摘しておく必要があります。あなたができる最善のことは、特定のプログラムを実行している特定のプラットフォームでの言語の特定の実装のパフォーマンスを測定することです。

したがって、「最速の関数型言語」について尋ねるとき、言語の現在の実装の中で最高のものについて本当に何を求めているのでしょうか。


@igouyのコメントは、言語実装のotherパフォーマンス指標があるという点を指摘しています。例えばコンパイル時間。ただし、アプリケーションプログラムのランタイムが言語の実装の(間接的な)尺度であり、言語自体の尺度ではないという事実は変わりません。

Javaたとえばを考えます。クラシック(Java 1.0)Javaの言語機能のみを使用してシングルスレッドのベンチマークを記述したとします。JDK1.0を使用してコンパイルおよび実行すると、パフォーマンスが低下します( 'cos JDK 1.0にはネイティブコードコンパイラがありませんでした。JDK1.1から... JDK 1.7に変更すると、徐々に改善される可能性が高くなります。ただし、Java language ...ベンチマークが同じ言語サブセットを使用しているためです。スピードアップは、コンパイラ、ランタイムシステム、および/またはクラスライブラリの実装の改善によるものです。すべて実装の問題です。

もう1つのポイントは、これらの実装の違いは、同じ言語では非常に重要(たとえば、桁違い)になる可能性があることです。したがって、言語Xの最良の実装が言語Yの最良の(または唯一の)実装よりも高速であるという事実は必然的には言語自体について多くのことを教えてくれません。

12
Stephen C

実行速度のみで言語を検討している場合、いくつかの重要なポイントがありません。スピードはいいことですが、それだけではありません。

Haskellは非常に堅牢な型システムを使用して、バグのない堅牢なプログラムを作成します。

Erlangは組み込みの監視システムを使用して、さまざまなタイプの障害に直面した場合に非常に高いレベルの信頼性を提供できる障害システムを作成できます。さらに、Erlangは、他の言語では一致しにくいレベルの並行性を提供できます。

実際、私は、現代の実行速度は、ほとんどの場合、私が検討することになるリストのかなり下にあると考えています。 (もし私が大量の数値計算をしているなら、おそらく速度のためにfortranを使いたいと思うでしょうが、それ以外の場合は問題になるほど重要ではありません)

6
Zachary K