Saya melihat kutipan ini pada pertanyaan: Apa bahasa fungsional yang baik untuk membangun layanan web?
Scala khususnya tidak mendukung eliminasi panggilan ekor kecuali dalam fungsi rekursif sendiri, yang membatasi jenis komposisi yang dapat Anda lakukan (ini adalah batasan mendasar dari JVM).
Apakah ini benar? Jika ya, ada apa dengan JVM yang menciptakan batasan mendasar ini?
sumber
Batasan mendasar adalah bahwa JVM tidak menyediakan panggilan ekor dalam kode byte-nya dan, akibatnya, tidak ada cara langsung untuk bahasa yang dibangun di atas JVM untuk menyediakan panggilan ekor itu sendiri. Ada beberapa solusi yang dapat mencapai efek serupa (misalnya trampolin) tetapi mereka harus membayar mahal untuk kinerja yang buruk dan mengaburkan kode perantara yang dihasilkan yang membuat debugger tidak berguna.
Jadi JVM tidak dapat mendukung bahasa pemrograman fungsional berkualitas produksi apa pun sampai Sun mengimplementasikan tail call di JVM itu sendiri. Mereka telah membahasnya selama bertahun-tahun tetapi saya ragu mereka akan pernah menerapkan panggilan ekor: ini akan sangat sulit karena mereka telah mengoptimalkan VM mereka sebelum waktunya sebelum menerapkan fungsionalitas dasar seperti itu, dan upaya Sun sangat difokuskan pada bahasa dinamis daripada bahasa fungsional.
Oleh karena itu, terdapat argumen yang sangat kuat bahwa Scala bukanlah bahasa pemrograman yang berfungsi nyata: bahasa-bahasa ini telah menganggap panggilan ekor sebagai fitur penting sejak Skema pertama kali diperkenalkan lebih dari 30 tahun yang lalu.
sumber
Hence there is a very strong argument that Scala is not a real functional programming language
- Argumennya sebenarnya cukup lemah. Tentutail calls [as] an essential feature
, dan bagus jika perangkat keras yang mendasarinya (atau mesin virtal) mendukungnya secara langsung. Tapi itu detail implementasi.Scala 2.7.x mendukung pengoptimalan panggilan ekor untuk rekursi mandiri (fungsi memanggil dirinya sendiri) dari metode akhir dan fungsi lokal.
Scala 2.8 mungkin hadir dengan dukungan perpustakaan untuk trampolin juga, yang merupakan teknik untuk mengoptimalkan fungsi yang saling rekursif.
Banyak informasi tentang keadaan rekursi Scala dapat ditemukan di blog Rich Dougherty .
sumber
Selain makalah yang ditautkan di Lambda The Ultimate (dari tautan mmyers yang diposting di atas), John Rose dari Sun memiliki lebih banyak pendapat tentang pengoptimalan panggilan ekor.
http://blogs.oracle.com/jrose/entry/tail_calls_in_the_vm
Saya telah mendengar bahwa itu mungkin diterapkan di JVM suatu hari nanti. Dukungan panggilan ekor antara lain sedang dilihat di Da Vinci Machine.
http://openjdk.java.net/projects/mlvm/
sumber
Semua sumber menunjukkan bahwa JVM tidak dapat dioptimalkan dalam kasus rekursi ekor, tetapi setelah membaca penyetelan kinerja Java (2003, O'reilly) saya menemukan penulis yang mengklaim bahwa ia dapat mencapai kinerja rekursi yang lebih besar dengan menerapkan rekursi ekor.
Anda dapat menemukan klaimnya di halaman 212 (cari 'rekursi ekor', itu harus menjadi hasil kedua). Apa yang memberi?
sumber