Quelle est la différence entre la collecte des ordures dans les langues pures?


26

Dans un langage pur comme Haskell, toutes les données sont immuables et aucune structure de données existante ne peut être modifiée de quelque façon que ce soit. De plus, de nombreux algorithmes sur les données immuables et les modèles de programmation fonctionnelle génèrent de grandes quantités de déchets par nature (chaînes de mapcréation de listes intermédiaires par exemple).

Quelles stratégies et techniques les ramasseurs d'ordures utilisent-ils face à la pureté qu'ils n'auraient pas autrement? Qu'est-ce qui fonctionne très bien dans le GC d'un langage impur qui ne fonctionne pas dans un contexte pur? Quels autres nouveaux problèmes les langages purs créent-ils pour les GC?


1
vous voudrez peut-être lire ce wiki.haskell.org/GHC/Memory_Management
Mateusz K.

Réponses:


13

L'implémentation actuelle de ghc utilise une stratégie qui ne fonctionne que parce que le langage est purement fonctionnel et que les données sont immuables: car aucune variable ne peut jamais être modifiée pour faire référence à quelque chose de plus récent, les objets ne contiennent que des références à des objets plus anciens, donc il exécute un ramasse-miettes générationnel ; puisqu'un objet référencé par une génération supérieure ne peut pas être supprimé tant que cette génération n'est pas GCd, il promeut les objets auprès des générations supérieures avec impatience; et puisque rien ne va altérer les références pendant que le GC les balaye, il peut fonctionner en parallèle.

Voici un document plus détaillé .


4
Une promotion désireuse repose sur la paresse - la mise à jour d'un thunk dans une ancienne génération peut créer un pointeur dans la nouvelle génération, mais les thunks ne sont mutés qu'une seule fois, il suffit donc de promouvoir le jeune objet avec impatience. D'autres références anciennes à jeunes (par exemple, à partir de tableaux mutables) sont suivies en utilisant des «ensembles mémorisés», qui sont également utilisés en cas d'échec de la promotion.
Jon Purdy

1

Dans un langage pur comme Haskell, toutes les données sont immuables et aucune structure de données existante ne peut être modifiée de quelque façon que ce soit

En fait, ce n'est généralement pas vrai. Les langages purs utilisent une évaluation non stricte (paresseuse), de sorte que l'évaluation de potentiellement toutes les sous-expressions est différée. Les expressions non évaluées sont généralement attribuées en tas en tant que "thunk". Si nécessaire, l'expression est évaluée et le thunk est muté en la valeur résultante.

Quelles stratégies et techniques les ramasseurs d'ordures utilisent-ils face à la pureté qu'ils n'auraient pas autrement?

La seule chose à laquelle je peux penser, ce sont les trous noirs . Je ne me souviens pas avoir vu autre chose de nouveau du côté du GC dans les documents de recherche de Haskell.

Qu'est-ce qui fonctionne très bien dans le GC d'un langage impur qui ne fonctionne pas dans un contexte pur?

La barrière d'écriture GC. Les langages impurs ont tendance à écrire beaucoup plus de pointeurs dans le tas, de sorte qu'ils ont tendance à voir leurs barrières en écriture plus fortement optimisées.

D'autres algorithmes GC tels que mark-region sont beaucoup plus viables dans le contexte des langages impurs car ils peuvent avoir des taux d'allocation beaucoup plus bas que les langages purs.

Quels autres nouveaux problèmes les langages purs créent-ils pour les GC?

Les langages purs sont très rares, donc il y a beaucoup moins de données sur la façon dont les programmes purs utilisent la mémoire et, par conséquent, vous commencez dans une position pire lorsque vous essayez d'écrire un GC pour un langage pur.


"Au besoin, l'expression est évaluée et le thunk est muté en la valeur résultante." C'est un détail d'implémentation interne pour un utilisateur Haskell. Il n'y a aucun moyen d'observer la mutation, donc ce n'est pas une mutation du point de vue de l'utilisateur.
Jack

De plus, il est tout à fait possible qu'un langage pur soit strict - voir Idris pour un exemple.
Jack
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.