GC — būk šiukšlių surinkėjas
Išvalyk visus objektus, kurių šaknys nebepasiekia, kol krūva neprisipildė. Atlaisvinti gyvą reiškia segfault. Žaidimas apie pasiekiamumą.
Tu esi šiukšlių surinkėjas. Išvalyk viską, ko šaknys nebepasiekia.
Kaip žaisti
- Oranžiniai objektai yra šaknys — vietiniai ir globalūs kintamieji. Jie visada gyvi.
- Objektas gyvas, jei gali jį pasiekti sekdamas nuorodomis nuo kurios nors šaknies. Visa kita — šiukšlės.
- Spausk šiukšles, kol nesibaigė laikas. Paspaudęs dar pasiekiamą objektą atlaisvinai gyvą atmintį — segfault, žaidimas baigtas.
Kaip tai veikia
Krūvoje atsiranda objektai su nuorodomis tarpusavyje. Oranžiniai yra šaknys — vietiniai ir globalūs kintamieji — o viskas, ką pasieki sekdamas nuorodomis nuo šaknies, yra gyva. Likusi dalis — šiukšlės, kurias turi išvalyti, kol nesibaigė laikas. Paspaudęs gyvą objektą atlaisvinai atmintį, į kurią kažkas dar rodo: segfault. Nuo 3 bangos mirę objektai rodo vienas į kitą ciklais — būtent tas atvejis, kurio nuorodų skaičiavimas negali atlaisvinti.
Žaidimas apie pasiekiamumo taisyklę, esančią sekančių surinkėjų pagrinde. Tikri surinkėjai dar tvarko kartas, rašymo barjerus ir lygiagretumą.
Dažnai užduodami klausimai
Kaip žaidimas nusprendžia, kas yra šiukšlė?
Pagal pasiekiamumą, skaičiuojamą gyvai: seka nuorodas nuo kiekvienos šaknies ir pažymi, ką randa. Nepažymėta yra šiukšlė. Tai tiksliai mark-and-sweep žymėjimo fazė.
Kodėl mirę objektai rodo vienas į kitą?
Nuo 3 bangos šiukšlės tyčia sujungiamos į ciklus. Nuorodų skaičiavimas jų niekada neatlaisvins, nes kiekvienas išlaiko įeinančią nuorodą; sekantis surinkėjas jų tiesiog niekada nepasiekia.
Kodėl paspausti gyvą objektą mirtina?
Nes atlaisvinti atmintį, į kurią dar rodoma, yra use-after-free — didelės dalies tikrų strigčių ir eksploitų priežastis. Žaidimas tam toks pat negailestingas kaip tavo atminties skirstytuvas.