Mendiagnosis Kode Java: Meningkatkan Kinerja Kode Java Anda ( alt ) menjelaskan mengapa JVM tidak mendukung optimasi tail-call.
Tetapi meskipun telah diketahui dengan baik bagaimana secara otomatis mengubah fungsi tail-recursive menjadi loop sederhana, spesifikasi Java tidak mengharuskan transformasi ini dibuat. Agaknya, salah satu alasan mengapa ini bukan persyaratan adalah, secara umum, transformasi tidak dapat dilakukan secara statis dalam bahasa berorientasi objek. Sebaliknya, transformasi dari fungsi tail-recursive ke simple loop harus dilakukan secara dinamis oleh compiler JIT.
Ini kemudian memberikan contoh kode Java yang tidak akan berubah.
Jadi, seperti contoh pada Listing 3, kita tidak bisa mengharapkan compiler statis untuk melakukan transformasi tail recursion pada kode Java sambil mempertahankan semantik bahasa. Sebaliknya, kita harus mengandalkan kompilasi dinamis oleh JIT. Bergantung pada JVM, JIT mungkin melakukan ini atau tidak.
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:
Saya menjalankan program ini dengan beberapa Java SDK, dan hasilnya mengejutkan. Berjalan di Sun's Hotspot JVM untuk versi 1.3 mengungkapkan bahwa Hotspot tidak melakukan transformasi. Pada pengaturan default, ruang tumpukan habis dalam waktu kurang dari satu detik di komputer saya. Di sisi lain, JVM IBM untuk versi 1.3 berputar tanpa masalah, menunjukkan bahwa itu memang mengubah kode dengan cara ini.