Fil-C telah memperkenalkan FUGC ( Fil's Unbelievable Garbage Collector ), sebuah sistem pengurusan memori yang canggih yang bertujuan untuk membawa keselamatan memori automatik kepada pengaturcaraan C . Pengumpul sampah selari serentak ini mewakili usaha kejuruteraan yang signifikan untuk menyelesaikan salah satu masalah C yang paling berterusan: kelemahan keselamatan memori.
Impak Prestasi Menimbulkan Persoalan Tentang Penggunaan
Perbincangan komuniti mendedahkan reaksi bercampur-campur terhadap ciri-ciri prestasi FUGC . Walaupun sesetengah program berjalan pada kelajuan asli, yang lain mengalami kelembapan sehingga 4x. Selongsong prestasi ini telah mencetuskan perdebatan tentang sama ada faedahnya membenarkan kos, terutamanya untuk aplikasi kritikal prestasi di mana C dan C++ secara tradisinya mendominasi.
Walau bagaimanapun, pencipta berhujah bahawa kebanyakan kod C/C++ sebenarnya tidak sensitif prestasi. Banyak program ditulis dalam C bukan untuk kelajuan, tetapi kerana mereka bergantung pada perpustakaan C , memerlukan akses panggilan sistem langsung, atau hanya mewarisi pilihan bahasa daripada pangkalan kod warisan. Untuk kes penggunaan ini, faedah keselamatan memori mungkin mengatasi penalti prestasi.
Ciri-ciri Prestasi FUGC
Kategori Prestasi | Kesan | Kekerapan |
---|---|---|
Kelajuan Asli | Tiada kelembapan | Jarang berlaku |
Kesan Sederhana | Kelembapan 1-4x | Kebanyakan program |
Kesan Tinggi | Kelembapan ~4x | Jarang berlaku |
Ciri-ciri Teknikal Utama
- Selari: Penandaan dan penyapuan berbilang benang
- Serentak: Operasi tanpa sekatan dengan benang mutator
- Semasa beroperasi: Jabat tangan lembut berbanding henti-dunia
- Tindanan kelabu: Tiada halangan pemuatan diperlukan
- Dijkstra: Pelaksanaan halangan simpanan yang mudah
- Tepat: Penjejakan penunjuk yang tepat
- Tidak bergerak: Objek kekal di tempat semasa pengumpulan
Inovasi Teknikal dalam Pengumpulan Serentak
FUGC menggunakan beberapa teknik lanjutan yang membezakannya daripada pengumpul sampah tradisional. Sistem ini menggunakan jabat tangan lembut dan bukannya jeda henti-dunia, membenarkan benang terus berjalan semasa pengumpul beroperasi. Pendekatan ini meminimumkan gangguan, dengan jeda biasanya lebih pendek daripada operasi malloc biasa.
Pendekatan tindak kelabu Dijkstra pengumpul menghapuskan keperluan untuk halangan beban, hanya memerlukan halangan kedai mudah apabila menulis penunjuk. Pilihan reka bentuk ini dengan ketara mengurangkan overhed operasi penunjuk, yang asas kepada pengaturcaraan C .
Nota: Halangan beban adalah pemeriksaan yang berjalan apabila membaca penunjuk dari memori, manakala halangan kedai berjalan apabila menulis penunjuk. Menghapuskan halangan beban mengurangkan impak prestasi pada operasi biasa.
Ciri Keselamatan Memori Melebihi GC Tradisional
FUGC melangkaui pengumpulan sampah biasa dengan menyokong pembebasan memori eksplisit melalui fungsi free() tradisional. Apabila objek dibebaskan, semua akses seterusnya terperangkap serta-merta, dan pengumpul sampah mengubah hala penunjuk keupayaan kepada objek singleton bebas khas. Ini menghalang isu biasa di mana program yang dikumpul sampah membocorkan memori disebabkan oleh penunjuk tergantung yang akan dibebaskan dalam pengurusan memori manual.
Sistem ini juga menyediakan finalizer gaya Java , rujukan lemah, dan peta lemah serupa dengan WeakMap JavaScript . Ciri-ciri ini memberikan pembangun corak pengurusan memori yang biasa sambil mengekalkan jaminan keselamatan.
Jaminan Keselamatan Memori
- Use-after-free: Jaminan perangkap pada akses kepada objek yang telah dibebaskan
- Double-free: Jaminan perangkap pada pembebasan objek yang sudah dibebaskan
- Kebocoran memori: Penuntutan semula automatik bagi objek yang tidak dapat dicapai
- Penunjuk tergantung: Dialihkan kepada objek singleton yang selamat
Ciri-ciri Lanjutan
- Barisan finalizer (gaya Java )
- Rujukan lemah
- Peta lemah (seperti JavaScript WeakMap )
- Sokongan free() eksplisit dengan jaminan keselamatan
Cabaran Pelaksanaan dan Daya Maju Dunia Sebenar
Ahli komuniti telah membangkitkan kebimbangan tentang kerumitan melaksanakan logik safepointing, terutamanya fungsi masuk/keluar untuk fungsi asli yang mungkin menyekat. Sistem mesti menyelaras dengan teliti antara benang pengumpul sampah dan benang aplikasi tanpa memperkenalkan keadaan perlumbaan atau kebuntuan.
99% daripada kod C/C++ yang anda gunakan sekarang tidak sensitif prestasi. Ia ditulis dalam C atau C++ kerana itulah yang asalnya ditulis dan tiada siapa yang repot untuk menulis versi yang lebih baik dalam mana-mana bahasa lain.
Walaupun terdapat cabaran teknikal, FUGC mewakili bukti kewujudan bahawa pengumpulan sampah yang canggih boleh berfungsi dalam bahasa seperti C . Projek ini menunjukkan bahawa keselamatan memori tidak memerlukan meninggalkan kawalan peringkat rendah C , walaupun ia datang dengan kerumitan dan pertukaran prestasi yang mesti dipertimbangkan dengan teliti oleh pembangun untuk kes penggunaan khusus mereka.
Rujukan: Fil's Unbelievable Garbage Collector