Eu tenho um algoritmo de pathfinding recursivo que implementei em JavaScript e gostaria de saber se algum (todos?) Navegadores possivelmente obteriam exceções de estouro de pilha.
91
Eu tenho um algoritmo de pathfinding recursivo que implementei em JavaScript e gostaria de saber se algum (todos?) Navegadores possivelmente obteriam exceções de estouro de pilha.
only
uma otimização. O suporte deve ser parte da especificação da linguagem, não o compilador / interpretador, pois o código escrito em um interpretador / compilador com TCO provavelmente não funcionaria em um interpretador / compilador sem TCO.Respostas:
A especificação ECMAScript 4 iria originalmente adicionar suporte para TCO, mas foi descartada:
Não há mais chamadas finais em JavaScript?
Pelo que eu sei, nenhuma implementação amplamente disponível de JavaScript atualmente faz TCO automático. Isso pode ser útil para você, no entanto:
Otimização de chamada final
Essencialmente, o uso do padrão de acumulador produz o mesmo efeito.
fonte
Não há alegria no momento, mas felizmente chamadas finais adequadas estão programadas para Harmony (ECMAScript versão 6) http://wiki.ecmascript.org/doku.php?id=harmony:proper_tail_calls
fonte
Quase todos os navegadores que você encontrar irão vomitar em "demasiada recursão". Aqui está uma entrada no rastreador de bug V8 que provavelmente será uma leitura interessante.
Se for simples auto-recursão, provavelmente vale a pena o esforço para usar a iteração explícita em vez de esperar pela eliminação da chamada final.
fonte
A otimização da chamada final será suportada no modo estrito ECMAScript 6 no futuro. Verifique http://www.2ality.com/2015/06/tail-call-optimization.html para obter detalhes.
Verifique http://kangax.github.io/compat-table/es6/ para obter suporte de mecanismo atual.
No momento (18-07-2019), os seguintes mecanismos são compatíveis com a otimização da chamada final:
suporte se "recursos experimentais de JavaScript" -flag estiver ativado:
Chrome 54 / Opera 41A versão atual da tabela de compatibilidade não a lista maisfonte
A otimização da chamada Tail agora está disponível em LispyScript, que compila em JavaScript. Você pode ler mais sobre isso aqui .
fonte
Atualmente, nenhuma implementação de JavaScript reconhece recursão de cauda. Mudanças estão sendo feitas no ECMAScript 6 e, como outros já disseram, há um tíquete em aberto no V8 .
Aqui você pode ver o assembler gerado pelo V8 para uma função de recursão final:
Exemplo de como o V8 compila a recursão
Compare isso com a forma como o Clang compilou a mesma função em C
Exemplo de recursão da cauda do compilador C
O V8 retém a chamada recursiva, enquanto o compilador C reconheceu a recursão final e a transformou em um loop.
fonte