2

「副作用は良いことなのか?」という質問に対するブライアンの主張の前提は次のとおりです。は興味深い:

コンピューターは、ラムダでうまく機能するように設計されているのではなく、エフェクトでうまく機能するように設計された von-Neumann マシンです。

アプローチの並置に混乱しています。私はそれらを白黒として見ることができません。次の証明値は何ですか:

コンピューターは、効果をうまく処理するように設計された von-Neumann マシンです [1]。

最後の部分は私を混乱させます:

ラムダでうまく動作するように設計されているのではなく[2]

ラムダは関数型プログラミングのシンボルとして使用されますか? それとも、関数型プログラミングの婉曲表現ですか? 本当のメッセージは何ですか?

前提の[1]と[2]の部分はどのような意味で正しいのでしょうか。返信に隠された前提は何ですか? 誰かが元の前提を正当化できますか? フォンノイマンマシンとラムダは実際にどのように機能するのですか?

4

2 に答える 2

6

これが私が意味したことのより深いところですが、他の人が同意するかどうか、または彼らが何を言わなければならないかを見るのは興味深いでしょう。

今日のコンピューターのしくみを考えてみてください。整数レジスタと浮動小数点レジスタ、およびランダムアクセスメモリの膨大な配列を備えたハードウェアと、このレジスタ/メモリセルの値の読み取りに基づく'形式の命令があります。この新しい値をこのレジスタに挿入してください。 /細胞'。(メモリセルの更新は、キャッシュライン、コヒーレンシ、メモリモデルなどに関して、あらゆる種類のパフォーマンスに影響します。)整数は32ビットまたは64ビットであり、ほぼすべてのプログラミング言語が、ハードウェアと完全に一致するこれらのデータ型を表面化します。ほぼすべてのランタイムは、スタックに割り当てられたオブジェクトが安価な小さな呼び出しスタックと、スタックベースではないライフタイムが必要なときに他のオブジェクトを作成および破棄できるより高価な「ヒープ」で動作します。

ここで、最新の関数型プログラミング言語について考えてみましょう。不変性が標準です。新しい値でメモリを「突く」ことはめったにありません。(これは、より多くの新しいものを作成することを意味しますオブジェクト。これは、より多くを割り当てることを意味します。)ラムダと継続が標準です。スタックに対応するオブジェクトの有効期間が存在することはめったにありません。(実際、一部のFPランタイムはスタックを使用しません。CPS実装では、スタックとプログラムカウンターの概念は適切ではありません。)再帰はループ構造であるため、消費しないようにするには少なくとも「末尾」呼び出しが必要です。とにかくスタック。実際には、すべてを「ヒープ」に割り当てる必要があります。もちろん、ガベージコレクターが必要です。代数的データ型はタグ付きデータを提供します。理論的には、これらのタグは追加の2ビットまたは3ビットのデータのみを必要としますが、ランタイムと一致させるために、多くの場合、追加のメモリワード以上が必要になります。...私はちょっと曲がりくねっていますが、FP言語で最も頻繁に行うことは、一般的なコンピュータハードウェアアーキテクチャと基本的な言語ランタイムでは、スケールが最悪または最も高価です。

そのようにする必要はありません。ランタイムがスタックを避け、ヒープ/割り当てを高速化する世界を想像することができます(マルチスレッドアプリのボトルネックではありません)。相互運用可能な整数型が29ビットまたは60ビットであり、ランタイム/ハードウェアが、GCや代数型タグなどの単語の余分な残りのビットを使用する世界を想像することができます。(一部のFP実装/ランタイムはこれらのトリックのいくつかを実行すると思います。)など...要点は、現代の関数型言語を与えられたものとして取り、それを中心にランタイム/ハードウェアを設計すると、非常に異なって見えるということです。今日の典型的なハードウェア/ランタイムから。

(私はそれをひどく伝えたとは思いません、そして私は正確に知らない多くの詳細について不正確です、しかしうまくいけばあなたはここで私の論文の要点を理解しました。)

于 2009-04-19T00:14:50.300 に答える
3

あなたが何を求めているのか完全にはわかりませんが、私がそれを読んだとき、あなたは彼がラムダで何を意味するのか尋ねていますか?

彼は、関数型プログラミングの理論的基礎の多くを形成するラムダ計算について言及しています。これは、(とりわけ) 高階関数について記述し、推論するための抽象的な表記法です。

フォン・ノイマン・マシンは、基本的に私たちが持っているものです。プログラムは、ストア (私たちの RAM) を操作してアクセスする命令によって実行されます。つまり、すべてが暗黙のうちに副作用によって行われます。データは、RAM のある領域から読み取られ、少し処理され、RAM のある領域 (おそらく別の領域) に書き戻されます。副作用がなければ、CPU は、電源がオンになったときにたまたまレジスタにあったガベージ データの操作に制限されます。

ラムダ計算には副作用の概念がないため、この原則に基づいたマシンでは、「CPU がアクセスできるもの」(基本的にレジスタ) と「間接的にアクセスできるもの」(RAM) を区別しません。そのようなマシンのすべては、関数が 1 つ以上の引数を取り、既存の値を変更せずに新しい値を返すという関数の原則に基づいています。(いいえ、それがハードウェアでどのように機能するかはわかりません... :))

それはあなたの質問に答えていますか?

于 2009-04-18T23:05:23.507 に答える