Наскільки відрізняється сміття у чистих мовах?


26

Чистою мовою, як Haskell, всі дані незмінні і жодна структура даних не може бути змінена жодним чином. Крім того, багато алгоритмів щодо незмінних даних та моделей функціонального програмування генерують велику кількість сміття за своєю природою (наприклад, ланцюжки mapстворення проміжних списків).

Які стратегії та прийоми використовують сміттєзбірники в умовах чистоти, яку б інакше не було? Що дуже добре працює в GC нечистої мови, що не в чистому контексті? Які ще нові проблеми створюють чисті мови для GC?


1
ви можете прочитати цей wiki.haskell.org/GHC/Memory_Management
Матеуш К.

Відповіді:


13

Поточна реалізація ghc використовує стратегію, яка працює лише тому, що мова є чисто функціональною, а дані незмінні: оскільки жодна змінна ніколи не може бути змінена для посилання на щось більш нове, об'єкти містять посилання лише на старіші об'єкти, тому вона працює за поколінням збирача сміття ; оскільки об'єкт, на який посилається вище покоління, не може бути видалений, поки це покоління не є GCd, він з нетерпінням просуває об'єкти до вищих поколінь; і оскільки нічого не буде змінювати посилання, поки GC змітає їх, воно може працювати паралельно.

Ось документ з більш детальною інформацією .


4
Бурхливе просування покладається на лінь - оновлення грона в старому поколінні може створити вказівник на нове покоління, але громовідводки мутуються лише один раз, тому досить просувати молодий об’єкт з готовністю. Інші посилання старого на молодий (наприклад, із змінних масивів) відслідковуються за допомогою «запам'ятовуваних наборів», які також використовуються у випадку невдалого просування реклами.
Джон Перді

1

Чистою мовою, як Haskell, всі дані незмінні і жодна структура даних не може бути змінена жодним чином

Насправді це взагалі не так. Чисті мови використовують не суворе (ледаче) оцінювання, тому оцінка потенційно всіх підекспресій відкладається. Неоцінені вирази, як правило, купі виділяються як "шматок". За потреби вираження оцінюється, а грона мутується на отримане значення.

Які стратегії та прийоми використовують сміттєзбірники в умовах чистоти, яку б інакше не було?

Єдине, про що я можу придумати - це чорні діри . Я не пригадую, щоб у дослідницьких роботах Haskell бачив щось інше з боку GC.

Що дуже добре працює в GC нечистої мови, що не в чистому контексті?

Бар'єр запису GC. Нечисті мови, як правило, записують покажчики в купу набагато більше, тому вони, як правило, значно сильніше оптимізують свої бар'єри для запису.

Інші алгоритми GC, такі як маркова область, набагато більш життєздатні в контексті нечистих мов, оскільки вони можуть мати набагато менші показники розподілу, ніж чисті мови.

Які ще нові проблеми створюють чисті мови для GC?

Чисті мови дуже рідкісні, тому набагато менше даних про те, як чисті програми використовують пам'ять, і, отже, ви починаєте в гіршому становищі, намагаючись написати GC для чистої мови.


"За необхідності вираження оцінюється, а грона мутується на отримане значення." Це внутрішня деталь реалізації, що стосується користувача Haskell. Неможливо спостерігати за мутацією, тому це не мутація з точки зору користувача.
Джек

Крім того, для чистої мови цілком можливо бути суворим - див. Приклад Ідріса.
Джек
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.