La respuesta está en manos de Mozilla con una Nighty Build del Firefox que permite ejecutar código compilado en un javascript casi nativo. La cuestión es bastante técnica pero vamos a simplificar la excelente nota de Ars Technica al respecto.
Básicamente todo browser tiene un engine de javascript y este lenguaje es bastante “laxo” en algunas cosas, el problema de esto es que el uso de memoria e instrucciones es bastante errático y el intérprete tiene que hacer mucho trabajo. Trackear errores y memory leaks es bastante complejo en esta forma de programación. Ahora bien ¿y si simplificamos todo?
Por su parte Google quiso imponer Dart para generar un nuevo lenguaje que pudiese instalarse como un plugin en los browsers, pero este enfoque está demasiado usado en casos como Adobe Flash y no todo el mundo quiere integrar el plugin del rival. Con esto en mente los de Mozilla dijeron ¿y si no agregamos nada nuevo y ajustamos javascript?
La idea detrás de asm.js es justamente disminuír el “libertinaje” (más que nada en los tipos de datos) a la hora de programar en javascript y forzar el lenguaje a lo más básico y parecido a C++ que se pueda, de esta manera uno portaría su software a un “binario” de javascript, éste podrá ser debuggeado tranquilamente como cualquier programa de C++ y al estar acotado a un set específico de instrucciones, la velocidad se dispara.
Lo genial de esto es que no hace falta hacerle ningún cambio importante a la arquitectura de los browsers, en tal caso es como agregar soporte a una extensión más de javascript o HTML, hacerlo compatible o simplemente que funcione. Lo genial de esto es que aun si no se usa asm.js cualquier software de javascript seguirá funcionando, sin tanta performance, pero no dejaría de funcionar porque te falte el plugin en cuestión.
Gracias a esto han portado hasta el Unreal Engine 3 como mostramos hace unas semanas, fácil, se compila el código C++ en esta versión reducida de Javascript y el browser puede interpretarlo sin problemas.
Ahora bien, no es perfecto, uno de los mayores inconvenientes es que no es multithread, no se puede aprovechar los varios núcleos de un procesador, es una sola tarea y no puede acceder a memoria compartida entre otros procesos. Tampoco tiene acceso a interrupciones del sistema, por lo que debe adaptarse a lo que el browser le permita en su sandbox.
Lo genial es que aun con estas limitaciones permite ejecutar una aplicación dentro del browser, dentro de una página web y sin tener que instalarla y sin demasiados riesgos por el mismo sandbox del browser. Juegos online son el objetivo claro.
Todavía es algo experimental, cada “ejecutable” de javascript pesa hasta 4 veces más que uno de javascript normal y casi 10 veces más que C++ puro ya compilado, no es que sea lo ideal pero tiene la ventaja de ser portable entre plataformas sin tener que tocar el código, algo así como el ideal de JAVA de los años 90 y de Flash del 2000, pero sin necesidad de plugins.
Veremos con qué se despacha Google en Chrome para abrirle la puerta a la idea o cerrársela con sus caprichos microsoftianos, mientras tanto en IE 10 SI se puede ejecutar este código, aunque sin ventajas de performance todavía.
Si quieren empezar a compilar su código, esta Emscriptem para portar código C y C++ a Javascript.
La nota completa con benchmarks y todo aquí