Recientemente he estado leyendo sobre asm.js y WebAssembly:
http://ejohn.org/blog/asmjs-javascript-compile-target/
https://brendaneich.com/2015/06/from-asm-js-to-webassembly/
Todavía estoy confundido por algunas cosas:
- ¿El código asm.js se compila a tiempo y se ejecuta? ¿Compilado en qué?
- Aparte de que asm.js es texto y wasm (ensamblaje web) es binario, ¿cuáles son las diferencias entre los 2?
- ¿Qué significa esto para otros lenguajes de secuencias de comandos que se ejecutan en el navegador? Tome Python, por ejemplo, ¿será
- código python compilado en wasm? o
- intérprete de Python (Cpython) compilado en wasm e interpretar Python?
fuente
asm.js es un subconjunto de JS con instrucciones "altamente optimizables". Básicamente, puede declarar el tipo (int, float) y el motor js (en los navegadores pero también en el de node.js) ejecutará las instrucciones más rápido. Tiene beneficios si su aplicación hace muchos cálculos o gráficos si se usa junto con WebGL.
El ensamblaje web es un formato binario para JS, todo JS, no solo asm.js. No es un código de bytes, es una codificación binaria del AST que calcula el analizador. Tiene 2 grandes beneficios:
Ya podemos escribir código para navegadores que no sea JS: EMSCripten puede compilar código C ++ en código JS. Ya hay otros transcompiladores disponibles para compilar su código en JS. Usando asm.js ese código puede ejecutarse más rápido cuando hace matemáticas. Al usar el ensamblaje web, ese código será más compacto y el navegador podrá procesarlo más rápido (porque podrá omitir el análisis). No tendrá un nuevo complemento para cargar como DirectX, JavaApplets, Flash o Silverlight porque todo se ejecutará en el sandbox de JS.
fuente
Los diferentes navegadores compilan el código asm.js de diferentes maneras. A agosto de 2015:
asm.js es solo JavaScript y, por lo tanto, debe comportarse exactamente de acuerdo con la especificación de JavaScript. Como nuevo estándar, WebAssembly puede solucionar algunos casos extremos en los que el comportamiento de JavaScript no es el ideal (desde una perspectiva de rendimiento o compilación) [ 3 ]. En el futuro [ 4 ], WebAssembly podrá agregar características que de otro modo serían difíciles de expresar en JavaScript.
En la v.1, la forma más sencilla de ejecutar Python en un navegador será compilar un intérprete de Python en wasm, como dijiste. Esto significa, por ejemplo, que Python GC se está ejecutando en código wasm y administra manualmente la memoria lineal de wasm. Ya ha habido proyectos experimentales para agregar un backend asm.js a PyPy [ 5 ] (que podría funcionar igual de bien para wasm). Actualmente se encuentra con limitaciones de asm.js que podrían resolverse mediante la función futura de vinculación dinámica de wasm. Yendo más allá, wasm busca proporcionar integración de GC y soporte de compilación JIT, lo que permitiría una integración más eficiente y natural con la plataforma web.
fuente