O Google divulgou nova versão do compilador Dart2js, cujo código JavaScript agora supera em performance o código JS escrito à mão, segundo o teste de performance DeltaBlue, utilizado para realizar testes de performances em linguagens orientadas a objetos.
Embora superar em performance um código JavaScript manual nunca fora o objetivo do projeto Dart2js, as otimizações aplicadas como o inlining de métodos e o pré-cálculo, resultaram em alguns programas Dart mais rápidos que os equivalentes códigos em JavaScript.
O seguinte gráfico mostra como a performance do Dart no benchmark DeltaBlue tem progredido com o tempo:
A linha roxa no gráfico representa o JavaScript gerado pelo Dart2js sendo executado no engine de JavaScript V8 do Google. A linha amarela indica o código JavaScript idiomático equivalente sendo executado no V8. A linha azul na parte de cima representa código Dart sendo executado nativamente na VM do Dart. Quanto maior o número, maior a performance.
O Dart, é uma linguagem criada pelo Google para o desenvolvimento em larga escala de aplicações web, que podem ser executadas em diversos contextos:
- Em um navegador com a Dart VM embutida. Como o projeto Dart ainda não divulgou a versão 1.0, não há navegador disponível atualmente que tenha embutido a Dart VM além do "Dartium" construído para o Chromium, que vem com o Dart SDK.
- Em um servidor, rodando na Dart VM. A biblioteca dart:io, disponível somente em aplicações do lado servidor, oferece APIs para acesso aos arquivos de sistema, gerenciamento de processos e construção de servidores (ex.: servidores HTTP ou servidores websocket). Isto possibilita que o Dart seja utilizado em casos de uso muito semelhantes ao Node.js e habilita o desenvolvimento de ponta a ponta de aplicações no Dart.
- Embutido em aplicações. O Dart VM pode ser embutido em aplicações arbitrárias (C/C++), para suportar scripts de aplicações com Dart.
- Compilado para JavaScript em qualquer navegador moderno. Nenhum navegador em produção hoje suporta Dart, e ainda não está bem claro se outros navegadores além do Chrome irão embutir a Dart VM. Para continuar sendo possível executar código Dart nestes navegadores, o Dart2js transforma programas de Dart para JavaScript.
O novo compilador Dart2js, foi implementado em Dart e usa uma técnica chamada inferência global de tipos, para coletar mais informações sobre os tipos de variáveis e argumentos. Como resultado, o Dart2js pode gerar código JavaScript mais compacto e rápido.O Dart2js, não utiliza a função opcional de anotação de tipos suportada pelo Dart, pois esses tipos não são forçados em tempo de execução. O Dart é executado em modo de verificação, não reportando erros quando as restrições de tipos são invalidadas. Para garantir a correção do código gerado, o compilador ignora a anotação de tipos completamente.
Muitas outras novas otimizações são possíveis, porque o Dart é uma linguagem menos liberal que JavaScript. Por exemplo, em JavaScript é possível adicionar dinamicamente métodos a objetos, substituir métodos, baixar código dinamicamente e usar a função eval e whitestatement, o que reduz muito a quantidade de otimizações que uma máquina virtual JavaScript como a V8 pode realizar.
Já o Dart não suporta muitas dessas possibilidades. Quando o compilador Dart2js executa, ele irá saber exatamente qual código será executado, e pode eliminar código que não está sendo usado na saída, processo chamado de eliminação de código morto. Pode também inserir métodos em alguns casos, porque ao contrário do JavaScript, o Dart dá menos suporte a maus hábitos de programação.
Percebe-se como o time do Dart continua melhorando o desempenho. A linguagem e plataforma continuam sob intenso desenvolvimento e já começam a surgir adoções antecipadas.