Діагностування коду Java: Покращення продуктивності коду Java ( alt ) пояснює, чому JVM не підтримує оптимізацію зворотних викликів.
Але хоча добре відомо, як автоматично перетворити хвостову рекурсивну функцію в простий цикл, специфікація Java не вимагає здійснення цього перетворення. Імовірно, одна з причин, що це не є вимогою, полягає в тому, що загалом трансформація не може бути здійснена статично об'єктно-орієнтованою мовою. Натомість перетворення з хвостово-рекурсивної функції на простий цикл має виконуватися динамічно компілятором JIT.
Потім він подає приклад коду Java, який не трансформується.
Отже, як показує приклад у лістингу 3, ми не можемо очікувати, що статичні компілятори виконуватимуть трансформацію рекурсії хвоста в коді Java, зберігаючи при цьому семантику мови. Натомість ми повинні покладатися на динамічну компіляцію JIT. Залежно від JVM, JIT може це робити, а може і не робити.
Потім він дає тест, за допомогою якого можна з’ясувати, чи робить це ваш JIT.
Звичайно, оскільки це папір IBM, він містить штекер:
Я запустив цю програму з декількома Java SDK, і результати були несподіваними. Запуск на Sun's Hotspot JVM для версії 1.3 показує, що Hotspot не виконує перетворення. За замовчуванням параметри стека на моєму комп'ютері вичерпуються менш ніж за секунду. З іншого боку, JVM від IBM для версії 1.3 без проблем мурчить, вказуючи, що вона перетворює код таким чином.