Eu vi esta citação sobre a pergunta: Qual é uma boa linguagem funcional para construir um serviço da web?
Scala, em particular, não oferece suporte à eliminação de chamadas finais, exceto em funções autorrecursivas, o que limita os tipos de composição que você pode fazer (esta é uma limitação fundamental da JVM).
Isso é verdade? Em caso afirmativo, o que há na JVM que cria essa limitação fundamental?
fonte
A limitação fundamental é simplesmente que a JVM não fornece chamadas finais em seu código de bytes e, conseqüentemente, não há uma maneira direta para uma linguagem construída sobre a JVM fornecer chamadas finais em si. Existem soluções alternativas que podem atingir um efeito semelhante (por exemplo, trampolim), mas elas têm um custo grave de desempenho terrível e ofuscamento do código intermediário gerado, o que torna um depurador inútil.
Portanto, a JVM não pode suportar nenhuma linguagem de programação funcional com qualidade de produção até que a Sun implemente as chamadas finais na própria JVM. Eles vêm discutindo isso há anos, mas duvido que algum dia implementem chamadas finais: será muito difícil porque eles otimizaram prematuramente sua VM antes de implementar essa funcionalidade básica, e o esforço da Sun está fortemente focado em linguagens dinâmicas em vez de linguagens funcionais.
Portanto, há um argumento muito forte de que Scala não é uma linguagem de programação funcional real: essas linguagens consideram as chamadas finais como um recurso essencial desde que Scheme foi introduzido pela primeira vez, há 30 anos.
fonte
Hence there is a very strong argument that Scala is not a real functional programming language
- o argumento é bastante fraco. Claro quetail calls [as] an essential feature
sim, e ótimo se o hardware subjacente (ou máquina virtual) oferecer suporte direto. Mas são detalhes de implementação.Scala 2.7.x suporta otimização de chamada final para auto-recursão (uma função que chama a si mesma) de métodos finais e funções locais.
O Scala 2.8 pode vir com suporte de biblioteca para trampolim também, que é uma técnica para otimizar funções recursivas mutuamente.
Uma boa quantidade de informações sobre o estado da recursão de Scala pode ser encontrada no blog de Rich Dougherty .
fonte
Além do artigo com link em Lambda The Ultimate (do link mmyers postado acima), John Rose da Sun tem algo mais a dizer sobre a otimização de chamada de cauda.
http://blogs.oracle.com/jrose/entry/tail_calls_in_the_vm
Ouvi dizer que algum dia ele pode ser implementado na JVM. O suporte a chamadas tail, entre outras coisas, está sendo analisado na Máquina Da Vinci.
http://openjdk.java.net/projects/mlvm/
fonte
Todas as fontes apontam para a JVM ser incapaz de otimizar no caso de recursão de cauda, mas ao ler o ajuste de desempenho do Java (2003, O'reilly), descobri que o autor afirma que pode alcançar um desempenho de recursão maior implementando recursão de cauda.
Você pode encontrar sua afirmação na página 212 (procure por 'recursão da cauda', deve ser o segundo resultado). O que da?
fonte