O “wasm”

Na última semana, Brendan Eich, o criador do JavaScript, anunciou o WebAssembly.
O WebAssembly, ou apenas “wasm” é um novo formato binário para a Web.
O Eric Elliot definou muito bem o que é o WebAssembly em 4 simples itens:
- WebAssembly é uma melhoria para o JavaScript
Uma maneira de implementar coisas críticas para performance em wasm e usa-las com JavaScript - WebAssembly é uma nova linguagem
_Código wasm define um AST representado em um formato binário_ - WebAssembly é uma melhoria para os Browsers
Os Browsers entenderão esse formato binário, e na maioria dos casos isso será mais rápido - WebAssembly é uma forma de suportar outras linguagens na plataforma Web
Outras linguagens poderão compilar para wasm e rodar no navegador como binário first-class

Parafraseando o Brendan, wasm é uma nova representação intermediária de código na Web.
Esse novo formato tem como objetivo principal ser performático (mais do que o JavaScript e mais do que o asm.js) e também permitir que outras linguagens compilem para wasm, fazendo com que rodem “nativamente” na Web.
Obviamente uma questão vêm à tona: Mas já não houveram outras iniciativas parecidas como essa antes? Flash? Google Native Client?
Pois é.
O Dr. Axel Rauschmayer listou 3 pontos que diferem a nova abordagem das antigas:
- Não existe uma só empresa por trás dessa iniciativa. Mozilla, Google, Microsoft, entre outros, estão engajados nesse projeto, com o objetivo de tornar a Web mais rápida.
- Existe uma boa interoperabilidade entre o JavaScript e o wasm, diferente de antigas implementações (Lembram que horror integrar Flash com JS?). Usar wasm será tão simples como importar um módulo ES2015/ES6.
- Para rodar o wasm não será necessário um plugin ou um novo browser engine, mas sim apenas a implementação desta nova camada nas engines existentes.

Isso é excelente, pois o interesse aqui não é apenas algo específico para uma aplicação ou para uma empresa, mas sim para a evolução da Web.
Um novo standard baseado em interesses da comunidade de desenvolvimento e com apoio das gigantes da tecnologia parece muito promissor.
O projeto já nasceu aberto e um W3C Community Group já foi criado, portanto, se tu tens interesse em contribuir de alguma maneira, não existem barreiras!

Objetivos

O projeto lista alguns High Level Goals, dentre eles:
- Definir um formato binário que seja eficiente no tamanho e no carregamento que possa ser compilado para ser executado em velocidade nativa, aproveitando recursos de hardware comuns disponíveis em diversas plataformas, incluindo mobile e IoT.
- Especificar e implementar incrementalmente um MVP com as mesmas funcionalidades do asm.js, além de ter um polyfill que traduzirá wasm para JavaScript.

Creio que em pouco tempo já teremos algo disponível para brincarmos :)
Para os mais aventureiros, já existe um protótipo de polyfil no Github onde é possível testar algumas coisas e entender o que teremos em futuro próximo.
Neste protótipo existe uma ferramenta que compila arquivos JavaScript contendo código asm.js para o novo formato WebAssembly.
Basicamente o resultado será algo assim:

7761 736d 2603 0000 0000 0002 0303 0002
0103 0000 0000 0000 0000 0003 0001 0100
8000 8000 8000 0102 6f6e 6500 0074 776f
0001 

WebAssembly Hacker


Sim, wasm é um fomato binário, lembram? (dãh)

É isso pessoal, esse foi um overview bem superficial do que é o WebAssembly.
Recomendo fortemente que leiam os artigos citados abaixo nas referências para um melhor aprofundamento.

Referências:
https://brendaneich.com/2015/06/from-asm-js-to-webassembly
https://github.com/WebAssembly
http://www.2ality.com/2015/06/web-assembly.html
https://medium.com/javascript-scene/what-is-webassembly-the-dawn-of-a-new-era-61256ec5a8f6
http://arstechnica.com/information-technology/2015/06/the-web-is-getting-its-bytecode-webassembly
http://techcrunch.com/2015/06/17/google-microsoft-mozilla-and-others-team-up-to-launch-webassembly-a-new-binary-format-for-the-web/#.jhbnb6:Gfuu