Articulo de referencia

asm.js

{{cite web|url=https://blog.mozilla.org/luke/2013/03/21/asm-js-in-firefox-nightly/|title=asm.js in Firefox Nightly|access-date=13 Nov 2014|date=21 Mar 2013|website=Luke Wagner's...

asm.js es un subconjunto de JavaScript diseñado para permitir que el software informático escrito en lenguajes como C se ejecute como aplicaciones web , manteniendo características de rendimiento considerablemente mejores que las del JavaScript estándar , que es el lenguaje típico utilizado para este tipo de aplicaciones.

asm.js consiste en un subconjunto estricto de JavaScript, en el que el código escrito en lenguajes de tipado estático con gestión manual de memoria (como C) es traducido por un compilador de código fuente a código fuente como Emscripten (basado en LLVM ). [ 2 ] El rendimiento se mejora limitando las características del lenguaje a aquellas que se prestan a la optimización anticipada y otras mejoras de rendimiento.

El proyecto se inició en Mozilla , y Firefox 22, lanzado en 2013, fue el primer navegador web en incluir optimizaciones específicas para asm.js. [ 3 ] Tras el desarrollo de WebAssembly , Firefox 148, lanzado en 2026, deshabilitó las optimizaciones de asm.js.

Diseño

asm.js permite mejoras significativas en el rendimiento de las aplicaciones web , pero no pretende mejorar el rendimiento del código JavaScript escrito manualmente, ni permite nada más que un rendimiento mejorado.

Se pretende que tenga características de rendimiento más cercanas a las del código nativo que el JavaScript estándar al limitar las características del lenguaje a aquellas que se prestan a la optimización anticipada y otras mejoras de rendimiento. [ 4 ] Al utilizar un subconjunto de JavaScript, asm.js es ampliamente compatible con todos los principales navegadores web , [ 5 ] a diferencia de enfoques alternativos como Google Native Client .

Generación de código

Normalmente, asm.js no se escribe directamente: en su lugar, como lenguaje intermedio, se genera mediante un compilador que toma código fuente en un lenguaje como C++ y genera código asm.js.

Por ejemplo, dado el siguiente código C:

int f ( int i ) { return i + 1 ; }

Emscripten generaría el siguiente código JS:

función f ( i ) { i = i | 0 ; return ( i + 1 ) | 0 ; }

Nótese la adición | 0y la ausencia de especificadores de tipo. En JavaScript, los operadores bit a bit convierten sus operandos a enteros con signo de 32 bits y dan como resultado enteros. Esto significa que un OR bit a bit con cero convierte un valor a un entero (una presentación "conceptual" muy simple de los operadores bit a bit puede no abordar la conversión de tipos en absoluto, pero cada lenguaje de programación define operadores para su propia conveniencia, como hace JavaScript aquí). Al hacer esto para cada parámetro, se garantiza que si la función se llama desde código externo, el valor se convertirá al tipo correcto. Esto también se usa en el valor de retorno, en este caso para asegurar que el resultado de sumar 1 a i será un entero (ya que de lo contrario podría volverse demasiado grande), y para marcar el tipo de retorno de la función. Estas conversiones son necesarias para asm.js, de modo que un compilador optimizador pueda producir código nativo altamente eficiente de antemano. En un compilador optimizador de este tipo, no se realizan conversiones cuando el código asm.js llama a otro código asm.js, ya que los especificadores de tipo requeridos garantizan que los valores ya tendrán el tipo correcto. Además, en lugar de realizar una suma de punto flotante y convertirla a un entero, puede simplemente realizar una operación nativa con enteros. En conjunto, esto genera importantes mejoras de rendimiento.

Aquí hay otro ejemplo para calcular la longitud de una cadena:

size_t strlen ( char * s ) { char * current = s ; while ( * current != 0 ) { ++ current ; } return ( current - s ); }

Esto daría como resultado el siguiente código asm.js:

función strlen ( s ) { s = s | 0 ; var current = 0 ; current = s ; while (( MEM8 [ current >> 0 ] | 0 ) != 0 ) { current = ( current + 1 ) | 0 ; } return ( current - s ) | 0 ; }

En el código generado, la variable MEM8 es en realidad una "vista" byte a byte de un búfer tipado, que sirve como el "montón" del código asm.js.

Actuación

Dado que asm.js se ejecuta en un navegador, el rendimiento depende en gran medida tanto del navegador como del hardware. Las pruebas de rendimiento preliminares de programas C compilados a asm.js suelen ser hasta dos veces más lentos que la compilación nativa con Clang . [ 6 ]

Gran parte de esta mejora de rendimiento con respecto al JavaScript convencional se debe a una consistencia de tipos del 100 % y a la práctica ausencia de recolección de basura (la memoria se gestiona manualmente en un array tipado de gran tamaño). Este modelo más sencillo, sin comportamiento dinámico, sin asignación ni liberación de memoria, y con tan solo un conjunto reducido de operaciones con enteros y coma flotante bien definidas, permite un rendimiento mucho mayor y un gran potencial de optimización .

El benchmark de Mozilla de diciembre de 2013 mostró mejoras significativas: "Firefox con optimizaciones float32 puede ejecutar todos esos benchmarks aproximadamente 1,5 veces más lento que nativo, o mejor". [ 7 ] Mozilla señala que el rendimiento del código compilado de forma nativa no es una medida única, sino un rango, ya que diferentes compiladores nativos (en este caso Clang y GCC ) ofrecen código con un rendimiento distinto. "De hecho, en algunos benchmarks, como Box2D , FASTA y copy, asm.js está tan cerca o más cerca de Clang que Clang de GCC. En un caso, asm.js incluso supera a Clang por un pequeño margen en Box2D". [ 7 ]

Implementaciones

El proyecto Emscripten proporciona herramientas que se pueden usar para compilar bases de código C y C++ (o cualquier otro lenguaje que se pueda convertir a LLVM IR ) en asm.js. [ 2 ]

Todos los navegadores compatibles con ECMAScript 6 deberían poder ejecutar código asm.js, ya que forma parte de dicha especificación. Sin embargo, dado que en esa edición se añadieron funciones para habilitar la compatibilidad total con asm.js Math.fround(), los navegadores más antiguos que carecen de dichas funciones podrían experimentar problemas.

Algunas implementaciones de navegadores están especialmente optimizadas para asm.js:

  • Mozilla Firefox fue el primer navegador web en implementar optimizaciones específicas de asm.js, comenzando con Firefox 22. [ 3 ] OdinMonkey , el compilador asm.js de Mozilla que se utiliza en Firefox, es un componente de IonMonkey , el compilador JIT de SpiderMonkey .
  • Microsoft estaba implementando soporte para asm.js en Chakra , el motor JavaScript utilizado por Microsoft Edge Legacy , realizando validación para producir código JIT altamente optimizado. [ 8 ]
  • Las optimizaciones del motor JavaScript V8 de Google Chrome en Chrome 28 hicieron que las pruebas de rendimiento de asm.js fueran más del doble de rápidas que las versiones anteriores de Chrome, [ 9 ] aunque el V8 de Chrome no utiliza compilación anticipada.

Adopción

La mayoría de las aplicaciones que utilizaban asm.js eran aplicaciones en C o C++ compiladas con herramientas como Emscripten o Mandreel. asm.js se utilizaba principalmente para aplicaciones cuyos códigos fuente nativos existentes podían traducirse automáticamente para su ejecución en navegadores web.

Hasta ahora, se han portado varios lenguajes de programación , marcos de aplicaciones , programas , bibliotecas , juegos , motores de juegos y otro software . [ 10 ] Algunos de ellos se enumeran a continuación.

Lenguajes de programación

marcos de aplicación

  • pepper.js: Puertos de diversas aplicaciones PNaCl (earth, voronoi, bullet, etc.) [ 14 ]
  • Qt : puertos de varias demostraciones de Qt, además de aplicaciones de KDE, como Kate [ 15 ]

Programas y bibliotecas

Motores de juego

Juegos

Emuladores

  • EM-DOSBox: una versión de DOSBox en Emscripten [ 35 ]
  • Start9.io : una plataforma de emulación web dirigida a múltiples arquitecturas de juegos.
  • JSMESS: una adaptación del emulador MESS para muchas consolas de juegos y sistemas informáticos [ 36 ]

Matemáticas

Deprecación

asm.js ha quedado prácticamente obsoleto con la introducción de WebAssembly (wasm), que tiene un formato de código de bytes más rápido de analizar. [ 38 ] Los esfuerzos por extender JavaScript con características de bajo nivel como SIMD.js también se han suspendido desde 2017. [ 39 ]

asm.js sigue siendo útil principalmente como una alternativa para wasm, a través de un programa escrito por la organización WebAssembly que convierte wasm a asm.js. No existe un convertidor dedicado de asm.js a wasm, pero los compiladores de TypeScript a wasm pueden usarse parcialmente. [ 40 ] El emisor de referencia de WebAssembly, Binaryen  , solía contener un asm2wasmmódulo, pero se eliminó después de que Emscripten dejara de usarlo. [ 41 ]

El 20 de mayo de 2026, Mozilla anunció la descontinuación de asm.js: la función está deshabilitada por defecto desde Firefox 148, lanzado en febrero de 2026, y los desarrolladores de Firefox "planean eliminar el código por completo en una versión futura". [ 42 ]

Véase también

Referencias

  1. "asm.js en Firefox Nightly" . Blog de Luke Wagner . 21 de marzo de 2013. Consultado el 13 de noviembre de 2014 .
  2. 1 2 "kripken/emscripten · GitHub" . Github.com . Consultado el 5 de marzo de 2015 .
  3. 1 2 "Notas de la versión Firefox 22.0" . Mozilla . Consultado el 4 de julio de 2013 .
  4. "Asm.js" . Asm.js. Consultado el 5 de marzo de 2015 .
  5. "asm.js — preguntas frecuentes" . Asmjs.org. 26 de julio de 2014. 
  6. "asm.js" . Asm.js. Consultado el 5 de marzo de 2015 .
  7. 1 2 Alon Zakai; Robert Nyman (20 de diciembre de 2013). "La brecha entre el rendimiento de asm.js y el nativo se reduce aún más con las optimizaciones de float32" . Recuperado el 11 de abril de 2014 .
  8. "Llevando Asm.js a Chakra y Microsoft Edge" . Microsoft. 7 de mayo de 2015. Consultado el 7 de mayo de 2015 .
  9. "Chrome 28 Beta: Una web más inmersiva, en todas partes" . Google . Consultado el 6 de julio de 2013 .
  10. "Inicio — Demos — Juegos y motores de juegos" . GitHub .  
  11. "plu" . Themucker.github.io. Archivado del original el 3 de agosto de 2013. Recuperado el 5 de marzo de 2015 .
  12. "repl.it — Python" . Repl.it. Consultado el 5 de marzo de 2015 . 
  13. "repl.it — Ruby" . Repl.it. Consultado el 5 de marzo de 2015 . 
  14. "Ejemplos de pepper.js" . Trypepperjs.appspot.com. Archivado del original el 14 de febrero de 2020. Consultado el 5 de marzo de 2015 .
  15. "emscripten-qt — Demos" . Vps.etotheipiplusone.com. Archivado del original el 13 de febrero de 2015. Consultado el 5 de marzo de 2015 . 
  16. "Acerca de Emscripten" .
  17. "Vim.js — Versión JavaScript de Vim" . Coolwanglu.github.io . Consultado el 5 de marzo de 2015 . 
  18. "Fuentes TrueType en JavaScript" . Archivado del original el 12 de octubre de 2012.
  19. "Port of SQLite to Javascript" . Github.com . Consultado el 5 de marzo de 2015 .
  20. "GnuPG.js" . Manuuels.github.io . Consultado el 5 de marzo de 2015 .
  21. "ctags en el navegador" . Github.com . Consultado el 5 de marzo de 2015 .
  22. "Gnuplot online" . Gnuplot.respawned.com. Archivado del original el 22 de febrero de 2015. Consultado el 5 de marzo de 2015 .
  23. "Un truco para poner GraphViz en la web" . Github.com . Consultado el 5 de marzo de 2015 .
  24. "Portación en JavaScript de ZLib DEFLATE para el navegador" . Github.com . Consultado el 5 de marzo de 2015 .
  25. "Epic Games lanza 'Epic Citadel' en la web" . UnrealEngine.com (Comunicado de prensa). 2 de mayo de 2013. Archivado del original el 30 de noviembre de 2016. Consultado el 24 de octubre de 2014 .
  26. "Unreal Engine 3 adaptado a JavaScript y WebGL, funciona en cualquier navegador moderno" . ExtremeTech . Ziff Davis . Consultado el 5 de marzo de 2015 .
  27. "Sobre el futuro de la publicación web en Unity" . Blogs.unity3d.com. 29 de abril de 2014.
  28. "HTML5" . Clb.demon.fi. Archivado del original el 6 de marzo de 2015. Consultado el 5 de marzo de 2015 .
  29. "Compilación para la Web" . godotengine.org . 10 de noviembre de 2016.
  30. "Código generado por Emscripten" . Kripken.github.io . Consultado el 5 de marzo de 2015 .
  31. "Código generado por Emscripten" . Forandom.github.io . Consultado el 5 de marzo de 2015 .
  32. Aleksander Gurianov. "Dune 2 - Online (versión para navegador)" . Epicpuerto . Consultado el 5 de marzo de 2015 .
  33. "Mozilla Banana Bread Demo" . Developer.mozilla.org . Consultado el 5 de marzo de 2015 .
  34. "Humble Mozilla Bundle impulsa los juegos de navegador con tecnología WebGL" . Ars Technica. 15 de octubre de 2014. Consultado el 15 de octubre de 2014 .
  35. "EM-Dosbox en Github" . GitHub . Consultado el 9 de abril de 2015 .
  36. "Redirección de página" . Jsmess.textfiles.com . Consultado el 5 de marzo de 2015 .
  37. "HTML5 Fractal Playground" . Danielsadvernture.info. Archivado del original el 22 de febrero de 2015. Consultado el 5 de marzo de 2015 .
  38. "Preguntas frecuentes" . WebAssembly .
  39. "Propuesta TC39 para SIMD.js" . Ecma TC39. 23 de junio de 2020.
  40. "WebAssembly/binaryen" . GitHub . WebAssembly. 25 de junio de 2020. AssemblyScript, que compila TypeScript a Binaryen IR; wasm2js, que compila WebAssembly a JS.
  41. "Registro de cambios de Binaryen" . GitHub . v97: Se eliminó asm2wasm, que admitía el backend fastcomp de Emscripten, después de que fastcomp fuera eliminado.(Véase también el PR#3042 ).
  42. Hunt, Ryan (2026-05-20). "Decir adiós a asm.js" . SpiderMonkey JavaScript/WebAssembly Engine . Recuperado el 2026-05-20 .
  • Sitio web oficialEdita esto en Wikidata