The compiler would analyse the code and insert the destruct methods into the appropriate places in the object code.
La risposta a questo è la stessa della risposta al secondo paragrafo di questa domanda, che rende una dichiarazione molto simile: C ++ delete vs Java GC .
Capire la durata degli oggetti equivale a risolvere il problema di interruzione, quindi, no, il compilatore può non inserire i metodi di destruct nelle posizioni appropriate nel codice oggetto. Questo è particolarmente vero per le lingue con chiusure.
Ma aspetta, il C ++ ha chiusure e niente GC, come funziona? Beh, non è così: puoi mandare in crash il tuo programma (o più precisamente: eseguire un comportamento indefinito) usando le chiusure, esattamente perché il compilatore non riesce a capire le durate delle tue variabili chiuse. L'aliasing è un'altra cosa che rende davvero difficile l'analisi della memoria.
In generale, a meno che la tua lingua sia specificamente progettata (e specificamente limitata ) per tale analisi, è impossibile.
Alcune JVM eseguono Escape Analysis in fase di compilazione per capire se un riferimento uscirà dall'ambito locale o meno, e se non lo fa, l'oggetto può essere allocato nello stack invece di il mucchio. Ma, avete indovinato, EA equivale a risolvere il problema di interruzione.
Azul JVM esegue Escape Detection : alloca gli oggetti nello stack e quando vede un riferimento che sfugge all'ambito locale, si rialloca sull'heap e ricollega tutti i riferimenti esistenti. Questo accade in fase di esecuzione, e quindi non è soggetto al problema di interruzione ... ma stavi parlando di farlo in fase di compilazione, quindi questo non conta.