Dua tahun setelah do -the-jvm-prevent-tail-call-optimizations , tampaknya ada implementasi prototipe dan MLVM telah mendaftarkan fitur tersebut sebagai "proto 80%" untuk beberapa waktu sekarang.
Apakah tidak ada minat aktif dari pihak Sun / Oracle dalam mendukung panggilan ekor atau hanya panggilan ekor yang "[...] ditakdirkan untuk menempati posisi kedua pada setiap daftar prioritas fitur [...]" seperti yang disebutkan di JVM Language Summit ?
Saya akan sangat tertarik jika seseorang telah menguji membangun MLVM dan dapat berbagi beberapa kesan tentang seberapa baik kerjanya (jika ada).
Pembaruan: Perhatikan bahwa beberapa VM seperti Avian mendukung panggilan ekor yang tepat tanpa masalah apa pun.
Jawaban:
Mendiagnosis Kode Java: Meningkatkan Kinerja Kode Java Anda ( alt ) menjelaskan mengapa JVM tidak mendukung optimasi tail-call.
Ini kemudian memberikan contoh kode Java yang tidak akan berubah.
Kemudian ini memberikan tes yang dapat Anda gunakan untuk mengetahui apakah JIT Anda melakukan ini.
Secara alami, karena ini adalah kertas IBM, ini termasuk steker:
sumber
instanceof
centang untuk melihat apakahthis
itu sebuahExample
objek (bukan subkelasExample
).Salah satu alasan yang pernah saya lihat di masa lalu untuk tidak mengimplementasikan TCO (dan dianggap sulit) di Java adalah bahwa model izin di JVM peka terhadap tumpukan dan dengan demikian panggilan ekor harus menangani aspek keamanan.
Saya yakin ini terbukti bukan halangan oleh Clements dan Felleisen [1] [2] dan saya cukup yakin patch MLVM yang disebutkan dalam pertanyaan tersebut juga menangani masalah tersebut.
Saya menyadari ini tidak menjawab pertanyaan Anda; hanya menambahkan informasi menarik.
sumber
Mungkin Anda sudah mengetahui hal ini, tetapi fiturnya tidak sesederhana kedengarannya karena bahasa Java sebenarnya memperlihatkan pelacakan tumpukan kepada pemrogram.
Pertimbangkan program berikut:
Meskipun ini memiliki "panggilan mundur", ini mungkin tidak dioptimalkan. (Jika yang dioptimalkan, masih membutuhkan pembukuan dari seluruh panggilan-tumpukan sejak semantik program bergantung pada itu.)
Pada dasarnya, ini berarti sulit untuk mendukung ini sambil tetap kompatibel ke belakang.
sumber
g
dalam kasus ini ... pikirkan tentang polimorfisme dan refleksi misalnya.getStackTrace()
dari metodex()
yang ditampilkan kode sumbernya dipanggil dari metodey()
juga menunjukkan dari manax()
dipanggily()
? Karena jika ada kebebasan maka tidak ada masalah yang nyata.Java adalah bahasa yang paling tidak berfungsi yang dapat Anda bayangkan (yah, oke, mungkin tidak !) Tetapi ini akan menjadi keuntungan besar untuk bahasa JVM, seperti Scala .
Pengamatan saya adalah bahwa menjadikan JVM sebagai platform untuk bahasa lain sepertinya tidak pernah berada di urutan teratas daftar prioritas untuk Sun dan saya kira, sekarang untuk Oracle.
sumber