Apa yang menghentikan ghc dari menerjemahkan Haskell ke dalam bahasa pemrograman concatenative seperti logika kombinasi dan kemudian hanya menggunakan alokasi stack untuk semuanya? Menurut Wikipedia, terjemahan dari lambda kalkulus ke logika kombinasi adalah sepele, dan juga, bahasa pemrograman concatenative hanya dapat mengandalkan tumpukan untuk alokasi memori. Apakah layak untuk melakukan terjemahan ini dan dengan demikian menghilangkan pengumpulan sampah untuk bahasa seperti Haskell dan ocaml? Apakah ada kerugian untuk melakukan ini?
EDIT: pindah ke sini /programming/39440412/why-do-functional-programming-languages-require-garbage-collection
functional-programming
haskell
Nicholas Grasevski
sumber
sumber
Jawaban:
Semua komentar berikut didasarkan pada pilihan strategi implementasi standar menggunakan penutupan untuk mewakili nilai fungsi dan urutan evaluasi panggilan-oleh-nilai:
Untuk kalkulus lambda murni, pengumpulan sampah tidak perlu. Ini karena tidak mungkin untuk membentuk siklus di heap: setiap nilai yang baru dialokasikan hanya dapat berisi referensi ke nilai yang sebelumnya dialokasikan, dan grafik memori membentuk DAG - jadi penghitungan referensi cukup untuk mengelola memori.
Sebagian besar implementasi tidak menggunakan penghitungan referensi karena dua alasan.
ref
konstruktor tipe dalam ML), dan siklus yang benar dalam tumpukan dapat dibentuk.Bahasa yang diketik secara linier dapat menghilangkan jumlah referensi (pada dasarnya karena jumlah adalah 0-1: nilai memiliki referensi tunggal atau mati dan dapat dibebaskan).
Namun, alokasi tumpukan masih tidak cukup. Ini karena dimungkinkan untuk membentuk nilai fungsi yang merujuk ke variabel bebas (yaitu, kita perlu menerapkan penutupan fungsi), jika Anda mengalokasikan hal-hal pada stack, maka nilai langsung dapat disisipkan dengan nilai mati, dan ini akan menyebabkan asimptotik yang salah penggunaan ruang.
Anda bisa mendapatkan asimptotik yang tepat dengan mengganti tumpukan dengan "tumpukan spageti" (yaitu, menerapkan tumpukan sebagai daftar tertaut di tumpukan, sehingga Anda dapat memotong kerangka mati sesuai kebutuhan).
Jika Anda ingin disiplin stack nyata, Anda dapat menggunakan sistem tipe berdasarkan "logika yang dipesan" (dasarnya tipe linear minus pertukaran).
sumber