Après avoir parcouru plusieurs réponses à un dépassement de pile, il est clair que certains langages compilés de manière native ont un garbage collection . Mais je ne vois pas comment cela fonctionnerait.
Je comprends comment la récupération de place pourrait fonctionner avec un langage interprété. Le ramasse-miettes s'exécute simplement à côté de l'interprète et supprime les objets inutilisés et inaccessibles de la mémoire du programme. Ils courent tous les deux ensemble.
Comment cela fonctionnerait-il avec les langages compilés? D'après ce que je comprends, une fois que le compilateur a compilé le code source en code cible - en particulier le code machine natif - c'est fait. Son travail est fini. Alors, comment le programme compilé pourrait-il également être récupéré?
Le compilateur fonctionne-t-il avec le processeur d'une manière ou d'une autre pendant l'exécution du programme pour supprimer les objets "garbage"? Ou le compilateur inclut-il un collecteur de mémoire minimal dans l'exécutable du programme compilé?
Je crois que ma dernière déclaration aurait plus de validité que la première en raison de cet extrait de cette réponse à Stack Overflow :
Un de ces langages de programmation est Eiffel. La plupart des compilateurs Eiffel génèrent du code C pour des raisons de portabilité. Ce code C est utilisé pour produire du code machine par un compilateur C standard. Les implémentations Eiffel fournissent GC (et parfois même des CG précis) pour ce code compilé, et aucun ordinateur virtuel n'est nécessaire. En particulier, le compilateur VisualEiffel a généré le code machine x86 natif directement avec le support complet du GC .
La dernière déclaration semble impliquer que le compilateur inclut un programme dans l'exécutable final qui agit comme un ramasse-miettes pendant l'exécution du programme.
La page du site Web du langage D sur la récupération de place, compilée de manière native et dotée d'un récupérateur de place facultatif, semble également indiquer qu'un programme d'arrière-plan s'exécute parallèlement au programme exécutable d'origine pour implémenter la récupération de place.
D est un langage de programmation système prenant en charge la récupération de place. Habituellement, il n'est pas nécessaire de libérer explicitement la mémoire. Allouez-le au besoin, et le ramasse-miettes retournera périodiquement toute la mémoire inutilisée dans le pool de mémoire disponible.
Si la méthode mentionnée ci-dessus est utilisée, comment cela fonctionnerait-il? Le compilateur stocke-t-il une copie d'un programme de récupération de place et la colle-t-elle dans chaque exécutable généré?
Ou suis-je imparfait dans ma pensée? Si tel est le cas, quelles méthodes sont utilisées pour implémenter la récupération de place pour les langages compilés et comment fonctionnent-elles exactement?
malloc()
.