Dois anos após as otimizações de faz-the-jvm-prevent-tail-call-call , parece haver uma implementação de protótipo e o MLVM listou o recurso como "proto 80%" há algum tempo.
Não há interesse ativo da parte da Sun / Oracle em apoiar chamadas finais ou apenas que as chamadas finais estão "[...] fadadas a ficar em segundo lugar em cada lista de prioridade de recursos [...]", conforme mencionado na JVM Language Summit ?
Eu estaria realmente interessado se alguém testou uma compilação de MLVM e pudesse compartilhar algumas impressões de como ela funciona bem (se funcionar).
Atualização: Observe que algumas VMs, como a Avian, oferecem suporte a chamadas de cauda adequadas sem problemas.
Respostas:
Diagnosticando Código Java: Melhorando o Desempenho de Seu Código Java ( alt ) explica por que a JVM não oferece suporte à otimização de chamada final.
Em seguida, dá um exemplo de código Java que não se transforma.
Em seguida, ele fornece um teste que você pode usar para descobrir se seu JIT faz isso.
Naturalmente, como este é um artigo da IBM, inclui um plugue:
fonte
instanceof
verificação para ver sethis
é umExample
objeto (em vez de uma subclasse deExample
).Um motivo que vi no passado para não implementar o TCO (e isso é visto como difícil) em Java é que o modelo de permissão na JVM é sensível à pilha e, portanto, as chamadas finais devem lidar com os aspectos de segurança.
Acredito que Clements e Felleisen [1] [2] demonstraram que isso não é um obstáculo e tenho quase certeza de que o patch MLVM mencionado na pergunta também lida com isso.
Sei que isso não responde à sua pergunta; apenas adicionando informações interessantes.
fonte
Talvez você já saiba disso, mas o recurso não é tão trivial quanto pode parecer, já que a linguagem Java realmente expõe o rastreamento da pilha para o programador.
Considere o seguinte programa:
Mesmo que isso tenha uma "chamada de cauda", pode não ser otimizado. (Se for otimizado, ainda requer a manutenção de toda a pilha de chamadas, uma vez que a semântica do programa depende disso.)
Basicamente, isso significa que é difícil suportar isso enquanto ainda é compatível com versões anteriores.
fonte
g
neste caso ... pense em polimorfismo e reflexão, por exemplo.getStackTrace()
de um métodox()
que o código-fonte mostra ser chamado de um métodoy()
também mostra quex()
foi chamadoy()
? Porque se há alguma liberdade, não há problema real.Java é a linguagem menos funcional que você poderia imaginar (bem, OK, talvez não !), Mas isso seria uma grande vantagem para linguagens JVM, como Scala , que são.
Minhas observações são que tornar a JVM uma plataforma para outras linguagens nunca pareceu estar no topo da lista de prioridades da Sun e, agora, da Oracle, acho.
fonte