¿Qué es ASM.js y qué significa para todos?

27

Estoy empezando a escuchar rumores acerca de este proyecto llamado ASM.js . Actualmente su sitio web es terrible y confuso. Esto es lo que sé de mi investigación en la web.

  • Es un subconjunto de JavaScript que puede ser altamente optimizado. Supongo que porque evita las partes más dinámicas del lenguaje.
  • El rendimiento del código compilado en ASM.js se ejecuta a aproximadamente la mitad de la velocidad de C (no es ligero).
  • La intención es que los compiladores hagan su lenguaje de destino ASM.js.
  • Firefox se enviará con la optimización ASM.js incorporada.
  • Los equipos de Mozilla y Unreal portaron el Unreal Engine a la web con él y se ejecuta en una versión de Firefox a velocidades casi nativas.

No parece haber ninguna información concreta en la web sobre lo que realmente es o la utilidad o el propósito final. ¿Es que puedo compilar mis bases de código del lado del servidor y hacer que se ejecute en el navegador a velocidades cercanas a las nativas? ¿Cuáles son las ramificaciones para los desarrolladores?

Ortigas Jarrod
fuente

Respuestas:

21

Ya describiste lo que es . El uso es que es un lenguaje de bajo nivel que funciona en todos los navegadores, es bastante rápido en la mayoría y muy rápido en algunos. Lo que haces de esto es tan abierto como lo que haces con cualquier otro lenguaje de programación.

El caso de uso que Mozilla parece más interesado es el siguiente: ya existen formas de compilar lenguajes con backends LLVM (principalmente C y C ++) a JavaScript, a través de Emscripten. asm.js está muy cerca de lo que Emscripten ya emite, por lo que esto permite que el código de Emscripten (que ya es impresionantemente rápido en los compiladores JavaScript JIT de hoy en día) se vuelva aún más rápido, promoviendo el objetivo de portar bases de código existentes a la web. Nuevamente, para qué exactamente usa esto es su decisión. Portar juegos es un caso de uso (en el que Mozilla aparentemente participa activamente), pero hay innumerables cosas escritas en C y C ++, algunas de las cuales podrían ser útiles para el sitio web de alguien. Algunos que he visto arrojados (más algunos de mi propio diseño), sin garantía con respecto a la viabilidad:

  • Portar algoritmos de propósito general (p. Ej., Zlib, libjpeg, openssl, implementaciones de FFT) para permitir que JavaScript / sitios web hagan más, sin tener que crear un nuevo estándar web y dependiendo de los navegadores individuales para implementarlo.
  • Portar intérpretes, para que otros lenguajes que no sean JavaScript puedan ejecutarse en el navegador, con menos sobrecarga y un mínimo esfuerzo de portabilidad.
  • Usar asm.js como back-end para más compiladores, especialmente aquellos que no se asignan bien a JavaScript y no necesitan la mayoría de sus características y gastos generales. Un ejemplo podría ser un lenguaje diseñado para un trabajo numérico rápido sin asignación de memoria.
  • Usando asm.js para crear un JIT en JavaScript. Puede implementar cualquier lenguaje, por ejemplo, ActionScript .
  • En la misma línea, portar los compiladores JIT existentes para que se ejecuten en el navegador (cf. portar intérpretes, con una sobrecarga efectiva nula sobre JS). Esto probablemente solo sea factible cuando los compiladores JIT se generan automáticamente, como con PyPy.

fuente
2
Aquí hay otra buena explicación: ejohn.org/blog/asmjs-javascript-compile-target
Jarrod Nettles
1
Aquí hay una prueba de concepto para portar un JIT a asm.js. Es un punto de venta único, la mayoría de las plataformas emergentes no son compatibles con JIT.
Tobu
¿Hay alguna explicación de cómo asm.js admite la compilación JIT? Parece que no puedo encontrar ninguna información al respecto. Más interesado en cómo se manejan las implicaciones de seguridad.
Roman Starkov
@romkyns JIT compilación de asm.js a código de máquina por los navegadores, o compilación JIT a asm.js (por un programa de JavaScript)? Para el primero, al menos en Firefox, se reutilizan las instalaciones de generación de código de máquina de los compiladores JS pure-JS. Como asm.js solo puede llamar a JS, realizar operaciones aritméticas y leer / escribir una matriz de montón con comprobaciones de índice en rango, la seguridad es tan buena como la seguridad de la ejecución de JS. Para este último, solo genera el código fuente asm.js y deja que el navegador lo ejecute, y no hay implicaciones de seguridad adicionales más allá de lo que mencioné antes.
(Me refería a esto último) Oh, por supuesto; de alguna manera imaginé compiladores JIT emitiendo código máquina nativo. ¡Gracias por la aclaración!
Roman Starkov
4

Imagine ASM.js como un gran ArrayBuffer binario llamado montón y un conjunto de módulos JavaScript, que comienzan con una directiva de prólogo: "use asm";y realizan operaciones rápidas de bajo nivel en datos binarios sin formato, similares a los lenguajes ensambladores. Esos módulos podrían escribirse a mano o compilarse mejor a partir del código LLVM mediante scripts como Emscripten. Su rendimiento podría incrementarse gracias al motor Mozilla OdinMonkey, pero son compatibles con la mayoría de los intérpretes modernos de ECMAScript.

ASM.js no se limita a juegos, ¡incluso puede ejecutar aplicaciones Qt completas en su navegador, como estas !

niutech
fuente