13

「関数型プログラミング」のまったく新しいパラダイムがあり、手続き型プログラミングと比較して思考パターンを完全に変える必要があります。高階関数、純度、モナドなどを使用します。これは、命令型およびオブジェクト指向言語では通常見られません。

私の質問は、これらの言語の実装が、たとえばメモリ管理やポインタなどの内部構造に関して、命令型またはオブジェクト指向言語とどのように異なるかということです。

JVM上で実行される関数型言語があります。これは、これらの言語がJVM上の他の言語と同様に内部的に機能することを意味しますか?

4

7 に答える 7

8

関数型言語から得られたコードは、非関数型言語でさまざまな程度で見られる多くの機能を使用します。ガベージコレクションは一般的な使用法になりました。末尾呼び出しの最適化は、GCCおよびVC++で行われます

ただし、クロージャは関数型プログラミングの特徴です。片方がもう片方なしでは見えません。純粋関数型言語のみを参照するように「関数型言語」を定義する場合、関数型プログラミングをサポートする命令型言語(たとえば、JavascriptとScheme(関数型パラダイムがほとんどですが、技術的に必須です)でクロージャを見つけるため、2つは同義ではありません。使用済み))。クロージャは、コールスタック用のスパゲッティスタックを使用するか、スタックフレームを終了するときにローカル変数をコピーするか、ヒープにローカル変数を割り当ててガベージコレクションに処理させることで実装できます。

クロージャを作成すると、無名関数は比較的簡単になります(インタープリターを使用すると、非常に簡単になります)。コンパイラを使用すると、関数はコンパイル時にバイトコードに変換され、バイトコード(エントリポイントのアドレスではなく)が実行時に現在の環境に関連付けられます。

関数の合成は無名関数に依存できます。コンパイラが関数合成演算子に遭遇すると、2つの引数とf . gを呼び出す無名関数を作成し、一方の結果をもう一方の引数として渡します。fg

モナドはオブジェクト指向言語で実装できますが、純粋関数型言語ほど必要ではありません。I / Oモナドはそれほど特別なものではなく、基盤となるプラットフォームが副作用を許容するという事実に依存しているだけです。

于 2009-12-07T01:48:33.427 に答える
5

関数型プログラミング言語の実装では、さまざまな実装手法が使用されています。スキーム(Lisp方言)の実装への優れた入門書はこの本を与えます:ChristianQueinnecによる小さな断片のLisp 。

于 2009-12-07T00:27:54.760 に答える
1

関数型言語で特別な注意を払うことで恩恵を受ける多くの側面があると思います。頭に浮かぶのは次のとおりです。

関数型言語は再帰をよく使用します。したがって、どの実装もこのケースを最適化するように努める必要があります。たとえば、末尾再帰を識別し、内部でループに変換します(したがって、スタックの保存/復元などの関数呼び出しのオーバーヘッドを節約できます)。(http://en.wikipedia.org/wiki/Tail_recursion

于 2009-12-07T00:13:09.670 に答える
1

Haskellなどの関数型プログラミング言語の実装は、命令型言語の実装とは大きく異なることがよくあります。ここでそれを行う1つの方法について読むことができます。紙は数年前のものですが、そのアイデアは今でも使われていると思います。

于 2009-12-07T00:29:47.233 に答える
1

頭に浮かぶ最大の違いは、関数型言語は、ソースコードが数学的に単純で強力な中間言語に脱糖されるように設計される傾向があるということです。この言語には通常、ラムダ、関数呼び出し、if / else、マシンタイプなどが含まれていますが、それ以上のものは含まれletていません。変換されたコードは深くネストされており、冗長であり、現実的に人間が読める形式ではありません。表面の構文は破棄されます。

このような言語のコンパイラは、適切なコードを生成するために、いくつかのインライン化といくつかのクロージャ最適化を実行する必要があります。(私には、これらのベースラインクロージャーの最適化は重要であるように見えます(エスケープ分析など)が、それは単に慣れていない可能性があります。)

于 2009-12-09T01:33:00.433 に答える
0

すべてが同じプロセッサ(したがって同じアセンブリ命令)で実行されるため、十分に深く理解している限り、すべてが内部的に同じです。

于 2009-12-07T00:06:29.717 に答える
0

@outis:言語はそれらをサポートするかもしれませんが、クロージャは副作用と同じように関数の数学的概念と競合します。同じ引数から異なる結果を得ることができます。これにより、クロージャは機能的ではなく手続き型になります。

とは言うものの、グローバルよりもクロージャを優先する効率の議論があります(特にコンパイラ実装のコンテキストで)。[しかし、「同様の作業」を実装できたとしても、クロージャを直接提供しない関数型言語を知っています。]

(ただし、カリー化はクロージャに似ており、この競合の影響を受けず、実際に関数型言語で日常的に存在します。)

とにかく、私の意見では、関数型プログラミング言語は、計算を数学関数であるかのように表現できるようにするために多大な努力を払う言語です。これは、最適化が関数の最適化で傾斜していることを意味します。

仮に、少なくとも関数型言語を使用すると、純粋な手続き型アプローチに役立つよりも深い抽象化でマシンを動作させることができます。

于 2011-02-24T18:18:58.157 に答える