Semua komentar berikut didasarkan pada pilihan strategi implementasi standar menggunakan penutupan untuk mewakili nilai fungsi dan urutan evaluasi panggilan-oleh-nilai:
Untuk kalkulus lambda murni, pengumpulan sampah tidak perlu. Ini karena tidak mungkin untuk membentuk siklus di heap: setiap nilai yang baru dialokasikan hanya dapat berisi referensi ke nilai yang sebelumnya dialokasikan, dan grafik memori membentuk DAG - jadi penghitungan referensi cukup untuk mengelola memori.
Sebagian besar implementasi tidak menggunakan penghitungan referensi karena dua alasan.
- Mereka mendukung bentuk tipe pointer (misalnya,
ref
konstruktor tipe dalam ML), dan siklus yang benar dalam tumpukan dapat dibentuk.
- Penghitungan referensi jauh lebih efisien daripada pengumpulan sampah, karena
- itu membutuhkan banyak ruang tambahan untuk menjaga jumlah referensi, dan
- memperbarui hitungan biasanya sia-sia, dan
- pembaruan untuk penghitungan membuat banyak pertikaian penulisan yang membunuh kinerja paralel.
Bahasa yang diketik secara linier dapat menghilangkan jumlah referensi (pada dasarnya karena jumlah adalah 0-1: nilai memiliki referensi tunggal atau mati dan dapat dibebaskan).
Namun, alokasi tumpukan masih tidak cukup. Ini karena dimungkinkan untuk membentuk nilai fungsi yang merujuk ke variabel bebas (yaitu, kita perlu menerapkan penutupan fungsi), jika Anda mengalokasikan hal-hal pada stack, maka nilai langsung dapat disisipkan dengan nilai mati, dan ini akan menyebabkan asimptotik yang salah penggunaan ruang.
Anda bisa mendapatkan asimptotik yang tepat dengan mengganti tumpukan dengan "tumpukan spageti" (yaitu, menerapkan tumpukan sebagai daftar tertaut di tumpukan, sehingga Anda dapat memotong kerangka mati sesuai kebutuhan).
Jika Anda ingin disiplin stack nyata, Anda dapat menggunakan sistem tipe berdasarkan "logika yang dipesan" (dasarnya tipe linear minus pertukaran).