Scala поддерживает оптимизацию хвостовой рекурсии?

Вам нужна функция getPropertyType. Смотрите этот пост: Получить список атрибутов объекта в Objective-C

62
задан skaffman 27 November 2011 в 15:27
поделиться

3 ответа

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

Попробуйте следующий фрагмент:

def boom(n: Int): Nothing = if(n<=0) throw new Exception else boom(n-1)
boom(10)

и проверьте трассировку стека. Он покажет только один вызов функциональной стрелы - поэтому скомпилированный байт-код не является рекурсивным.

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

Текущее состояние - proto 80% . Я не думаю, что это будет сделано вовремя для Java 7 ( invokedynamic имеет больший приоритет, и реализация почти завершена), но Java 8 может увидеть это реализованным.

поэтому JIT должен провести некоторый статический анализ кода, чтобы выяснить, не будут ли кадры стека никогда не использоваться.

Текущее состояние - proto 80% . Я не думаю, что это будет сделано вовремя для Java 7 ( invokedynamic имеет больший приоритет, и реализация почти завершена), но Java 8 может увидеть это реализованным.

поэтому JIT должен провести некоторый статический анализ кода, чтобы выяснить, не будут ли кадры стека никогда не использоваться.

Текущее состояние - proto 80% . Я не думаю, что это будет сделано вовремя для Java 7 ( invokedynamic имеет больший приоритет, и реализация почти завершена), но Java 8 может увидеть это реализованным.

68
ответ дан 24 November 2019 в 16:43
поделиться

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

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

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

12
ответ дан 24 November 2019 в 16:43
поделиться

Only in very simple cases where the function is self-recursive.

Proof of tail recursion ability.

It looks like Scala 2.8 might be improving tail-recursion recognition, though.

7
ответ дан 24 November 2019 в 16:43
поделиться
Другие вопросы по тегам:

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