5

の無条件のような解釈を使用しています:は、ランタイムは、一般的に、私は関数型言語の通訳に関する一般的な質問がある関数型言語コード

は、任意の実行時に命令型言語対関数型言語を使用する利点(またはことを実際にあります通訳に向かう)?

私が見た質問はどれも(thisなど)実際にはこの質問には到達せず、検索にはさまざまな言語の定義よりも引数があふれています。

EDIT:私が答えを必要とした唯一の質問に縛られました。

+2

インタープリタに向かうメリットはどういう意味ですか? – sepp2k

+1

@ sepp2k私が挙げた特定の例のように、関数型プログラミング言語のさまざまな共通の機能があるようです。関数型プログラミングを命令型と区別しているように見えるこれらの機能が、実際に実行時に違いを生むかどうか、あるいは2つを区別するコーディングスタイルの面白い違いかどうかを知りたい。理にかなっている? –

+0

私はタイトルと少しの質問を変更しましたが、今はもっと明確になることを願っています。 –

答えて

29

短い答えは、すべてが最終的に何らかの低レベル言語(アセンブリ言語または仮想マシン言語)にコンパイルされることです。機能的言語と命令的言語は同じ意味を持ちます。マシン上で利用できるものに合わせて抽象化メカニズムをコンパイルする必要があります。
言語が異なるのは、低レベルのコードを基に低レベルのコードとどれほど密接に関連しているか(望ましい場合は手作業でコードを最適化することにより)、また、どのような最適化を可能にするか、 。

例えば、ネイティブコードにコンパイルするとき、ループは次のように(一般的に)ループにコンパイルされるのではなく、ループにコンパイルされます。ほとんどのアセンブリ言語はループも再帰もありません。もちろん、ループしているがジャンプしていない仮想マシンにコンパイルする場合は、ループを生成する必要があります。たとえば、Java仮想マシンでは、一般的なテールコールはループ単独より表現力があり、その制限を回避して効率をあげる必要があるため、これはたとえばJava仮想マシンの場合の問題です。

機能プログラムの "利点"は、セマンティクスが優れているため、プログラムについてより簡単に推論することができます。たとえば、より簡単な方法で最適化を表現できます。今日コンパイラの多くは、基本的に低レベルの機能言語であるSingle Static Assignment (SSA)中間形式を使用しています.1コンパイラコミュニティの人々が独自に発見したものです。たとえば、変数の突然変異をなくした場合や、変数がすべての範囲で同じ値を保持している場合は、ほとんどの最適化が簡単です。このような機能的な中間形式のレジスタ割り当てを行ういくつかの手法があります。

¹:Andrew Appelの短い1998年の記事:SSA is Functional Programmingを参照してください。 SSAフォームの詳細については、CPSなど、SSAと他の機能的な中間フォームとの関係については、some reading notesがあります。

純度(副作用がないか、または少なくとも計算が副作用なしになる優れたコントロール)と静的な型指定から最適化の利点を得ることもできます。純粋さから、deforestationfusionなどの強力な最適化を導き出すことができます(中間のデータ構造を排除します)。タイピングによって、値の形が強く保証されます(そのため、一部の動的言語では、目的)を提供します。

低水準機能へのアクセスについて:Fortran、C、およびC++はおそらく、最もよく利用されている「非常に低レベルになる」言語です。ATS(もともとは関数型プログラミング言語ですが、むしろ見た目は難しいですが)は、スタック割り当てバージョンのヒープ割り当てをよく制御します。Haskellthe CLR (C#,etc.)はunboxedを提供していますそのような低レベル推論の特別なケースとして複合型を使用し、同様にRustは、メモリ消費に関する低レベルの決定を行う方法を提供しようとしています。
しかし、これは確かにあなたのパフォーマンスにとって重要な小さなコード部分を分離し、その中から最適化したい(いくつかの柔軟性/単純さ/保守性をあきらかにしたい)場合は、これは変わりませんあなたが組み込み/カーネルプログラマでない限り、日々の生活の中でのあなたの人生。適切な抽象化レベルを使用し、問題の正しい設計とアルゴリズムを選択するのに時間を費やすことができる生産的な言語から全体的にパフォーマンスが向上します。もちろん、両方を持ちたいと思うかもしれませんが、それは可能ですが困難です。

+0

これは完璧です、ありがとうございます。 –

0

実行時に関数型言語と命令型言語を使用することには、実際に利点がありますか(または、それらがインタープリタに向かう)?

はい。関数型言語を使用している場合、利点はおそらくインタープリタの作家がより速く完了していることです。あなたが必須のものを使用する場合は、少しメモリとCPUを使用することができます。

どのようにしても、利点があります。

しかし、命令型言語で書かれたものと機能的なもので書かれたものの2つの通訳者が与えられていれば、両方が正しいとすれば、使用されたプログラムの結果からは分かりません。

関連する問題