関数型言語の通訳について一般的な質問があります。
実行時に関数型言語と命令型言語を使用すること(またはインタプリタに到達すること)に実際に利点はありますか?
私が見た質問(このような)はどれも実際にはこの質問に到達せず、検索にはさまざまな言語の定義に関する議論が殺到しています。
編集:私が答える必要があった唯一の質問に取り除いた。
関数型言語の通訳について一般的な質問があります。
実行時に関数型言語と命令型言語を使用すること(またはインタプリタに到達すること)に実際に利点はありますか?
私が見た質問(このような)はどれも実際にはこの質問に到達せず、検索にはさまざまな言語の定義に関する議論が殺到しています。
編集:私が答える必要があった唯一の質問に取り除いた。
簡単に言うと、すべてが最終的に低水準言語(アセンブリ言語または仮想機械語)にコンパイルされます。関数型言語と命令型言語は対等な立場にあります。マシンで利用できるものに合うように、抽象化メカニズムをコンパイルする必要があります。
言語が違いを生むのは、基礎となる低レベルのコードとどれだけ一致するか(必要に応じて手作業でコードを最適化する低レベルの機能を提供することによって)、および強力な推論保証を提供するクリーンなセマンティクスを持つことによって、どの最適化を可能にするか、または容易にするかです。
たとえば、ネイティブコードにコンパイルする場合、再帰は(一般に)ループにコンパイルされるのではなく、ループと同じようにラベルへのジャンプにコンパイルされます。ほとんどのアセンブリ言語にはループも再帰もありません。もちろん、ループはあるがジャンプがない仮想マシンにコンパイルする場合は、ループを作成する必要があります。これは、たとえばJava仮想マシンでは問題になります。一般的な末尾呼び出しはループだけの場合よりも表現力があり、その制限を回避して効率を上げる必要があるためです。
機能プログラムの「利点」は、セマンティクスがより適切に動作するため、プログラムについてより簡単に推論でき、たとえば、より簡単な方法で最適化を表現できることです。現在、多くのコンパイラーは、基本的に低レベルの機能言語である単一静的代入(SSA)中間形式を使用しています¹。これは、コンパイラー・コミュニティの人々によって独自に発見されました。たとえば、変数のミューテーションを排除し、変数がそのすべてのスコープで同じ値を保持している場合、ほとんどの最適化はより簡単に実行できます。このような機能的な中間形式でより効率的な方法でレジスタ割り当てを行うためのいくつかの手法があります。
¹:Andrew Appelの1998年の短い記事を参照してください:SSAは関数型プログラミングです。SSAフォームの詳細に興味がある場合は、 SSAとCPSなどの他の機能的な中間フォームとの関係についての注意事項を以下に示します。
また、純度(副作用がない、または少なくともどの計算が副作用のないかを適切に制御する)と静的型付けから最適化の利点を得ることができます。純粋さから、森林伐採や融合(中間データ構造の排除)などの強力な最適化を導き出すことができ、入力から、値の形状について強力な保証を得ることができます(そのため、一部の動的言語では、最適化のために制限された形式の型注釈を許可しようとします目的)より良いコードを生成することを可能にします。
低水準機能へのアクセスに関して:Fortran、C、およびC ++はおそらく最良であり、最も広く利用可能な「非常に低水準の言語に対応できる」言語です。一部の言語は、これらの機能の一部を提供しようとします。たとえば、ATS(元々は関数型プログラミング言語ですが、ベアメタルなので見づらいです)は、HaskellとCLRの両方のスタック割り当てバージョンのヒープ割り当てを適切に制御します( C#など)は、このような低レベルの推論の特殊なケースとして、ボックス化されていない複合型を提供します。同様に、Rustは、メモリ消費について低レベルの決定を行う方法を提供しようとしています。
ただし、これは、パフォーマンスにとって重要なコードの小さなセクションを分離し、それから地獄を最適化したい場合(ある程度の柔軟性/単純さ/保守性を放棄したい場合)には確かに役立ちますが、これはあなたの人生を変えることはありません組み込み/カーネルプログラマーでない限り、日常の状況で。おそらく、適切な抽象化レベルを使用できる生産的な言語によって全体的なパフォーマンスが向上し、問題に適した設計とアルゴリズムの選択により多くの時間を費やすことができます。もちろん、両方が欲しいと思うかもしれません、そしてそれは可能ですが難しいです。
実行時に関数型言語と命令型言語を使用すること(またはインタプリタに到達すること)に実際に利点はありますか?
はい。関数型言語を使用する場合の利点は、インタープリターライターの処理がおそらく高速になることです。命令型を使用する場合は、使用するメモリとCPUが少し少なくなる可能性があります。
したがって、どのように実行しても、利点があります。
しかし、2つのインタプリタ(1つは命令型言語で書かれ、もう1つは機能的な言語で書かれている)があり、さらに両方が正しいことを考えると、プログラムの結果から、どちらのインタプリタが使用されたかはわかりません。