Supponiamo di avere un linguaggio di programmazione con la gestione manuale della memoria. Quali caratteristiche deve avere questo linguaggio per poter implementare la garbage collection precisa come libreria e non come costrutto linguistico fondamentale?
Per GC preciso intendo uno in cui vengono attraversati solo i puntatori all'heap per accertare quali variabili sono o non sono attive.
Alcune considerazioni aggiuntive:
- C e C ++ hanno il Gare Collector Boehm, ma non lo conto poiché non è un GC preciso. Il raccoglitore Boehm presume che qualsiasi cosa nello stack che potrebbe essere un puntatore, basato esclusivamente sui requisiti di allineamento della memoria, sia un puntatore. Ad esempio, qualsiasi numero intero
k
che(k % 4) == 0
assomigli a un livello di bit come un puntatore, poiché i puntatori devono essere allineati a 4 byte. - magpie trasforma il codice C esistente per utilizzare un preciso garbage collector. Il codice C generato ha molti stub per la garbage collection, vale a dire cose per la registrazione di qualsiasi puntatore dello stack nell'heap con il raccoglitore. Non lo conto perché non ci si può aspettare che nessuno scriva codice in quel modo; è più un obiettivo di compilazione per altre lingue.
Immagino che una tale lingua dovrebbe avere:
- Macro o qualche forma di metaprogrammazione, per incapsulare tutto il codice aggiuntivo necessario per fare cose come il registro delle radici GC.
- Qualche meccanismo riflettente che consente di ispezionare strutture o sindacati; devi determinare quali membri sono puntatori.
- Qualche meccanismo riflettente che ti consente di esaminare il layout della cornice dello stack. Sembra molto più difficile di 2.
Spero che questo non sia troppo vago o basato sull'opinione ma mi sto chiedendo da un po 'di tempo.