Saya memiliki algoritma pathfinding rekursif ekor yang telah saya terapkan dalam JavaScript dan ingin tahu apakah ada (semua?) Browser yang mungkin mendapatkan pengecualian stack overflow.
91
Saya memiliki algoritma pathfinding rekursif ekor yang telah saya terapkan dalam JavaScript dan ingin tahu apakah ada (semua?) Browser yang mungkin mendapatkan pengecualian stack overflow.
only
optimasi. Mendukungnya harus menjadi bagian dari spesifikasi bahasa, bukan compiler / interpreter karena kode yang ditulis terhadap satu interpreter / compiler dengan TCO mungkin tidak akan berfungsi pada interpreter / compiler tanpa TCO.Jawaban:
Spesifikasi ECMAScript 4 awalnya akan menambahkan dukungan untuk TCO, tetapi dibatalkan:
Tidak ada lagi tail call di JavaScript?
Sejauh yang saya tahu, tidak ada implementasi JavaScript yang tersedia secara luas saat ini yang melakukan TCO otomatis. Ini mungkin berguna bagi Anda, meskipun:
Optimasi Tail Call
Pada dasarnya, menggunakan pola akumulator menghasilkan efek yang sama.
sumber
Tidak ada kegembiraan untuk saat ini, tapi untungnya panggilan ekor yang tepat dijadwalkan untuk Harmony (ECMAScript versi 6) http://wiki.ecmascript.org/doku.php?id=harmony:proper_tail_calls
sumber
Hampir semua browser yang Anda temui akan muntah "terlalu banyak rekursi". Berikut adalah entri di pelacak bug V8 yang mungkin akan menjadi bacaan yang menarik.
Jika rekursi mandiri sederhana, mungkin upaya untuk menggunakan iterasi eksplisit lebih baik daripada berharap untuk eliminasi tail-call.
sumber
Pengoptimalan tail call akan didukung dalam mode ketat ECMAScript 6 di masa mendatang. Lihat http://www.2ality.com/2015/06/tail-call-optimization.html untuk detailnya.
Periksa http://kangax.github.io/compat-table/es6/ untuk dukungan mesin saat ini.
Saat ini (18-07-2019) mesin berikut mendukung optimalisasi panggilan ekor:
mendukung jika "fitur JavaScript eksperimental" -bendera diaktifkan:
Chrome 54 / Opera 41Versi terbaru dari tabel compat tidak mencantumkannya lagisumber
Pengoptimalan panggilan ekor sekarang tersedia di LispyScript yang dikompilasi ke JavaScript. Anda dapat membaca lebih lanjut di sini .
sumber
Saat ini tidak ada implementasi JavaScript yang mengenali rekursi ekor. Perubahan sedang dilakukan di ECMAScript 6 , dan seperti yang dikatakan orang lain, ada tiket terbuka di V8 .
Di sini Anda dapat melihat assembler yang dihasilkan V8 untuk fungsi rekursi ekor:
Contoh bagaimana V8 mengkompilasi rekursi
Bandingkan itu dengan bagaimana Clang telah menyusun fungsi yang sama di C
Contoh rekursi ekor compiler C.
V8 mempertahankan panggilan rekursif, sedangkan kompiler C telah mengenali rekursi ekor dan mengubahnya menjadi loop.
sumber