すべての命令関数について、同一のパフォーマンスまたは偶数の指示を備えた機能的なカウンターパートがありますか?
-
29-09-2020 - |
質問
現在、私はC / C ++と同じ性能を達成できる機能言語について学んでいません。そして、スカラや錆などの機能的なプログラミングに機能的なプログラミングを支持するいくつかの言語は、より良い効率のためにそれらのライブラリ関数を実装するための命令的な方法を使用することを学びました。
だからここで私の質問は、命令の指示を実行する今日のコンプタータで、これはコンパイラまたは機能的プログラミング自体の制限ですか? C / C ++ / Rust / AssemblyなどのGCのいずれか、またはJavaなどのGCを持つGCのいずれかで、副作用を持たない、またはJavaなどのGCのいずれかは、コンパイル可能なHaskell、Scalaなどに純粋な機能の対応するものがあります。テール再帰、怠惰、静的分析、正式な検証などのすべての現代およびさえ発見されていない最適化技術を利用する最適な機能コンパイラを使用して、最適な機能コンパイラを使用した最適な機能コンパイラを使用して、時間とスペース(漸近的では全く同じではなく)でも同じパフォーマンスで実行します。私は知らないのですか?
λ - 計算可能性とチューリング可能なものとの間の等価性を認識していますが、この質問に対する答えをオンラインで見つけることができませんでした。もしあれば、コンパイラの例や証明を共有してください。そうでない場合は、なぜCOUNTER-exampleを示す理由を説明してください。またはこれは自明でない問題なのですか?
より具体的には、この質問について考えることが導かれた2つの例です。
テール再帰およびアキュムレータは、いくつかの再帰関数の性能をfor
を使用した命令実装と同一であることができます。場合によっては、それらは同じ指示さえさえあるかもしれません。
他の例はHaskellの怠惰に関するものです。怠惰はデータ構造の不必要なコピーを避け、パフォーマンスを良くするのに役立ちます。しかし、怠惰はランタイムでラッピング、クロージャなどを残し、それでもそのようなことがない限り、プログラムを短くすることはできません。だから私は、コンパイル中にランタイムの前にそのようなことを静的に削除できるかどうか疑問に思います。
NearO :
このようにして述べることもできます。純粋なコンパイラとペアに対応した純粋な機能プログラミングと命令型プログラミングの両方をサポートする言語は、純粋に実装された1つの純粋に交換することができます。機能的には、パフォーマンスの低さ、または同じ命令にもコンパイルされていない場合は?
解決
-
パフォーマンスは言語の財産ではなく、言語内の特定のプログラムの財産です。いくつかの言語はいくつかのもので非常に速く、他の人で遅いかもしれません。
Chez-Schemeは、言語がより効率的であるため、Cに匹敵するパフォーマンスが得られることがありますが、プログラマーがCでしばしば使用することがしばしば使用されていないためです。
HaskellがCより速いからではなく、Haskellが非常に効率的な並列処理や同時実行性を実行できる場合がありますが、その言語の不変性を保証するため、プログラマがロックやその他の同期技術のようなものを回避できるためです。
と、実装によってパフォーマンスが実装によって異なります。私はCインタプリタを手渡すことができますが、それは確かに速くはありません。 Cは速く、GCC、およびCLANGはありません。
-
「機能的な」言語と見なされますか?すべての実用的な機能言語には、OCAML、Haskell、Scala、Lisp、Scheme、Schemeなどのためのいくつかの設備があります。テール再帰は、フォーループの内側の突然変異とほぼ同じ何かを与えます。しかし、これが十分でない場合、機能言語はプログラマーに変換可能な状態へのアクセスを与えます。 Haskellの場合、これはタイプシステムによって制御されているので、暗黙の変異状態はありませんが、突然変異は非常に許可されており、Haskellでは奨励されています。 Haskellコードを見てください、そして、あなたはいたるところでIOモナドを見るでしょう。同様に、ML言語は、
T
とref T
を区別するので、変数が変化しているかどうかであるかどうかによって言うことができます。 -
米の定理に感謝されている「最適な」コンパイラはありません。すべてのコンパイラ、命令的または機能的なもので、「ベスト努力:」はコードを最適化するための保守的近似を使用しています。
最適なコンパイラを持っていた場合、すべてのプログラムが常に可能な限り効率的な指示を使用して常に実行されることになるでしょう。問題を解決する命令の最適な順序は問題ではありません。ソース言語に依存します。しかし、これがあれば、このコンパイラはすべての非停止プログラムを
while(0)
にコンパイルします。これは、不可能な非停止プログラムを検出できます。 -
チューリングマシンとラムダ微積分は、常にユニバーサルチューリングマシンと同等の のチューリングマシンのためのラムダ計算インタプリタを実装することがかなり些細であると思います。彼らが「機能言語が遅い」と言うとき、ビッグョの複雑さは人々が意味するものではありません。通常、彼らは一定のオーバーヘッドについて話しています。これは非常に異なります。私たちはこれを数学的にモデル化する方法があまりありませんので、私たちは通常、正確な性能を測定するために実験を使って終わったばかりです。