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

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

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

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

5 ответов

Решение

Этот пост: рекурсия или итерация? может помочь.

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

В баге Sun № 4726340, где заканчивается оценка (с 2002 года), также ведутся дополнительные обсуждения:

Я верю, что это все-таки можно сделать, но это не маленькая задача.

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

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

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

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам