У меня есть хвостовой рекурсивный алгоритм поиска пути, который я реализовал в JavaScript, и я хотел бы знать, могут ли какие-либо (все?) Браузеры получить исключения переполнения стека.
91
У меня есть хвостовой рекурсивный алгоритм поиска пути, который я реализовал в JavaScript, и я хотел бы знать, могут ли какие-либо (все?) Браузеры получить исключения переполнения стека.
only
оптимизация. Его поддержка должна быть частью спецификации языка, а не компилятора / интерпретатора, поскольку код, написанный для одного интерпретатора / компилятора с TCO, вероятно, не будет работать с интерпретатором / компилятором без TCO.Ответы:
Спецификация ECMAScript 4 изначально собиралась добавить поддержку TCO, но она была исключена:
Больше никаких хвостовых вызовов в JavaScript?
Насколько мне известно, в настоящее время нет широко распространенных реализаций JavaScript, выполняющих автоматическую TCO. Однако это может быть полезно для вас:
Оптимизация хвостового вызова
По сути, использование модели аккумулятора дает тот же эффект.
источник
На данный момент без радости, но, к счастью, правильные хвостовые вызовы запланированы для Harmony (ECMAScript версии 6) http://wiki.ecmascript.org/doku.php?id=harmony:proper_tail_calls
источник
Практически в каждом браузере, с которым вы сталкиваетесь, "слишком много рекурсии". Вот запись в системе отслеживания ошибок V8, которую, вероятно, будет интересно прочитать.
Если это простая саморекурсия, вероятно, стоит приложить усилия для использования явной итерации, а не надеяться на устранение хвостового вызова.
источник
Оптимизация хвостового вызова будет поддерживаться в строгом режиме ECMAScript 6 в будущем. Проверьте http://www.2ality.com/2015/06/tail-call-optimization.html для деталей.
Проверьте http://kangax.github.io/compat-table/es6/ для получения текущей поддержки движка.
На данный момент (18-07-2019) оптимизацию хвостового вызова поддерживают следующие движки:
поддержка, если включен флаг "экспериментальные функции JavaScript":
Chrome 54 / Opera 41Текущая версия таблицы совместимости больше не отображает ееисточник
Оптимизация хвостового вызова теперь доступна в LispyScript, который компилируется в JavaScript. Вы можете прочитать об этом здесь .
источник
В настоящее время ни одна реализация JavaScript не распознает хвостовую рекурсию. В ECMAScript 6 вносятся изменения , и, как говорили другие, есть открытый билет на V8 .
Здесь вы можете увидеть сгенерированный V8 ассемблер для функции хвостовой рекурсии:
Пример того, как V8 компилирует рекурсию
Сравните это с тем, как Clang скомпилировал ту же функцию на C
Пример хвостовой рекурсии компилятора C
V8 сохраняет рекурсивный вызов, тогда как компилятор C распознал хвостовую рекурсию и превратил ее в цикл.
источник