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

В Java все находится в форме класса.

Если вы хотите использовать любой объект, тогда у вас есть две фазы:

  1. Объявить
  2. Инициализация

Пример:

  • Объявление: Object a;
  • Инициализация: a=new Object();

То же самое для концепции массива

  • Объявление: Item i[]=new Item[5];
  • Инициализация: i[0]=new Item();

Если вы не дают секцию инициализации, тогда возникает NullpointerException.

98
задан Community 23 May 2017 в 11:53
поделиться

4 ответа

Это сообщение: Рекурсия или Повторение? мог бы помочь.

Короче говоря, оптимизацию последнего вызова трудно сделать в JVM из-за модели обеспечения безопасности и потребности всегда иметь отслеживание стека в наличии. Эти требования могли в теории поддерживаться, но она, вероятно, потребует нового байт-кода (см. неофициальное предложение John Rose).

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

я полагаю, что это могло быть сделано, тем не менее, но это не маленькая задача.

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

74
ответ дан Community 24 November 2019 в 05:17
поделиться

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

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

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

27
ответ дан Tim Cooper 24 November 2019 в 05:17
поделиться

В дополнение к бумаге, связанной в Лямбде Окончательное (из ссылки mmyers отправленный выше), у John Rose от Sun есть еще немного для высказывания об оптимизации последнего вызова.

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

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

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

8
ответ дан Luke Woodward 24 November 2019 в 05:17
поделиться

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

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

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

21
ответ дан 24 November 2019 в 05:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: