Dopo aver sfogliato diverse risposte in Stack Overflow, è chiaro che alcune lingue compilate in modo nativo hanno la garbage collection . Ma non mi è chiaro come funzionerebbe esattamente.
Capisco come la garbage collection potrebbe funzionare con un linguaggio interpretato. Il garbage collector correva semplicemente accanto all'interprete ed eliminava oggetti inutilizzati e non raggiungibili dalla memoria del programma. Entrambi corrono insieme.
Come funzionerebbe con le lingue compilate? La mia comprensione è che una volta che il compilatore ha compilato il codice sorgente nel codice di destinazione - in particolare il codice macchina nativo - è fatto. Il suo lavoro è finito. Quindi, come è possibile raccogliere anche la spazzatura nel programma compilato?
Il compilatore funziona in qualche modo con la CPU mentre il programma viene eseguito per eliminare oggetti "spazzatura"? Oppure il compilatore include alcuni garbage collector minimi nell'eseguibile del programma compilato.
Credo che la mia ultima affermazione avrebbe più validità della prima a causa di questo estratto da questa risposta su Stack Overflow :
Uno di questi linguaggi di programmazione è Eiffel. La maggior parte dei compilatori Eiffel generano codice C per motivi di portabilità. Questo codice C viene utilizzato per produrre il codice macchina da un compilatore C standard. Le implementazioni Eiffel forniscono GC (e talvolta anche GC accurati) per questo codice compilato e non è necessario VM. In particolare, il compilatore VisualEiffel ha generato il codice macchina x86 nativo direttamente con il supporto GC completo .
L'ultima affermazione sembra implicare che il compilatore includa un programma nell'eseguibile finale che funge da garbage collector mentre il programma è in esecuzione.
La pagina sul sito Web del linguaggio D sulla garbage collection - che è compilata in modo nativo e ha un garbage collector opzionale - sembra anche suggerire che alcuni programmi in background vengono eseguiti insieme al programma eseguibile originale per implementare la garbage collection.
D è un linguaggio di programmazione di sistemi con supporto per la garbage collection. Di solito non è necessario liberare memoria esplicitamente. Basta allocare secondo necessità e il garbage collector restituirà periodicamente tutta la memoria inutilizzata al pool di memoria disponibile.
Se viene utilizzato il metodo sopra menzionato , come funzionerebbe esattamente? Il compilatore memorizza una copia di alcuni programmi di garbage collection e li incolla in ogni eseguibile che genera?
O sono imperfetto nel mio pensiero? In tal caso, quali metodi vengono utilizzati per implementare la garbage collection per le lingue compilate e come funzionano esattamente?
malloc()
.