Seberapa berbeda pengumpulan sampah dalam bahasa murni?

26

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 mappembuatan 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?

Mendongkrak
sumber
1
Anda mungkin ingin membaca ini wiki.haskell.org/GHC/Memory_Management
Mateusz K.

Jawaban:

13

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 .

Davislor
sumber
4
Promosi yang bersemangat bergantung pada kemalasan — memperbarui pukulan pada generasi lama dapat membuat pointer ke generasi baru, tetapi pukulan hanya pernah dimutasi satu kali, sehingga cukup untuk mempromosikan objek muda dengan bersemangat. Referensi lama-ke-muda lainnya (mis., Dari array yang dapat diubah) dilacak menggunakan "set yang diingat", yang juga digunakan jika promosi yang ingin dilakukan gagal.
Jon Purdy
1

Dalam bahasa murni seperti Haskell, semua data tidak dapat diubah dan tidak ada struktur data yang dapat diubah dengan cara apa pun

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.

Strategi dan teknik apa yang digunakan pengumpul sampah dalam menghadapi kemurnian yang tidak akan mereka lakukan sebaliknya?

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.

Apa yang bekerja dengan sangat baik dalam GC bahasa tidak murni yang tidak dalam konteks murni?

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.

Apa masalah baru lainnya yang diciptakan bahasa murni untuk GC?

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.

Jon Harrop
sumber
"Ketika diperlukan ekspresi dievaluasi dan thunk dimutasi ke dalam nilai yang dihasilkan." Itu detail implementasi internal sejauh menyangkut pengguna Haskell. Tidak ada cara untuk mengamati mutasi, jadi itu bukan mutasi dari sudut pandang pengguna.
Jack
Selain itu, sangat mungkin untuk bahasa murni menjadi ketat - lihat Idris untuk contohnya.
Jack