Java e JavaScript: qual é a sua Virtual Machine?

Sempre falamos da onipresença da JVM. Ela está em uma quantidade enorme de computadores, em especial servidores, mas tem perdido a batalha no desktop e no mobile. Há uma outra plataforma/linguagem onipresente: o JavaScript, e este sim domina o mobile e o desktop, além de começar a ganhar terreno no servidor, como no Node.js.

Como disse Douglas Crockford há 2 anos no QConSP, o JavaScript foi da linguagem mais odiada para uma das mais amadas em um curtíssimo espaço de tempo.

Você quer rodar JavaScript na JVM?

Entre 2003 e 2005, todos começaram a se animar com as novas possibilidades de rodar outras linguagens na JVM, fossem elas novas como a Beanshell e o Groovy, fossem elas velhas como o JavaScript.

No caso especial do JavaScript, várias implementações surgiram. A Rhino foi a que mais ganhou espaço. Ela inclusive foi inserida no Java SE 6 como sendo a implementação padrão da scripting engine, definida pela JSR 223. Atualmente temos a VM dyn.js, uma iniciativa brasileira. Há ainda a promessa da Nashorn, uma iniciativa da Oracle.

Você quer rodar Java numa VM JavaScript?

A Doppio é uma JVM escrita puramente em JavaScript/CoffeScript. Ela implementa todos os bytecodes do Java e já consegue compilar classes do Java 1.4 com seu próprio compilador, além de aceitar .class de qualquer versão.

Sim! Você pode carregar arquivos .class e executá-los via (quase) qualquer navegador atual, sem necessidade de suporte a applets, sem a necessidade de uma JVM clássica.

Como é um projeto novo, ainda há muito a ser feito, em especial em relação a velocidade. Por enquanto não há um JIT, mas os resultados já são bastante impressionantes rodando na V8.

Virtual Machine dentro de Virtual Machine

Podemos rodar Java em uma JVM escrita em JavaScript. Podemos rodar JavaScript numa JVM escrita em Java. Então podemos fazer o teste: rodar o Rhino no Doppio ou vice-versa.

Abra o console de demonstração da Doppio e verá que a rhino é uma das opções oferecidas. Digite rhino no console. Após algum tempo (o classloading do bootstrap do rhino já demora em uma JVM moderna, imagine na Doppio) experimente alguns comandos JavaScript!

Enter 'help' for full a list of commands. Ctrl-D is EOF.
doppio > rhino
js> var i = 10;
js> print(++i);
11
js>  

Essa brincadeira não é nada nova. Rodar Linux de dentro do Windows, de dentro do Linux, etc… já é possível via virtual machines há muito tempo. Até rodar bytecode Java dentro de uma implementação .NET, uma JVM escrita em .NET, não é mais novidade. O interessante é ver isto acontece com duas plataformas que não imaginávamos. As VMs de JavaScript tem se tornado tão poderosas que a Mozilla está tentando até mesmo interpretar Flash, via o projeto Shumway.

Daria isso espaço a uma forma interessante de rodar Java no browser? De qualquer maneira, mostra o quão forte está o investimento no JavaScript e em suas VMs.

No nosso curso de Arquitetura Java entramos a fundo nos detalhes de algumas Java Virtual Machines e você pode encontrar mais no livro.

7 Comentários

  1. Caio Ribeiro Pereira 02/10/2012 at 10:50 #

    Legal o post!
    Assuntos sobre javascript estão se tornando cada vez maiores na net.

    Agora uma dúvida, no Rhino eu consigo utilizar os mesmos módulos do Node.js? Pois entre Javascript Client-side e Node.js existem alguns módulos que funcionam em ambos os lados, por exemplo: Underscore.js e Moment.js

    E sobre package manager, existe algum para Rhino comparável com o NPM do Node?

  2. Paulo Silveira 02/10/2012 at 10:56 #

    oi Caio

    O Rhino deve ter total compatibilidade com o Underscore e com o Moment.

    Sobre package managers, o Rhino é apenas uma JM e não possui muitas ferramentas em volta dele, infelizmente. Ele está aí no artigo por já ter sido testada dentro da JVM Doppio. Não é a toa que temos novas VMs JS sendo escritas para a JVM, como a dyn.js, mais modernas e que se aproveitam de recursos novos, como o invokedynamic.

  3. Luca Bastos 02/10/2012 at 13:18 #

    Interessante e curioso mas o rhino no Doppio ainda não funciona a contento. Experimentem definir uma variável a = ‘b’ . Aqui não funcionou.

    Mas também quem além do Paulo (e do Luca) iria rodar o rhino em um browser?

  4. Victor Oliveira Nascimento 02/10/2012 at 20:39 #

    Interessante o assunto…

    Só para deixar mais ‘inception’ ainda, alguns MALUCOS criaram uma camada de compatibilidade da V8 com a VM do Erlang (BEAM) e com isso podemos ter o node.js rodando módulos de ERLANG… (inclusive o node já é um bundle que vai junto com o framework).

    http://beamjs.org/

    http://www.infoq.com/presentations/Beamjs-Erlang-Meets-JavaScript

    O resultado é… como posso dizer… autofágico? Sei lá…

  5. Suissa 03/10/2012 at 12:57 #

    Rapaz muito foda isso! Tudo esta rumando para o Javascript de alguma forma. \o/

  6. Paulo Silveira 03/10/2012 at 15:32 #

    @Victor excelente link. Incrivel o que o pessoal tem feito.

    Aliás, vi hoje que tem uma JVM escrita em CLOS também. Bem recente:
    https://github.com/vijaymathew/yuka

  7. Emerson Macedo 04/10/2012 at 15:09 #

    Ótimo artigo Paulo. A linguagem Javascript tem diversas coisas a serem melhoradas, mas não dá pra negar o espaço que ela tem no mercado e iniciativas server side de qualidade são inevitáveis.

    []s

Deixe uma resposta