Akan seperti apa bahasa di mana GC yang tepat diimplementasikan sebagai perpustakaan?


8

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 kyang (k % 4) == 0terlihat 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:

  1. Macro atau beberapa bentuk metaprogramming, untuk merangkum semua kode tambahan yang diperlukan untuk melakukan hal-hal seperti mendaftar akar GC.
  2. Beberapa mekanisme reflektif yang memungkinkan Anda untuk memeriksa struct atau serikat pekerja; Anda perlu menentukan anggota mana yang menjadi petunjuk.
  3. 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.


ide yang menarik / "eksperimen pikiran" tetapi bagian dari aspek kunci dari bahasa sampah yang dikumpulkan adalah bahwa referensi pointer ke memori non-dialokasikan tidak mungkin, sesuatu yang tidak dapat ditegakkan dalam "kebanyakan" (semua?) bahasa yang dikumpulkan non-sampah, dan semua pointer / memori logika / referensi sangat dikelola oleh bahasa. jadi jawaban apa pun harus mempertimbangkan aspek kunci ini. sebenarnya ini mungkin bukan jawaban yang Anda inginkan, tetapi berpikir bahwa menerapkan GC sebagai pustaka belaka pada bahasa non-GC bukanlah skenario yang bisa dibayangkan.
vzn

Jawaban:


1

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 tipe T. Jadi pemrograman yang Anda bicarakan tidak terjadi

Yang 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 unsafeblok (yang digunakan untuk mengimplementasikan hal-hal seperti pengumpul Sampah) . Jadi, jika Anda memiliki pointer yang tidak dibungkus dalam suatu Gcjenis, itu akan dibatalkan alokasi segera setelah keluar dari ruang lingkup. Jadi tidak mungkin untuk menganggap sesuatu sebagai penunjuk yang tidak: entah itu dibungkus dengan Gctipe, atau dimiliki sendiri-sendiri dan secara otomatis dialokasikan.

Setiap jenis memiliki dropmetode implisit yang disebut ketika keluar dari ruang lingkup, yang membatalkan hal-hal yang ditunjuknya. Ini dropmetode 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 unsafeblok, 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.


1

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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.