I compilatori associano il Garbage Collector all'eseguibile finale?

3

Poiché Garbage Collector è parte dell'implementazione della lingua (non del sistema operativo, ecc.), il compilatore deve collegare il GC all'esecutivo finale? O è come una dipendenza che deve essere già disponibile sul computer di destinazione?

Se si collega il GC, allora dovrei pensare a un Wrapper attorno alla mia applicazione che ogni tanto interrompe l'esecuzione, esegue alcuni clean-up, ripristina lo stato dell'applicazione e lasciarlo continuare l'esecuzione?

Inoltre, penso che alcuni linguaggi come Java abbiano il loro GC incluso nella loro VM. In questo caso sto solo parlando di linguaggi che compilano direttamente il codice macchina e non hanno bisogno di alcuna VM da eseguire.

    
posta 53777A 11.12.2014 - 10:51
fonte

2 risposte

3

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.

    
risposta data 11.12.2014 - 20:06
fonte
5

In D il runtime standard che viene collegato durante la compilazione include l'implementazione del GC.

Il modo in cui il GC esegue l'ispezione dello stato del programma dipende dall'implementazione. C'è un tipo stop-the-world che usa una chiamata di sistema per sospendere tutti i thread del programma e consente al thread GC di ispezionare il programma senza preoccuparsi di altri thread invalidanti l'ispezione (la fase mark, la sweep può funzionare contemporaneamente perché non hai dimostrato l'altro thread accederà alla memoria che stai liberando).

Esistono tuttavia GC concorrenti che possono eseguire l'ispezione mentre il programma è in esecuzione; anche se di solito richiede un po 'di supporto dai thread del programma.

    
risposta data 11.12.2014 - 11:05
fonte

Leggi altre domande sui tag