O Google divulgou uma nova versão do compilador Dart2js, cujo código JavaScript agora supera em desempenho o código JS escrito à mão, de acordo com o teste de desempenho DeltaBlue, feito para realizar testes de desempenho em linguagens orientadas a objetos.
Apesar de superar em desempenho um código JavaScript manual nunca ter sido 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 em códigos JavaScript.
O gráfico abaixo mostra como o desempenho 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 representa 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 o desempenho.
O Dart é uma linguagem criada pelo Google para o desenvolvimento em larga escala de aplicações web, que podem ser executadas em diversos contextos, como em um navegador com a Dart VM embutida, em um servidor, rodando na Dart VM, embutido em aplicações e compilado para JavaScript em qualquer navegador moderno.
O novo compilador Dart2js foi implementado em Dart e utiliza a técnica de 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.
Além disso, outras novas otimizações são possíveis, pois 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. Por sua vez, o Dart não suporta muitas dessas possibilidades. Quando o compilador Dart2js roda, 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. Ele também pode inserir métodos em alguns casos, porque, ao contrário do JavaScript, o Dart dá menos suporte para maus hábitos de programação.
Com informações de InfoQ