Setelah menelusuri beberapa jawaban Stack Overflow, jelas bahwa beberapa bahasa yang dikompilasi secara asli memiliki pengumpulan sampah . Tetapi tidak jelas bagi saya bagaimana ini akan bekerja.
Saya mengerti bagaimana pengumpulan sampah dapat bekerja dengan bahasa yang ditafsirkan. Pengumpul sampah hanya akan berjalan bersama penerjemah dan menghapus objek yang tidak terpakai dan tidak terjangkau dari memori program. Mereka berdua berjalan bersama.
Bagaimana cara kerjanya dengan bahasa yang dikompilasi? Pemahaman saya adalah bahwa begitu kompiler telah mengkompilasi kode sumber ke kode target - khususnya kode mesin asli - selesai. Pekerjaannya selesai. Jadi bagaimana bisa program yang dikompilasi menjadi sampah juga dikumpulkan?
Apakah kompiler bekerja dengan CPU dalam beberapa cara sementara program dijalankan untuk menghapus objek "sampah"? Atau apakah kompiler menyertakan beberapa pengumpul sampah minimal dalam program yang dapat dieksekusi.
Saya percaya pernyataan terakhir saya akan memiliki lebih banyak validitas daripada yang pertama karena kutipan dari jawaban ini di Stack Overflow :
Salah satu bahasa pemrograman tersebut adalah Eiffel. Sebagian besar kompiler Eiffel menghasilkan kode C untuk alasan portabilitas. Kode C ini digunakan untuk menghasilkan kode mesin oleh kompiler C standar. Implementasi Eiffel menyediakan GC (dan kadang-kadang bahkan GC akurat) untuk kode yang dikompilasi ini, dan tidak perlu untuk VM. Khususnya, kompiler VisualEiffel menghasilkan kode mesin x86 asli secara langsung dengan dukungan GC penuh .
Pernyataan terakhir tampaknya menyiratkan bahwa kompiler menyertakan beberapa program dalam executable akhir yang bertindak sebagai pengumpul sampah saat program sedang berjalan.
Halaman di situs web bahasa D tentang pengumpulan sampah - yang secara asli dikompilasi dan memiliki pengumpul sampah opsional - juga tampaknya mengisyaratkan bahwa beberapa program latar belakang berjalan berdampingan dengan program yang dapat dieksekusi asli untuk mengimplementasikan pengumpulan sampah.
D adalah bahasa pemrograman sistem dengan dukungan untuk pengumpulan sampah. Biasanya tidak perlu membebaskan memori secara eksplisit. Alokasikan saja sesuai kebutuhan, dan pemulung akan secara berkala mengembalikan semua memori yang tidak digunakan ke kumpulan memori yang tersedia.
Jika metode yang disebutkan di atas adalah digunakan, bagaimana tepatnya itu akan berhasil? Apakah kompiler menyimpan salinan dari beberapa program pengumpulan sampah dan menempelkannya ke setiap executable yang dihasilkannya?
Atau apakah saya cacat dalam pemikiran saya? Jika demikian, metode apa yang digunakan untuk menerapkan pengumpulan sampah untuk bahasa yang dikompilasi dan bagaimana cara kerjanya?
malloc()
.