Обеспечивает ли JVM оптимизацию хвостовых вызовов?
Я видел эту цитату на вопрос: что такое хороший функциональный язык для создания веб-сервиса?
В частности, Scala не поддерживает исключение хвостового вызова, за исключением саморекурсивных функций, что ограничивает виды композиции, которые вы можете сделать (это фундаментальное ограничение JVM).
Это правда? Если да, то что же представляет собой JVM, который создает это фундаментальное ограничение?
- В чем преимущество использования абстрактных classов вместо признаков?
- Каковы некоторые примеры использования символьных литералов в Scala?
- Добавить элемент в список В Scala
- Scala эквивалент Java java.lang.Class Объект
- Что делает `: _ *` (символ подчеркивания двоеточия) в Scala?
- Разница между сокращением и foldLeft / fold в функциональном программировании (в частности, Scala и Scala API)?
- Разница между объектом и classом в Scala
- Самый простой способ получить верхние n элементов Scala Iterable
- SparkSQL: как работать с нулевыми значениями в пользовательской функции?
- Что такое аннотация Scala для оптимизации рекурсивной функции хвоста?
- Переименование имен столбцов DataFrame в Spark Scala
- Scala: слияние карт по ключу
- Создание файла jar из файла Scala
Это сообщение: Рекурсия или Итерация? может помочь.
Короче говоря, оптимизация хвостовых вызовов трудно сделать в JVM из-за модели безопасности и необходимости всегда иметь трассировку стека. Эти требования могут быть теоретически поддержаны, но для этого, вероятно, потребуется новый байт-код (см . Неофициальное предложение Джона Роуза ).
Кроме того, в Sun ошибка # 4726340 , где оценка (с 2002 года) заканчивается:
Я считаю, что это можно сделать, тем не менее, но это не маленькая задача.
В настоящее время в проекте Da Vinci Machine проделана определенная работа. Статус подпроекта хвостового вызова указан как «proto 80%»; он вряд ли превратится в Java 7, но я думаю, что у него очень хорошие шансы на Java 8.
Основным ограничением является просто то, что JVM не предоставляет хвостовые вызовы в своем байтовом коде и, следовательно, нет прямого способа для языка, построенного на JVM, для предоставления самих хвостовых вызовов. Возможны обходные пути, которые могут обеспечить аналогичный эффект (например, батут), но они приходят к серьезной стоимости ужасной производительности и запутыванию созданного промежуточного кода, что делает отладчик бесполезным.
Таким образом, JVM не может поддерживать языки функционального программирования производственного качества, пока Sun не реализует хвостовые вызовы в самом JVM. Они обсуждают это в течение многих лет, но я сомневаюсь, что они когда-либо будут реализовывать хвостовые звонки: это будет очень сложно, потому что они преждевременно оптимизировали свою виртуальную машину до внедрения таких базовых функций, а усилия Sun в основном сосредоточены на динамических языках, а не на функциональных языках.
Следовательно, существует очень сильный аргумент в пользу того, что Scala не является реальным функциональным языком программирования: эти языки рассматривают хвостовые вызовы как важную функцию, поскольку схема была впервые введена более 30 лет назад.
Scala 2.7.x поддерживает оптимизацию хвостового вызова для саморекурсии (функция, вызывающая себя) конечных методов и локальных функций.
Scala 2.8 может также иметь библиотечную поддержку для батута, что является методом оптимизации взаимно-рекурсивных функций.
Много информации о состоянии рекурсии Scala можно найти в блоге Rich Dougherty .
В дополнение к бумаге, связанной с Lambda The Ultimate (из ссылки, приведенной выше), Джон Роуз из Sun еще несколько говорит о оптимизации хвостового вызова.
http://blogs.oracle.com/jrose/entry/tail_calls_in_the_vm
Я слышал, что это может быть реализовано на JVM когда-нибудь. Поддержка Tail call, среди прочего, рассматривается на машине Da Vinci.
Все источники указывают на то, что JVM не может оптимизироваться в случае хвостовой рекурсии, но после чтения настройки производительности Java (2003, O’reilly) я нашел автора, утверждающего, что он может добиться большей производительности рекурсии за счет реализации хвостовой рекурсии.
Вы можете найти его заявку на стр. 212 (поиск «хвостовой рекурсии» должен быть вторым результатом). Что дает?