Спустя два года после оптимизации «делает-jvm-prevent-tail-call-call» , похоже, существует реализация прототипа, и MLVM уже некоторое время указывает эту функцию как «proto 80%».
Нет ли активный интерес со стороны компании Sun / Oracle в поддержку хвостовых вызовов или это просто , что хвостовые вызовы «[...] суждено прийти на втором месте в каждом списке приоритетов особенность [...]» , как указано в JVM Языковой саммит ?
Мне было бы очень интересно, если бы кто-нибудь протестировал сборку MLVM и мог бы поделиться некоторыми впечатлениями о том, насколько хорошо она работает (если вообще).
Обновление: обратите внимание, что некоторые виртуальные машины, такие как Avian, поддерживают правильные хвостовые вызовы без каких-либо проблем.
Ответы:
Диагностика кода Java: повышение производительности кода Java ( alt ) объясняет, почему JVM не поддерживает оптимизацию хвостового вызова.
Затем он дает пример кода Java, который не трансформируется.
Затем он дает тест, который вы можете использовать, чтобы выяснить, делает ли это ваша JIT.
Естественно, поскольку это статья IBM, она включает в себя заглушку:
источник
instanceof
проверку, чтобы увидеть,this
является лиExample
объект объектом (а не его подклассомExample
).Одна из причин, по которой я видел в прошлом отказ от реализации TCO (и это считается трудным) в Java, заключается в том, что модель разрешений в JVM чувствительна к стеку, и поэтому хвостовые вызовы должны обрабатывать аспекты безопасности.
Я считаю, что Клементс и Фелляйзен [1] [2] показали, что это не является препятствием, и я почти уверен, что патч MLVM, упомянутый в вопросе, также имеет дело с этим.
Я понимаю, что это не ответ на ваш вопрос; просто добавляю интересную информацию.
источник
Возможно, вы уже это знаете, но эта функция не так тривиальна, как может показаться, поскольку язык Java фактически предоставляет программисту трассировку стека.
Рассмотрим следующую программу:
Несмотря на то, что это имеет «хвостовой вызов», его нельзя оптимизировать. (Если она будет оптимизирована, она по- прежнему требует бухгалтерии всего вызова стека поскольку семантике программа опирается на него.)
По сути, это означает, что это сложно поддерживать, оставаясь при этом обратно совместимой.
источник
g
в этом случае ... подумайте, например, о полиморфизме и отражении.getStackTrace()
из метода,x()
который показывает исходный код, вызывается из метода,y()
также показывает, чтоx()
была вызвана изy()
? Потому что, если есть некоторая свобода, реальной проблемы нет.Java - наименее функциональный язык, который вы можете себе представить (ну, ладно, возможно, нет !), Но это было бы большим преимуществом для языков JVM, таких как Scala , которые есть.
По моим наблюдениям, превращение JVM в платформу для других языков никогда не было на первом месте в списке приоритетов Sun и, я полагаю, теперь Oracle.
источник