javascript - apps - ¿Cuál es la diferencia entre asm.js y WebAssembly?
webassembly apps (3)
He estado leyendo sobre asm.js y WebAssembly recientemente:
http://ejohn.org/blog/asmjs-javascript-compile-target/
https://brendaneich.com/2015/06/from-asm-js-to-webassembly/
Todavía estoy confundido acerca de algunas cosas:
- ¿Se compila el código asm.js 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?
Tomemos Python, por ejemplo, ¿será
- código python compilado a wasm? o
- intérprete de python (Cpython) compilado en wasm e interpretar python?
¿Se compila el código asm.js a tiempo y se ejecuta? Compilado en qué?
Diferentes navegadores compilan el código asm.js de diferentes maneras. A agosto de 2015:
- Firefox compila asm.js al código de la máquina (y almacena en caché el código de la máquina para futuras cargas del mismo asm.js) [ 1 ].
- En Windows 10 como indicador experimental, Edge también realizará una validación y compilación anticipada de asm.js [ 2 ].
- Chrome reconoce especialmente la directiva "use asm" al comienzo de asm.js para analizar y analizar el código con más entusiasmo y ajustar la heurística de compilación.
- Safari no realiza un procesamiento especial de asm.js.
Aparte de que asm.js es texto y wasm (ensamblaje web) es binario, ¿cuáles son las diferencias entre los 2?
asm.js es solo JavaScript y, por lo tanto, debe comportarse exactamente de acuerdo con las especificaciones de JavaScript. Como nuevo estándar, WebAssembly puede arreglar algunos casos de esquina donde 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.
¿Qué significa esto para otros lenguajes de secuencias de comandos que se ejecutan en el navegador? Tomemos Python, por ejemplo, ¿será
- código python compilado a wasm? o
- intérprete de python (Cpython) compilado en wasm e interpretar python?
En 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 ejecuta en código wasm y gestiona manualmente la memoria lineal wasm. Ya ha habido un proyecto experimental para agregar un back-end 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 dinámica de vinculación futura de wasm. Yendo más allá, wasm busca proporcionar tanto la integración de GC como el soporte de compilación JIT, lo que permitiría una integración más eficiente y natural con la plataforma web.
¿Se compila el código asm.js a tiempo y se ejecuta? Compilado en qué?
asm.js es un código JavaScript normal, y el intérprete JS lo compila en bytecode como siempre. Sin embargo, se supone que un intérprete con soporte de asm debe realizar una compilación anticipada y posiblemente generar una representación de código más eficiente debido a la tipificación estática. Ver http://asmjs.org/ para más detalles.
¿Cuáles son las diferencias entre asm y wasm (aparte de texto vs binario)?
Ninguno, por ahora. Se supone que wasm es compatible con versiones anteriores, compilable a asm (que nuevamente es ejecutable como JS normal). Sin embargo, podría extenderse con más funciones en el futuro a medida que crezca el soporte.
¿Qué significa esto para otros lenguajes de secuencias de comandos que se ejecutan en el navegador?
Lo último, más bien, ya que Python todavía necesita ser interpretado. Los lenguajes de script que no necesitan un intérprete, por supuesto, se pueden compilar directamente en (w) asm, dado que hay un compilador (cadena) que lo admite como destino.
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 el node.js one) 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, todos los 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:
- el motor JS puede omitir el paso de análisis
- es mucho más compacto que la fuente original de JS
Ya podemos escribir código para navegadores que no sea JS: EMSCripten puede compilar código c ++ en código JS. Otro transcompilador ya está disponible 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á que cargar un nuevo complemento como DirectX, JavaApplets, Flash o Silverlight porque todo se ejecutará en el entorno limitado de JS.