does the compiler has to attach the GC to the final executable? Or is it like a dependency that has to be already available on the target machine?
Dipende dall'implementazione del linguaggio e dalla piattaforma di destinazione.
È possibile che il GC venga collegato all'eseguibile, è anche possibile che il GC sia parte della libreria di runtime, ed è possibile che il GC sia una parte della piattaforma di destinazione.
If it's attaching the GC, then should I think of it as a Wrapper around my application that once in a while stops the execution, does some clean-ups, recovers the state of the application and let it continue the execution?
Il wrapping è necessario solo quando l'applicazione non sa che viene raccolta dai rifiuti. Il collezionista Boehm-Demers-Weiser è un GC per i programmi C e C ++ che non sanno nemmeno di essere GCed. Puoi semplicemente sostituire tutte le chiamate a malloc
/ realloc
con le chiamate a GC_malloc
/ GC_realloc
e rimuovere tutte le chiamate a free
(ad esempio ridefinendole utilizzando una macro) e tutto funzionerà ancora.
Tuttavia, i programmi scritti in una lingua con gestione automatica della memoria sanno già di essere raccolti, non è necessario avvolgerli.
Inoltre, di nuovo, dipende dall'implementazione del GC, indipendentemente dal fatto che debba "fermare il mondo". Alcuni GC devono interrompere l'applicazione per l'intera raccolta. Alcuni hanno solo bisogno di fermarlo per una fase della raccolta. Alcuni sono incrementali, cioè non hanno bisogno di fare tutto il lavoro in una volta, possono fare un po 'di lavoro, quindi lasciare che l'applicazione funzioni un po', fare un po 'di lavoro, far funzionare l'applicazione ...
Alcuni collezionisti sono simultanei, possono essere raccolti mentre l'applicazione è in esecuzione senza alcuna necessità di fermarli del tutto.
Also I think some languages like Java have their own GC included in their VM. In that case I'm only talking about languages that directly compile to the machine code and don't need any VM to execute.
Non esiste una "lingua che si compila direttamente sul codice macchina". Questo dipende dall'implementazione del linguaggio. Le lingue non si compilano, i compilatori lo fanno. Ogni lingua può essere interpretata, ogni lingua può essere compilata per codice macchina o qualsiasi altra lingua.
La specifica del linguaggio Java dice che la memoria è gestita automaticamente. In che modo l'implementazione fa ciò, è completamente in grado di implementare. Oracle javac
compila in bytecode JVM, che gestisce anche la memoria automaticamente, quindi javac
non deve preoccuparsi di GC. GCJ, ad esempio, compila Java in codice nativo e lo collega a un GC basato sul GC Boehm-Demers-Weiser.