Я видел эту цитату на вопрос: какой хороший функциональный язык для создания веб-службы?
Scala, в частности, не поддерживает исключение хвостовых вызовов, за исключением саморекурсивных функций, что ограничивает виды композиции, которую вы можете выполнять (это фундаментальное ограничение JVM).
Это правда? Если да, то что именно в JVM создает это фундаментальное ограничение?
источник
Основное ограничение заключается просто в том, что JVM не предоставляет хвостовые вызовы в своем байтовом коде, и, следовательно, у языка, построенного на JVM, нет прямого способа предоставить хвостовые вызовы. Существуют обходные пути, которые могут достичь аналогичного эффекта (например, прыжок на батуте), но они обходятся очень дорого за счет ужасной производительности и запутывания сгенерированного промежуточного кода, что делает отладчик бесполезным.
Таким образом, JVM не может поддерживать какие-либо функциональные языки программирования производственного качества, пока Sun не реализует хвостовые вызовы в самой JVM. Они обсуждали это в течение многих лет, но я сомневаюсь, что они когда-либо будут реализовывать хвостовые вызовы: это будет очень сложно, потому что они преждевременно оптимизировали свою виртуальную машину, прежде чем реализовывать такую базовую функциональность, а усилия Sun сильно сосредоточены на динамических языках, а не на функциональных языках.
Следовательно, есть очень веский аргумент в пользу того, что Scala не является настоящим языком функционального программирования: эти языки считали хвостовые вызовы важной функцией с тех пор, как Scheme был впервые представлен более 30 лет назад.
источник
Hence there is a very strong argument that Scala is not a real functional programming language
- аргумент на самом деле довольно слабый. Конечноtail calls [as] an essential feature
, и хорошо, если базовое оборудование (или виртуальная машина) поддерживает его напрямую. Но это детали реализации.Scala 2.7.x поддерживает оптимизацию хвостового вызова для саморекурсии (вызывающей себя функции) конечных методов и локальных функций.
Scala 2.8 также может иметь библиотечную поддержку для трамплина, который представляет собой метод оптимизации взаимно рекурсивных функций.
Много информации о состоянии рекурсии Scala можно найти в блоге Рича Догерти .
источник
В дополнение к статье, приведенной в Lambda The Ultimate (из ссылки mmyers, размещенной выше), Джон Роуз из Sun может еще кое-что сказать об оптимизации хвостовых вызовов.
http://blogs.oracle.com/jrose/entry/tail_calls_in_the_vm
Я слышал, что когда-нибудь это может быть реализовано на JVM. Среди прочего, на Da Vinci Machine рассматривается поддержка хвостовых вызовов.
http://openjdk.java.net/projects/mlvm/
источник
Все источники указывают на то, что JVM не может оптимизировать в случае хвостовой рекурсии, но после прочтения настройки производительности Java (2003, Орейли) я обнаружил, что автор утверждает, что он может достичь большей производительности рекурсии, реализовав хвостовую рекурсию.
Вы можете найти его утверждение на странице 212 (ищите "хвостовая рекурсия", это должен быть второй результат). Что дает?
источник