Оптимизация Tail Call в Java - PullRequest
0 голосов
/ 17 ноября 2018

Начиная с Java 8 , Java не обеспечивает Оптимизация Tail-Call (TCO). Исследовав это, я узнал причину 1006 *, которая:

в классах jdk [...] существует ряд чувствительных к безопасности методов, которые полагаются на подсчет кадров стека между кодом библиотеки jdk и кодом вызова, чтобы выяснить, кто их вызывает.

Однако Scala , основанный на JVM, поддерживает оптимизацию Tail-Call. Scala выполняет оптимизацию хвостовой рекурсии в время компиляции . Почему Java не может использовать тот же подход?

PS: Не уверен, что последняя версия ( Java 11 на данный момент) Java теперь имеет TCO. Было бы здорово, если бы кто-то, кто знает, тоже мог поделиться этим.

Примечание

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

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

Ответы [ 2 ]

0 голосов
/ 15 декабря 2018

Я прочитал очень хороший пост в блоге о том, как достичь хвостовой рекурсии в Java: Сообщение в блоге Knoldus о хвостовой рекурсии Java

Однако код в их блоге не компилируется, поэтому я создал небольшое репо с их кодом, но исправил синтаксис, чтобы он компилировался. Github репо с рабочим кодом

Надеюсь, это кому-нибудь пригодится, идеи, представленные в блоге Knoldus, показались мне очень интересными.

0 голосов
/ 17 ноября 2018

Почему Java не может использовать тот же подход?

Я не могу сказать , какой подход будет использоваться, но он лучше объяснен в Предложение Project Loom :

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

Насколько я слышал, работа над хвостовыми вызовами, как Fibers и Continuations, еще не началась.кажется, в настоящее время более высокий приоритет.

...