Dalam bahasa murni seperti Haskell, semua data tidak dapat diubah dan tidak ada struktur data yang dapat diubah dengan cara apa pun. Selain itu, banyak algoritma pada data yang tidak dapat diubah dan pola pemrograman fungsional menghasilkan sampah dalam jumlah besar secara alami (rantai map
pembuatan daftar perantara misalnya).
Strategi dan teknik apa yang digunakan pengumpul sampah dalam menghadapi kemurnian yang tidak akan mereka lakukan sebaliknya? Apa yang bekerja dengan sangat baik dalam GC bahasa tidak murni yang tidak dalam konteks murni? Apa masalah baru lainnya yang diciptakan bahasa murni untuk GC?
Jawaban:
Implementasi ghc saat ini menggunakan strategi yang hanya berfungsi karena bahasanya murni fungsional dan data tidak dapat diubah: karena tidak ada variabel yang dapat diubah untuk merujuk ke apa pun yang lebih baru, objek hanya menyimpan referensi ke objek yang lebih tua, sehingga menjalankan pengumpul sampah generasi ; karena objek yang dirujuk oleh generasi yang lebih tinggi tidak dapat dihapus sampai generasi tersebut adalah GCd, ia mempromosikan objek ke generasi yang lebih tinggi dengan penuh semangat; dan karena tidak ada yang akan mengubah referensi saat GC menyapu mereka, itu dapat berjalan secara paralel.
Ini kertas dengan lebih detail .
sumber
Sebenarnya itu tidak secara umum benar. Bahasa murni menggunakan evaluasi non-ketat (malas) sehingga evaluasi yang berpotensi semua subekspresi ditangguhkan. Ekspresi yang tidak dievaluasi umumnya tumpukan dialokasikan sebagai "thunk". Ketika diperlukan ekspresi dievaluasi dan thunk dimutasi ke dalam nilai yang dihasilkan.
Satu-satunya hal yang dapat saya pikirkan adalah lubang hitam . Saya tidak ingat melihat hal lain yang baru di sisi GC dalam makalah penelitian Haskell.
Hambatan tulis GC. Bahasa yang tidak murni cenderung untuk menulis pointer ke tumpukan lebih banyak sehingga mereka cenderung memiliki hambatan menulis mereka lebih dioptimalkan.
Algoritma GC lainnya seperti mark-region jauh lebih layak dalam konteks bahasa tidak murni karena mereka dapat memiliki tingkat alokasi yang jauh lebih rendah daripada bahasa murni.
Bahasa murni sangat langka sehingga ada jauh lebih sedikit data tentang bagaimana program murni menggunakan memori dan, oleh karena itu, Anda mulai pada posisi yang lebih buruk ketika mencoba menulis GC untuk bahasa murni.
sumber