Misalkan Anda memiliki beberapa bahasa pemrograman dengan manajemen memori manual. Fitur apa yang dibutuhkan oleh bahasa ini untuk dapat mengimplementasikan pengumpulan sampah secara tepat sebagai perpustakaan, dan bukan sebagai konstruksi bahasa mendasar?
Maksud saya adalah GC yang tepat di mana hanya pointer ke heap yang dilalui untuk memastikan variabel mana yang hidup atau tidak.
Beberapa pertimbangan tambahan:
- C dan C ++ memiliki pengumpul sampah Boehm, tapi saya tidak menghitung ini karena itu bukan GC yang tepat. Kolektor Boehm mengasumsikan bahwa apa pun di stack yang bisa menjadi pointer, berdasarkan murni pada persyaratan penyelarasan memori, adalah sebuah pointer. Misalnya, bilangan bulat apa pun
k
yang(k % 4) == 0
terlihat pada tingkat bit seperti pointer, karena pointer harus sejajar 4-byte. - murai mengubah kode C yang ada untuk menggunakan pengumpul sampah yang tepat. Kode C yang dihasilkan memiliki banyak stub untuk pengumpulan sampah, yaitu barang untuk mendaftarkan penunjuk tumpukan ke tumpukan dengan kolektor. Saya tidak menghitung ini karena tidak ada yang bisa diharapkan untuk menulis kode seperti itu; ini lebih merupakan target kompilasi untuk bahasa lain.
Saya membayangkan bahwa bahasa seperti itu perlu memiliki:
- Macro atau beberapa bentuk metaprogramming, untuk merangkum semua kode tambahan yang diperlukan untuk melakukan hal-hal seperti mendaftar akar GC.
- Beberapa mekanisme reflektif yang memungkinkan Anda untuk memeriksa struct atau serikat pekerja; Anda perlu menentukan anggota mana yang menjadi petunjuk.
- Beberapa mekanisme reflektif yang memungkinkan Anda memeriksa tata letak bingkai tumpukan. Ini terdengar jauh lebih sulit daripada 2.
Saya harap ini tidak terlalu kabur atau berdasarkan opini tapi saya sudah lama bertanya-tanya tentang hal ini.
Jawaban:
Saya percaya bahwa ini mungkin, atau setidaknya hampir mungkin, dalam bahasa seperti Rust, meskipun mungkin tidak selalu dalam arti yang Anda pikirkan.
Rust sebenarnya memiliki perpustakaan GC , meskipun saya tidak bisa mengatakan seberapa tepatnya itu. Tapi idenya adalah, ada tipe spesifik
Gc<T>
untuk pointer yang dikumpulkan dari sampah untuk nilai tipeT
. Jadi pemrograman yang Anda bicarakan tidak terjadiYang memungkinkan hal ini menjadi tepat adalah sistem kepemilikan Rust: karena pengetikan linear affine, setiap lokasi dalam memori memiliki paling banyak satu penunjuk, kecuali dinyatakan menggunakan
unsafe
blok (yang digunakan untuk mengimplementasikan hal-hal seperti pengumpul Sampah) . Jadi, jika Anda memiliki pointer yang tidak dibungkus dalam suatuGc
jenis, itu akan dibatalkan alokasi segera setelah keluar dari ruang lingkup. Jadi tidak mungkin untuk menganggap sesuatu sebagai penunjuk yang tidak: entah itu dibungkus denganGc
tipe, atau dimiliki sendiri-sendiri dan secara otomatis dialokasikan.Setiap jenis memiliki
drop
metode implisit yang disebut ketika keluar dari ruang lingkup, yang membatalkan hal-hal yang ditunjuknya. Inidrop
metode menyadari apa yang bisa dan tidak pointer, yang juga membantu dengan presisi.Bahasa ini diketik dengan kuat, secara statis, dan kecuali Anda secara spesifik berada di dalam
unsafe
blok, Anda tidak dapat melemparkan benda ke tipe lain, sehingga dapat diketahui secara statis jenis apa yang dimiliki sepotong memori yang diberikan.Ini bukan transformator drop-in yang memungkinkan Anda memperlakukan kode Non-GC saat Sampah dikumpulkan. Programmer secara khusus menentukan nilai apa yang dikumpulkan. Tetapi mengingat itu, saya pikir itu memiliki potensi untuk memenuhi kriteria Anda.
sumber
Saya pikir mungkin untuk mengimplementasikan pengumpul sampah di C ++ tanpa mengubah bahasa itu sendiri. Tetapi untuk menggunakan pengumpul sampah, seseorang harus membatasi programmer dari menggunakan konstruksi bahasa yang arbitrer. Secara khusus, semua permintaan alokasi memori harus dilakukan melalui API alokasi yang diberikan oleh pengumpul sampah, dan semua akses harus dilakukan melalui referensi yang dikelola oleh pengumpul sampah.
sumber