これが私が意味したことのより深いところですが、他の人が同意するかどうか、または彼らが何を言わなければならないかを見るのは興味深いでしょう。
今日のコンピューターのしくみを考えてみてください。整数レジスタと浮動小数点レジスタ、およびランダムアクセスメモリの膨大な配列を備えたハードウェアと、このレジスタ/メモリセルの値の読み取りに基づく'形式の命令があります。この新しい値をこのレジスタに挿入してください。 /細胞'。(メモリセルの更新は、キャッシュライン、コヒーレンシ、メモリモデルなどに関して、あらゆる種類のパフォーマンスに影響します。)整数は32ビットまたは64ビットであり、ほぼすべてのプログラミング言語が、ハードウェアと完全に一致するこれらのデータ型を表面化します。ほぼすべてのランタイムは、スタックに割り当てられたオブジェクトが安価な小さな呼び出しスタックと、スタックベースではないライフタイムが必要なときに他のオブジェクトを作成および破棄できるより高価な「ヒープ」で動作します。
ここで、最新の関数型プログラミング言語について考えてみましょう。不変性が標準です。新しい値でメモリを「突く」ことはめったにありません。(これは、より多くの新しいものを作成することを意味しますオブジェクト。これは、より多くを割り当てることを意味します。)ラムダと継続が標準です。スタックに対応するオブジェクトの有効期間が存在することはめったにありません。(実際、一部のFPランタイムはスタックを使用しません。CPS実装では、スタックとプログラムカウンターの概念は適切ではありません。)再帰はループ構造であるため、消費しないようにするには少なくとも「末尾」呼び出しが必要です。とにかくスタック。実際には、すべてを「ヒープ」に割り当てる必要があります。もちろん、ガベージコレクターが必要です。代数的データ型はタグ付きデータを提供します。理論的には、これらのタグは追加の2ビットまたは3ビットのデータのみを必要としますが、ランタイムと一致させるために、多くの場合、追加のメモリワード以上が必要になります。...私はちょっと曲がりくねっていますが、FP言語で最も頻繁に行うことは、一般的なコンピュータハードウェアアーキテクチャと基本的な言語ランタイムでは、スケールが最悪または最も高価です。
そのようにする必要はありません。ランタイムがスタックを避け、ヒープ/割り当てを高速化する世界を想像することができます(マルチスレッドアプリのボトルネックではありません)。相互運用可能な整数型が29ビットまたは60ビットであり、ランタイム/ハードウェアが、GCや代数型タグなどの単語の余分な残りのビットを使用する世界を想像することができます。(一部のFP実装/ランタイムはこれらのトリックのいくつかを実行すると思います。)など...要点は、現代の関数型言語を与えられたものとして取り、それを中心にランタイム/ハードウェアを設計すると、非常に異なって見えるということです。今日の典型的なハードウェア/ランタイムから。
(私はそれをひどく伝えたとは思いません、そして私は正確に知らない多くの詳細について不正確です、しかしうまくいけばあなたはここで私の論文の要点を理解しました。)