Desenvolvimento

23 abr, 2018

GraalVM – Todas as linguagens em um lugar só

Publicidade

No início da semana passada, a Oracle surpreendeu a todos com o anúncio do lançamento oficial da versão 1.0 da sua nova máquina virtual, a GraalVM. O projeto é resultado de muitos anos de estudo e dedicação da empresa e seu resultado não podia ser menos surpreendente, afinal, além de ser um projeto de código aberto disponível no GitHub (coisa que a empresa não costuma fazer), ela é nada menos que uma máquina virtual poliglota, algo realmente inovador.

A GraalVM chega em sua versão 1.0 como uma máquina virtual universal. Isso significa que podemos executar uma série de linguagens diferentes ao mesmo tempo dentro da mesma máquina sem perda de performance.

O anúncio oficial da VM cita vários exemplos bem surpreendentes do que conseguimos realizar. Desde fazer o Node.js acessar funcionalidades do Java; usar o Java para executar métodos em Python; usar o R para criar SVG com dados de outra linguagem, e assim em diante. Isso significa que ela nos dá a possibilidade de escrever códigos como esse:

const express = require('express');
const app = express();
app.listen(3000);
app.get('/', function(req, res) {
  var text = 'Hello World!';
  const BigInteger = Java.type('java.math.BigInteger');
  text += BigInteger.valueOf(2).pow(100).toString(16);
  text += Polyglot.eval('R', 'runif(100)')[0];
  res.send(text);
});

Reparem só como criamos um servidor com o Node utilizando o Express e então, dentro do mapeamento do método get(), criamos uma variável BigInteger usando o tipo java.math.BigInteger do Java e ao final, usamos a função runif() do R. Incrível, não é mesmo? E isso é só o começo (há uma série de outros exemplos que podem ser vistos aqui).

A versão 1.0, apesar de ser nova, já mostra como o projeto está bem maduro. Com ela, conseguimos executar uma série de tecnologias juntas, como:

  1. Linguagens baseadas na JVM, tais como: Java, Scala, Groovy e Kotlin
  2. JavaScript (incluindo o amado Node.js)
  3. LLVM bitcode (criado por programas escritos em C, C++ e Rust)
  4. Versões experimentais do Ruby, R e Python

A imagem a seguir dá uma ideia melhor das possibilidades:

Além da interoperabilidade entre as linguagens, a máquina virtual também oferece ferramentas completas e importantes para analisar o desempenho do código, tais como: profiller, debugger, profiler e heap viewer.

De acordo com o anúncio, o Twitter já é uma das grandes companhias de tecnologia que estão executando o GraalVM em produção para os seus micro serviços baseados em Scala. O texto diz que as otimizações agressivas do compilador da máquina virtual reduzem a alocação de objetos e incrementa de modo geral a velocidade de execução dos processos. O próprio site possui um benchmark mostrando a diferença entre a JVM e a GraalVM para um arquivo de HelloWorld simples para Java:

$ javac HelloWorld.java
$ time java HelloWorld
user 0.070s
$ native-image HelloWorld
$ time ./helloworld
user 0.005s

Há uma apresentação disponível do engenheiro JVM do Twitter falando mais sobre o processo e pode ser vista neste link.

O projeto possui duas versões: a GraalVM Community Edition e a GraalVM Enterprise Edition. A primeira está disponível de modo livre no GitHub e funciona no Linux, enquanto a versão empresarial funciona no Linux ou Mac. Ambas versões podem ser baixadas por aqui.

O projeto é super inovador e promete revolucionar a maneira como desenvolvemos software. Por hora, nos resta experimentar e acompanhar as criações da comunidade e o desenvolvimento por parte da Oracle.

Referências