純粋な言語のガベージコレクションはどの程度違いますか?


26

Haskellのような純粋な言語では、すべてのデータは不変であり、既存のデータ構造は一切変更できません。さらに、不変データおよび関数型プログラミングパターンに関する多くのアルゴリズムは、本質的に大量のガベージをmap生成します(たとえば、中間リストの作成のチェーン)。

ガベージコレクターは、他の方法ではできない純度に直面して、どのような戦略と手法を採用していますか?純粋なコンテキストではない不純な言語のGCでうまく機能するものは何ですか?純粋な言語はGCに対して他にどのような新しい問題を引き起こしますか?



回答:


13

現在のghcの実装では、言語が純粋に機能的でデータが不変であるためにのみ機能する戦略を使用します。変数を変更して新しいものを参照することはできないため、オブジェクトは古いオブジェクトへの参照のみを保持するため、世代別ガベージコレクターを実行します; 上位世代が参照するオブジェクトは、その世代がGCdされるまで削除できないため、オブジェクトを上位世代に積極的に昇格させます。また、GCが参照をスイープしている間は何も参照を変更しないため、並行して実行できます。

詳細はこちらの論文をご覧ください


4
熱心なプロモーションは怠に依存します。古い世代のサンクを更新すると、新しい世代へのポインタを作成できますが、サンクは一度しか変更されないため、若いオブジェクトを熱心にプロモーションするだけで十分です。他の古いものから若いものへの参照(たとえば、可変配列から)は、「記憶されたセット」を使用して追跡されます。これは、積極的なプロモーションが失敗した場合にも使用されます。
ジョンパーディ

1

Haskellのような純粋な言語では、すべてのデータは不変であり、既存のデータ構造は一切変更できません

実際、それは一般的に真実ではありません。純粋な言語は非厳密(遅延)評価を使用するため、潜在的にすべての部分式の評価は延期されます。通常、未評価の式は「サンク」として割り当てられたヒープです。必要なときに式が評価され、サンクがされて変異した値に。

ガベージコレクターは、他の方法ではできない純度に直面して、どのような戦略と手法を採用していますか?

私が考えることができる唯一のものはブラックホールです。Haskellの研究論文でGC側で何か新しいものを見たことを覚えていない。

純粋なコンテキストではない不純な言語のGCでうまく機能するものは何ですか?

GC書き込みバリア。不純な言語は、ポインタをより多くヒープに書き込む傾向があるため、書き込み障壁がより厳しく最適化される傾向があります。

mark-regionなどの他のGCアルゴリズムは、純粋な言語よりも割り当て率がはるかに低い可能性があるため、不純な言語のコンテキストで実行可能です。

純粋な言語はGCに対して他にどのような新しい問題を引き起こしますか?

純粋な言語は非常にまれであるため、純粋なプログラムがメモリを使用する方法に関するデータははるかに少ないため、純粋な言語のGCを作成しようとすると、より悪い位置から開始します。


「必要な場合、式が評価され、サンクが結果の値に変換されます。」Haskellユーザーに関する限り、これは内部実装の詳細です。突然変異を観察する方法はないため、ユーザーの観点からは突然変異ではありません。
ジャック

さらに、純粋な言語を厳密にすることは完全に可能です-例についてはイドリスを参照してください。
ジャック
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.