Tenho lido recentemente sobre asm.js e WebAssembly:
http://ejohn.org/blog/asmjs-javascript-compile-target/
https://brendaneich.com/2015/06/from-asm-js-to-webassembly/
Ainda estou confuso sobre algumas coisas:
- O código asm.js é compilado a tempo e executado? Compilado em quê?
- Além de asm.js ser texto e wasm (web assembly) binário, quais são as diferenças entre os 2?
- O que isso significa para outras linguagens de script em execução no navegador? Pegue o python, por exemplo, vai ser
- código python compilado para wasm? ou
- interpretador python (Cpython) compilado em wasm e interpretar python?
fonte
asm.js é um subconjunto de JS com instruções "altamente otimizáveis". Basicamente, você pode declarar o tipo (int, float) e o mecanismo js (nos navegadores, mas também no node.js) executará as instruções mais rapidamente. Ele tem benefícios se seu aplicativo faz muitos cálculos ou gráficos se usado junto com WebGL.
web assembly é um formato binário para JS, todo JS, não apenas asm.js. Não é um bytecode, é uma codificação binária do AST que o analisador calcula. Tem 2 grandes benefícios:
Já podemos escrever código para navegadores que não sejam JS: EMSCripten pode compilar código c ++ em código JS. Outros transcompiladores já estão disponíveis para compilar seu código em JS. Usando asm.js, esse código pode ser executado mais rapidamente quando faz matemática. Usando o Web assembly esse código será mais compacto e o navegador será capaz de processá-lo mais rápido (porque ele será capaz de pular a análise). Você não terá um novo plugin para carregar como DirectX, JavaApplets, Flash ou Silverlight porque tudo será executado no sandbox JS.
fonte
Navegadores diferentes compilam o código asm.js de maneiras diferentes. Em agosto de 2015:
asm.js é apenas JavaScript e, portanto, deve se comportar exatamente de acordo com as especificações do JavaScript. Como um novo padrão, o WebAssembly é capaz de corrigir alguns casos em que o comportamento do JavaScript não é o ideal (de uma perspectiva de desempenho ou compilação) [ 3 ]. No futuro [ 4 ], WebAssembly será capaz de adicionar recursos que de outra forma seriam difíceis de expressar em JavaScript.
No v.1, a maneira mais simples de executar Python em um navegador será compilar um interpretador Python para o wasm, como você disse. Isso significa, por exemplo, que o Python GC está sendo executado no código wasm e gerenciando manualmente a memória linear do wasm. Já houve um projeto experimental para adicionar um backend asm.js ao PyPy [ 5 ] (que poderia funcionar tão bem para o wasm). Atualmente, ele apresenta limitações do asm.js que poderiam ser resolvidas pelo futuro recurso de vinculação dinâmica do wasm. Indo mais longe, o wasm busca fornecer integração GC e suporte de compilação JIT, ambos permitindo uma integração mais eficiente e natural com a plataforma da web.
fonte