Charles Nutter, criador do JRuby, recentemente começou a colaborar com o projeto Rhino (uma implementação de JavaScript para a plataforma Java), com o objetivo de torná-lo mais eficiente e mais competitivo em relação ao V8 (o engine open source de JavaScript criado pelo Google e usado no Chrome).
Embora o Rhino seja uma implementação sólida, ainda apresenta desempenho inferior a outros runtimes de JavaScript. Nutter acredita que o Rhino pode recuperar parte do terreno perdido através da utilização do recurso do Invocação Dinâmica do Java SE 7
O InfoQ falou com Nutter sobre seus planos para o projeto e os da equipe do Rhino. Ele planeja utilizar a invocação dinâmica da JVM para integrar diretamente o mecanismo de tratamento de requisições do Rhino com o compilador/otimizador da JVM (ex.: o Hotspot). Isto deve reduzir ou eliminar o tempo de localização de métodos em tempo de execução, bem como o da manipulação de argumentos. Também irá otimizar as chamadas dentro do código JavaScript e as entre JavaScript e Java, através da utilização de inlining. Nutter citou que, como efeito colateral da utilização da invocação dinâmica, a lógica de invocação do Rhino se tornará muito mais simples.
Perguntamos também o quanto seria importante a JVM contar com uma implementação mais rápida de JavaScript, considerando que essa linguagem tem ganhando em importância em várias áreas:
Pessoalmente, acredito que o frisson em volta do JavaScript seja exagerado. É uma boa linguagem para o desenvolvimento para browsers, principalmente por ser suportada por todos os principais browsers – mas não por ser significativamente melhor que os concorrentes. E no lado do servidor, o JavaScript está se tornando popular porque ambientes de execução já atingiram um bom desempenho, além de existirem muitas bibliotecas escritas para o lado cliente que podem ser aplicadas também no lado do servidor.
Contudo, dada a recente popularidade do uso de JavaScript em todas as camadas de aplicações, parece-me natural realizar melhorias na implementação para JVM. Além disso, é um pouco constrangedor que o ambiente de execução mais rápido existente, a JVM, não seja capaz de executar JavaScript tão rapidamente como seus concorrentes. Sinto que é o momento de revertermos este quadro.
Quanto aos desafios apresentados na implementação do Rhino em comparação com a do JRuby, disse:
A implementação do Rhino pode ser mais simples em muitos aspectos, já que não possui certas características mais heterodoxas do Ruby. No entanto, será um desafio interessante, pois seu modelo de objetos baseado em protótipos cria dificuldades para o armazenamento de caches de method tables, diferentemente do que acontece com o Ruby. Técnicas utilizadas no V8 e no projeto DavinciMonkey de John Rose (uma tentativa de realizar invocação dinâmica no Rhino) – como a geração de classes sintéticas na medida que protótipos são modificados – devem tornar mais fácil lidar com a estrutura de tipos mais fluida do Rhino.
Sobre a atual disparidade em desempenho entre a engine V8 e o Rhino, Nutter comentou que as características da JVM no Java 7, como a invocação dinâmica, podem diminuir a diferença. Mas destacou ser fundamental realizar um aprimoramento do desempenho do Rhino. Afirmou que, embora o Rhino seja uma excelente implementação, há técnicas que podem ser usadas para aumentar o desempenho, com ou sem a utilização de novas características da JVM.
Ainda é cedo para avaliar se o Rhino pode competir com ambientes escritos especificamente para a execução de JavaScript, contudo é certo que o Rhino está perto de obter um belo ganho de desempenho.