Supposons que vous disposiez d'un langage de programmation avec gestion manuelle de la mémoire. De quelles fonctionnalités ce langage a-t-il besoin pour pouvoir implémenter un ramasse-miettes précis en tant que bibliothèque, et non en tant que construction de langage fondamentale?
Par un GC précis, je veux dire un où seuls les pointeurs vers le tas sont traversés pour déterminer quelles variables sont ou ne sont pas actives.
Quelques considérations supplémentaires:
- C et C ++ ont le ramasse-miettes Boehm, mais je ne compte pas car ce n'est pas un GC précis. Le collecteur Boehm suppose que tout élément de la pile qui pourrait être un pointeur, basé uniquement sur les exigences d'alignement de la mémoire, est un pointeur. Par exemple, tout entier
k
qui(k % 4) == 0
ressemble à un niveau binaire comme un pointeur, car les pointeurs doivent être alignés sur 4 octets. - magpie transforme le code C existant pour utiliser un ramasse-miettes précis. Le code C généré a beaucoup de stubs pour la récupération de place, c'est-à-dire des trucs pour enregistrer des pointeurs de pile dans le tas avec le collecteur. Je ne compte pas cela parce que personne ne pourrait jamais écrire du code de cette façon; c'est plus une cible de compilation pour d'autres langues.
J'imagine qu'une telle langue devrait avoir:
- Macros ou une certaine forme de métaprogrammation, pour encapsuler tout le code supplémentaire nécessaire pour faire des choses comme enregistrer les racines GC.
- Un mécanisme réfléchissant qui vous permet d'inspecter des structures ou des syndicats; vous devez déterminer quels membres sont des pointeurs.
- Un mécanisme réfléchissant qui vous permet d'examiner la disposition du cadre de pile. Cela semble beaucoup plus difficile que 2.
J'espère que ce n'est pas trop vague ou basé sur l'opinion, mais je me pose des questions à ce sujet depuis un moment.