Apakah ada kebutuhan untuk pengumpulan sampah dalam bahasa berbasis stack?

16

Apa perlunya pengumpulan sampah (GC) dalam bahasa berbasis tumpukan? Dalam bahasa seperti Forth atau RPL (pada kalkulator HP ), apakah ada kebutuhan untuk pengumpulan sampah?

Saya akan berpikir, karena keluaran muncul dari tumpukan, bahwa tidak akan ada kebutuhan. Apakah saya melewatkan sesuatu?

Todd Moses
sumber

Jawaban:

14

GC biasanya diterapkan pada memori yang dialokasikan pada heap. Saya tidak terbiasa dengan Forth atau RPL, tetapi jika tidak ada tumpukan, dan semuanya disimpan di tumpukan global, maka tidak ada yang bisa dilakukan GC.

Mike Baranczak
sumber
2
Pola penggunaan memori tipikal dari program Forth yang saya baca di masa-masa awal adalah mereka seperti program perakitan, karena mereka menggunakan alamat data global statis yang telah diatur sebelumnya. Ini berfungsi karena Forth memiliki kemampuan untuk mentransfer data antara tumpukan dan alamat tertentu. Selanjutnya ia memiliki kemampuan untuk menghitung alamat. Dengan demikian akan dimungkinkan untuk membuat perpustakaan pengalokasi berdasarkan konsep heap dan perpustakaan pengalokasi akan memerlukan beberapa cara untuk berurusan dengan ukuran heap yang terbatas. Jika pengguna Keempat melewati jalur ini, mereka bisa ingin dan menerapkan GC.
Pria luar angkasa cardiff
13

Ya kau benar. Tetapi tumpukan berdasarkan hanya bagian dari keseluruhan cerita. Sebagai contoh, Java bytecode interpreter juga berbasis stack (kode yang dikompilasi bekerja - untuk alasan efisiensi - berbeda). Ini memberitahu kita, bahwa bahasa apa pun dapat diubah menjadi bahasa tumpukan.

Yang penting adalah objek di luar tumpukan, mereka yang bisa hidup lebih lama dari eksekusi metode saat ini. Selama bahasanya tidak seperti mallocatau newtidak ada objek seperti itu dan Anda tidak perlu deleteatau tidak GC.

Bahasa yang tidak memiliki alokasi memori dinamis sangat terbatas kegunaannya.

maaartinus
sumber
tidak yakin saya setuju dengan baris terakhir, apakah bytecode java tidak berguna?
jk.
@ jk., bytecode java memiliki alokasi memori dinamis.
Peter Taylor
1
Sebenarnya, ada beberapa bahasa tujuan umum yang berbasis stack. Lihatlah factorcode.org
Yam Marcovic
1
Sebenarnya faktornya adalah sampah yang dikumpulkan
Andrea
1

Pengumpulan sampah diperlukan jika bahasa akan mendukung struktur data dinamis secara inheren. Yang hampir menjadi keharusan jika Anda ingin melakukan apa pun di luar tingkat C. Tanpa itu Anda terjebak dengan hanya struktur data berukuran tetap dan mengelola memori sendiri. Tentu saja itulah yang dilakukan Forth asli, tetapi mungkin bukan sesuatu yang ingin Anda lakukan hari ini kecuali Anda hanya melakukan pengkodean sistem tingkat rendah.

trans
sumber
1

Pengumpulan sampah tidak diperlukan jika bahasa menggunakan alokasi statis alih-alih alokasi tumpukan. Misalnya Fortran 77 dengan opsi -s (penyimpanan statis) mengalokasikan semua memori ketika program dimulai, oleh karena itu tidak ada alokasi memori yang terjadi pada saat runtime untuk dibebaskan. Meskipun membutuhkan disiplin, dimungkinkan untuk menulis program, terutama simulasi untuk menggunakan alokasi memori statis. Alokasi statis menghilangkan kebocoran memori, dan mengarah ke kinerja cache yang hebat karena kompiler dapat menggunakan analisis statis untuk menentukan apa yang akan dimuat ke dalam cache.

Michael Shopsin
sumber