Mari kita mulai dengan mendalilkan bahwa memori jauh (lusinan, ratusan atau bahkan ribuan waktu) lebih umum daripada semua sumber daya lainnya digabungkan. Setiap variabel tunggal, objek, anggota objek membutuhkan memori yang dialokasikan untuk itu dan dibebaskan nanti. Untuk setiap file yang Anda buka, Anda membuat lusinan hingga jutaan objek untuk menyimpan data yang ditarik dari file. Setiap aliran TCP berjalan bersama dengan sejumlah string byte sementara yang dibuat untuk ditulis ke aliran. Apakah kita ada di halaman yang sama di sini? Besar.
Agar RAII berfungsi (bahkan jika Anda memiliki smart pointer yang sudah jadi untuk setiap use case di bawah matahari), Anda perlu mendapatkan hak kepemilikan . Anda perlu menganalisis siapa yang harus memiliki objek ini atau itu, siapa yang tidak boleh, dan kapan kepemilikan harus ditransfer dari A ke B. Tentu, Anda bisa menggunakan kepemilikan bersama untuk semuanya , tetapi kemudian Anda akan meniru GC melalui pointer pintar. Pada saat itu menjadi lebih mudah dan lebih cepat untuk membangun GC ke dalam bahasa.
Pengumpulan sampah membebaskan Anda dari kekhawatiran ini akan sumber daya yang paling umum digunakan, memori. Tentu, Anda masih perlu membuat keputusan yang sama untuk sumber daya lain, tetapi itu jauh kurang umum (lihat di atas), dan kepemilikan yang rumit (misalnya dibagi) juga kurang umum. Beban mental berkurang secara signifikan.
Sekarang, Anda menyebutkan beberapa kerugian untuk membuat semua nilai sampah dikumpulkan. Namun, mengintegrasikan GC yang aman memori dan tipe nilai dengan RAII ke dalam satu bahasa sangat sulit, jadi mungkin lebih baik untuk memigrasikan trade off ini melalui cara lain?
Hilangnya determinisme ternyata tidak terlalu buruk dalam praktik, karena hanya mempengaruhi seumur hidup objek deterministik . Seperti dijelaskan dalam paragraf berikutnya, sebagian besar sumber daya (selain dari ingatan, yang berlimpah dan dapat didaur ulang dengan agak malas) tidak terikat dengan objek seumur hidup dalam bahasa-bahasa ini. Ada beberapa kasus penggunaan lainnya, tetapi jarang dalam pengalaman saya.
Poin kedua Anda, manajemen sumber daya manual, saat ini ditangani melalui pernyataan yang melakukan pembersihan berbasis ruang lingkup, tetapi tidak memasangkan pembersihan ini dengan waktu hidup objek (karenanya tidak berinteraksi dengan GC dan keamanan memori). Ini using
dalam C #, with
dalam Python, try
-dengan-sumber daya dalam versi Java terbaru.