Asm.js es un subconjunto de Javascript estándar que es lo suficientemente simple para que los motores de Javascript optimicen código. Ahora Mozilla dice que con nuevas mejoras, es solamente 1.5 veces más lento que el código nativo. ¿Cómo y por qué? Hay que decir que Asm.js usa las características de Javascript estándar que le permiten inferior qué tipo de variable se requiere y así desempeñar estos procesos de optimización que no son posibles con el lenguaje per se. Este subconjunto está diseñado para el tratamiento del lenguaje a bajo nivel y puede ser usado como objetivo en otros compiladores de lenguajes. Por ejemplo, Emscripten compila C/C++ a Asm.js y ha sido usado para portar aplicaciones muy impresionantes de C/C++, las cuales pueden correr en el navegador y que se desempeñan casi a la velocidad de las aplicaciones nativas.
Mozilla dice poder probar que Asm.js podría correr 2x más lento que código nativo en el peor de los casos. Sin embargo, con los cambios introducidos en cómo se maneja la aritmética de punto flotante, se podría mejorar la velocidad para que corriese 1.5x veces más lento que el código nativo.
El problema con Javascript como lenguaje de máquina es que no soporta el rango de tipos de datos que se necesitan para la optimización. Esto es bueno para los programadores humanos, porque ellos simplemente usan una variable numérica y no se preocupan más por las diferencias entre int, int32, float, float32 o float64. JavaScript siempre usa float64, lo cual da la máxima precisión pero no siempre la máxima velocidad.
La mejora más importante que Mozilla ha hecho a su motor (llamado SpiderMonkey) es añadir el tipo numérico float32 a asm.js. Esto permite traducir la aritmética de float32 en un programa en C/C++ directamente a float32 en asm.js. Esto también está apoyado por la optimización float32 introducida en Firefox que beneficia en general a Javascript.
Por supuesto que el enfoque alternativo de hacer que el código corra más rápido en el navegador está siendo desarrollado y promovido por Google en la forma de facilidades nativas clientes, NaCL y Pepper. Por el momento, solamente Google Chrome soporta NaCL, pero Firefox, Chrome y opera soportan asm.js en mayor o menor grado. Aparentemente asm.js se está convirtiendo en una pieza fundamental en la tecnología de los navegadores.
Citando a Alon Zakai, del blog de Mozilla: ” Es un emocionante incremento en el desempeño. E incluso en los números actuales de desempeño (1.5x más lento que el código nativo), no son los límites a los que podemos llegar. Hay margen para mejoras mayores, tanto en emscripten y Javascript”.
Referencias: