Предотвращает ли JVM оптимизацию конечных вызовов?

StackOverflow https://stackoverflow.com/questions/105834

Вопрос

Я видел эту цитату по этому вопросу: Какой хороший функциональный язык используется для создания веб-сервиса?

Scala, в частности, не поддерживает устранение конечных вызовов, за исключением саморекурсивных функций, что ограничивает виды композиции, которые вы можете выполнять (это фундаментальное ограничение JVM).

Это правда?Если да, то что такого есть в JVM, что создает это фундаментальное ограничение?

Это было полезно?

Решение

Этот пост: Рекурсия или Итерация? могло бы помочь.

Короче говоря, оптимизацию конечных вызовов сложно выполнить в JVM из-за модели безопасности и необходимости всегда иметь доступную трассировку стека.Теоретически эти требования могут быть поддержаны, но для этого, вероятно, потребуется новый байт-код (см. Неофициальное предложение Джона Роуза).

Существует также дополнительная дискуссия в Солнечный жук #4726340, на котором заканчивается оценка (начиная с 2002 года):

Я верю, что, тем не менее, это можно было бы сделать, но это непростая задача.

В настоящее время ведется определенная работа в Машина Да Винчи проект.Статус подпроекта с конечным вызовом указан как "proto 80%".;маловероятно, что это попадет в Java 7, но я думаю, что у этого есть очень хорошие шансы в Java 8.

Другие советы

Фундаментальное ограничение заключается просто в том, что JVM не предоставляет хвостовые вызовы в своем байт-коде, и, следовательно, у языка, построенного на JVM, нет прямого способа предоставлять хвостовые вызовы самому.Существуют обходные пути, которые могут добиться аналогичного эффекта (например,прыжки на батуте), но они обходятся серьезной ценой ужасной производительности и запутывания сгенерированного промежуточного кода, что делает отладчик бесполезным.

Таким образом, JVM не может поддерживать какие-либо функциональные языки программирования производственного качества, пока Sun не реализует хвостовые вызовы в самой JVM.Они обсуждали это в течение многих лет, но я сомневаюсь, что они когда-нибудь реализуют хвостовые вызовы:это будет очень сложно, потому что они преждевременно оптимизировали свою виртуальную машину перед внедрением такой базовой функциональности, а усилия Sun сильно сосредоточены на динамических языках, а не на функциональных языках.

Следовательно, существует очень веский аргумент в пользу того, что Scala не является реальным функциональным языком программирования:эти языки рассматривали конечные вызовы как важную функцию с тех пор, как Scheme была впервые представлена более 30 лет назад.

Scala 2.7.x поддерживает оптимизацию конечных вызовов для саморекурсии (функция, вызывающая саму себя) конечных методов и локальных функций.

Scala 2.8 также может поставляться с библиотечной поддержкой trampoline, которая представляет собой метод оптимизации взаимно рекурсивных функций.

Много информации о состоянии рекурсии Scala можно найти в Блог Рича Догерти.

В дополнение к статье, на которую ссылается Lambda The Ultimate (по ссылке mmyers, размещенной выше), Джон Роуз из Sun может сказать еще кое-что об оптимизации конечных вызовов.

http://blogs.oracle.com/jrose/entry/tail_calls_in_the_vm

Я слышал, что когда-нибудь это может быть реализовано в JVM.На компьютере Da Vinci, помимо прочего, рассматривается возможность поддержки хвостовых вызовов.

http://openjdk.java.net/projects/mlvm/

Все источники указывают на то, что JVM не может оптимизировать в случае хвостовой рекурсии, но при чтении Настройка производительности Java (2003, О'Рейли) Я обнаружил, что автор утверждает, что он может добиться большей производительности рекурсии, реализовав хвостовую рекурсию.

Вы можете найти его утверждение на странице 212 (поищите "хвостовую рекурсию", это должен быть второй результат).Что это дает?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top