SpiderMonkey es un motor de JavaScript y WebAssembly de código abierto de la Fundación Mozilla . [ 4 ] El motor impulsa el navegador web Firefox y ha utilizado varias generaciones de compiladores de JavaScript justo a tiempo (JIT) , incluidos TraceMonkey, JägerMonkey, IonMonkey y el actual WarpMonkey.
Se trata del primer motor JavaScript , escrito por Brendan Eich en Netscape Communications, y posteriormente publicado como código abierto, actualmente mantenido por la Fundación Mozilla. Su diseño permite su integración en aplicaciones más allá de los navegadores web, con implementaciones que incluyen el sistema de bases de datos MongoDB, Adobe Acrobat y el entorno de escritorio GNOME.
Historia
Eich "escribió JavaScript en diez días" en 1995, [ 5 ] habiendo sido "reclutado por Netscape con la promesa de 'hacer Scheme ' en el navegador". [ 6 ] (La idea de usar Scheme se abandonó cuando "la dirección de ingeniería [decidió] que el lenguaje debía 'parecerse a Java ' " .) [ 6 ] A finales de 1996, Eich, necesitando "pagar [la] considerable deuda técnica " que quedó del primer año, "se quedó en casa durante dos semanas para reescribir Mocha como la base de código que se conoció como SpiderMonkey". [ 5 ] (Mocha era el nombre de trabajo original del lenguaje). [ 6 ] [ 7 ] En 2011, Eich transfirió la gestión del código de SpiderMonkey a Dave Mandelin. [ 5 ]
Versiones
Estándares
SpiderMonkey implementa la especificación ECMA-262 ( ECMAScript ). La especificación ECMA-357 ( ECMAScript para XML (E4X)) se abandonó a principios de 2013. [ 24 ]
Interiores
SpiderMonkey está escrito en C / C++ y contiene un intérprete , el compilador JIT WarpMonkey y un recolector de basura .
TraceMonkey
TraceMonkey [ 17 ] fue el primer compilador JIT escrito para el lenguaje JavaScript. Inicialmente introducido como una opción en una versión beta y presentado en el blog de Brendan Eich el 23 de agosto de 2008, [ 25 ] el compilador pasó a formar parte de la versión principal como parte de SpiderMonkey en Firefox 3.5 , proporcionando "mejoras de rendimiento que van entre 20 y 40 veces más rápido" que el intérprete base en Firefox 3. [ 26 ]
En lugar de compilar funciones completas, TraceMonkey era un compilador JIT de rastreo , que opera registrando el flujo de control y los tipos de datos durante la ejecución del intérprete. Estos datos luego servían de base para la construcción de árboles de rastreo , rutas altamente especializadas del código nativo .
Las mejoras en JägerMonkey acabaron dejando obsoleto a TraceMonkey, especialmente con el desarrollo del motor de inferencia de tipos SpiderMonkey . TraceMonkey no está presente en SpiderMonkey desde Firefox 11 en adelante. [ 27 ]
JägerMonkey
JägerMonkey, conocido internamente como MethodJIT, era un compilador JIT de método completo diseñado para mejorar el rendimiento en casos donde TraceMonkey no podía generar código nativo estable . [ 28 ] [ 29 ] Se lanzó por primera vez en Firefox 4 y finalmente reemplazó por completo a TraceMonkey. A su vez, fue reemplazado por IonMonkey.
JägerMonkey funcionaba de forma muy diferente a otros compiladores de su clase: mientras que los compiladores típicos construían y optimizaban un grafo de flujo de control que representaba la función, JägerMonkey, en cambio, iteraba linealmente hacia adelante a través del bytecode de SpiderMonkey , la representación interna de la función. Si bien esto impide las optimizaciones que requieren la reordenación de instrucciones, la compilación con JägerMonkey tiene la ventaja de ser muy rápida, lo cual es útil para JavaScript, ya que la recompilación debido a cambios en los tipos de variables es frecuente.
Mozilla implementó una serie de optimizaciones críticas en JägerMonkey, entre las que destacan las cachés en línea polimórficas y la inferencia de tipos . [ 30 ]
La diferencia entre las técnicas JIT de TraceMonkey y JägerMonkey, así como la necesidad de ambas, se explicaron en un artículo de hacks.mozilla.org . Chris Leary, uno de los desarrolladores de SpiderMonkey, ofreció una explicación más detallada de los aspectos técnicos en una entrada de blog ( enlace obsoleto archivado el 9 de diciembre de 2012 en archive.today ). Se puede encontrar más información técnica en los blogs de otros desarrolladores: dvander y dmandelin .
IonMonkey
IonMonkey era un compilador JIT de JavaScript de Mozilla, que tenía como objetivo permitir muchas optimizaciones nuevas que eran imposibles con la arquitectura anterior de JägerMonkey. [ 31 ]
IonMonkey era un compilador más tradicional: traducía el código de bytes de SpiderMonkey a un grafo de flujo de control , utilizando la forma de asignación única estática (SSA) para la representación intermedia . Esta arquitectura permitió utilizar optimizaciones bien conocidas de otros lenguajes de programación para JavaScript, incluyendo la especialización de tipos, la inserción de funciones en línea, la asignación de registros de exploración lineal , la eliminación de código muerto y el movimiento de código invariante en bucles . [ 32 ]
El compilador puede generar traducciones rápidas de código nativo de funciones JavaScript en las plataformas ARM , x86 y x86-64 . Ha sido el motor predeterminado desde Firefox 18. [ 19 ]
OdinMonkey
OdinMonkey es el nombre del nuevo módulo de optimización de Mozilla para asm.js , un subconjunto de JavaScript de fácil compilación. OdinMonkey no es un compilador JIT, sino que utiliza el compilador JIT actual. Está incluido en Firefox desde la versión 22. [ 33 ] OdinMonkey está deshabilitado por defecto desde Firefox 148, lanzado en febrero de 2026. [ 34 ]
WarpMonkey
El JIT de WarpMonkey reemplaza al antiguo motor IonMonkey de la versión 83. [ 22 ] Es capaz de insertar otros scripts y especializar el código según los datos y argumentos que se procesan. Traduce el bytecode y los datos de la caché en línea a una representación intermedia de nivel medio (Ion MIR). Este gráfico se transforma y optimiza antes de ser reducido a una representación intermedia de bajo nivel (Ion LIR). Esta LIR realiza la asignación de registros y luego genera código máquina nativo en un proceso llamado Generación de Código. Las optimizaciones aquí asumen que un script continúa viendo datos similares a los que ha visto antes. Los JIT de Baseline son esenciales para el éxito aquí porque generan IC que coinciden con los datos observados. Si después de compilar un script con Warp, encuentra datos que no está preparado para manejar, realiza un rescate. El mecanismo de rescate reconstruye el marco de pila de la máquina nativa para que coincida con el diseño utilizado por el intérprete de Baseline y luego se ramifica a ese intérprete como si lo estuviéramos ejecutando todo el tiempo. La construcción de este marco de pila puede utilizar una tabla lateral especial guardada por Warp para reconstruir valores que de otro modo no estarían disponibles. [ 35 ]
Usar
SpiderMonkey está diseñado para integrarse en otras aplicaciones que proporcionan entornos anfitriones para JavaScript. A continuación, se presenta una lista incompleta:
- Mozilla Firefox , Thunderbird , SeaMonkey y otras aplicaciones que utilizan el marco de aplicaciones de Mozilla.
- Variantes de Firefox, incluyendo los navegadores web Pale Moon , Basilisk y Waterfox .
- Aplicaciones de almacenamiento de datos:
- MongoDB pasó de V8 a SpiderMonkey en la versión 3.2 [ 36 ]
- Riak utiliza SpiderMonkey como entorno de ejecución para operaciones JavaScript MapReduce [ 37 ].
- Sistema de base de datos CouchDB (escrito en Erlang ). JavaScript se utiliza para definir mapas, filtros, funciones de reducción y para visualizar datos, por ejemplo, en formato HTML.
- Adobe Acrobat y Adobe Reader, Adobe Flash Professional y Adobe Dreamweaver . Adobe Acrobat DC utiliza Spidermonkey 24.2 con soporte ECMA-357 adaptado. [ 38 ]
- Entorno de escritorio GNOME , versión 3 y posteriores
- Entorno de escritorio Cinnamon , versión 1.0 y posteriores
- Yahoo! Widgets , anteriormente llamado Konfabulator
- FreeSWITCH , un motor de telefonía de código abierto, utiliza SpiderMonkey para permitir a los usuarios escribir scripts de gestión de llamadas en JavaScript.
- PythonMonkey utiliza SpiderMonkey para permitir a los usuarios escribir programas donde las funciones, tipos y eventos de JavaScript y Python interactúan y (cuando es posible) comparten almacenamiento de memoria. [ 39 ]
- El navegador web basado en texto ELinks utiliza SpiderMonkey para admitir JavaScript [ 40 ].
- Partes de SpiderMonkey se utilizan en la (re)implementación de JScript del proyecto Wine [ 41 ].
- Synchronet , un servidor BBS, de correo electrónico, web y de aplicaciones que utiliza el motor SpiderMonkey.
- JavaScript OSA , un lenguaje de comunicación entre procesos SpiderMonkey para el ordenador Mac .
- 0 AD , un juego de estrategia en tiempo real
- Wasmer ha incorporado SpiderMonkey a su proyecto de código abierto WinterJS, un entorno de ejecución de JavaScript.
- SpiderMonkey también se utiliza en muchos otros proyectos de código abierto; se mantiene una lista externa en el sitio para desarrolladores de Mozilla. [ 42 ]
SpiderMonkey incluye un intérprete de JavaScript para el desarrollo interactivo de JavaScript y para la invocación de archivos de programas JavaScript desde la línea de comandos. [ 43 ]
Véase también
Referencias
- ↑ "1.8.8 – SpiderMonkey | MDN" . Developer.mozilla.org. 10 de enero de 2013. Archivado del original el 2 de mayo de 2013. Consultado el 21 de marzo de 2013 .
- ↑ "Boletín informativo de SpiderMonkey (Firefox 110-111)" . spidermonkey.dev . 16 de febrero de 2023. Consultado el 27 de diciembre de 2023 .
- ↑ Políticas de licencias de Mozilla , mozilla.org, archivado del original el 2 de abril de 2013 , consultado el 26 de marzo de 2013.
- ↑ "Inicio" . Motor JavaScript/WebAssembly SpiderMonkey . Consultado el 24 de abril de 2023 .
- 1 2 3 Eich, Brendan (21 de junio de 2011). "Nuevo propietario del módulo del motor JavaScript" . BrendanEich.com. Archivado del original el 14 de julio de 2011. Recuperado el 1 de julio de 2011 .
- 1 2 3 Eich, Brendan (3 de abril de 2008). "Popularidad" . BrendanEich.com. Archivado del original el 3 de julio de 2011. Recuperado el 1 de julio de 2011 .
- ↑ Eich, Brendan (19 de agosto de 2011). "Mapeando la Monkeysphere" . Archivado del original el 13 de enero de 2013. Recuperado el 19 de agosto de 2011 .
- 1 2 3 4 5 Wirfs-Brock, Allen; Eich, Brendan (2020). "JavaScript: los primeros 20 años" . Actas de la ACM sobre lenguajes de programación . 4 (HOPL). doi : 10.1145/3386327 .
- ↑ "Referencia básica de JavaScript v1.4 - Nuevas características de esta versión" . Netscape Communications Corporation. 1998.
- ↑ https://web.archive.org/web/20140829071706/https://developer.mozilla.org/en-US/docs/Web/JavaScript/New_in_JavaScript/1.5
- ↑ http://www.jsdb.org/jsguide/intro.html#1023167
- ↑ "Novedades en JavaScript 1.6" . Archivado del original el 5 de septiembre de 2015. Consultado el 28 de julio de 2015 .
- ↑ "Netscape Navigator 2.0b1 para Windows" . Archivado del original el 19 de abril de 1997.(La primera versión beta con soporte para JavaScript, comercializada en aquel momento como LiveScript).
- ↑ "Guía de JavaScript del lado del cliente" (PDF) . Versión 1.3. Netscape Communications Corporation. 1999. Consultado el 23 de septiembre de 2025 .
- ↑ https://github.com/Historic-Spidermonkey-Source-Code/JavaScript-1.4.2/blob/main/src/jsconfig.h#L212
- ↑ "Firefox 3.5 para desarrolladores" . MDN Web Docs . Mozilla. 30 de junio de 2009. Consultado el 23 de septiembre de 2025 .
- 1 2 "JavaScript:TraceMonkey, MozillaWiki" . Consultado el 22 de julio de 2020 .
- ↑ "Firefox 4 para desarrolladores" . MDN Web Docs . Mozilla. 22 de marzo de 2011. Consultado el 23 de septiembre de 2025 .
- 1 2 "Firefox Notes - Escritorio" . Mozilla.org. 8 de enero de 2013. Archivado del original el 2 de septiembre de 2014. Recuperado el 21 de marzo de 2013 .
- ↑ https://web.archive.org/web/20170430175540/http://kangax.github.io/compat-table/es6/
- ↑ https://hacks.mozilla.org/2020/06/a-new-regexp-engine-in-spidermonkey/
- 1 2 "Warp: Rendimiento mejorado de JS en Firefox 83 – Mozilla Hacks - el blog para desarrolladores web" . Mozilla Hacks – el blog para desarrolladores web . 13 de noviembre de 2020. Consultado el 28 de agosto de 2021 .
- ↑ "Listado de directorio: /pub/firefox/releases/131.0/source/" . archive.mozilla.org . Archivado del original el 7 de octubre de 2024 . Recuperado el 20 de marzo de 2025 .
- ↑ "759422 – Eliminar el uso de e4x en la creación de cuentas" . Consultado el 5 de febrero de 2013 .
- ↑ "TraceMonkey: JavaScript Lightspeed, Blog de Brendan Eich" . Consultado el 22 de julio de 2020 .
- ↑ Paul, Ryan (22 de agosto de 2008). "Firefox obtendrá una mejora masiva en el rendimiento de JavaScript" . Ars Technica. Archivado del original el 6 de mayo de 2012. Recuperado el 21 de marzo de 2013 .
- ↑ Nethercote, Nicholas (1 de noviembre de 2011). "SpiderMonkey está a dieta | Nicholas Nethercote" . Blog.mozilla.com. Archivado del original el 28 de marzo de 2012. Recuperado el 21 de marzo de 2013 .
- ↑ "JaegerMonkey – ¡JavaScript rápido, siempre! » Mystery Bail Theater" . Bailopan.net. 26 de febrero de 2010. Archivado del original el 24 de marzo de 2013. Consultado el 21 de marzo de 2013 .
- ↑ Paul, Ryan (9 de marzo de 2010). "Mozilla toma prestado de WebKit para construir un nuevo motor JS rápido" . Ars Technica. Archivado del original el 16 de abril de 2012. Recuperado el 21 de marzo de 2013 .
- ↑ "JaegerMonkey - MozillaWiki" . Wiki.mozilla.org. Archivado del original el 23 de agosto de 2013. Consultado el 21 de marzo de 2013 .
- ↑ "Plataforma/Características/IonMonkey - MozillaWiki" . Wiki.mozilla.org. 11 de febrero de 2013. Archivado del original el 8 de marzo de 2013. Consultado el 21 de marzo de 2013 .
- ↑ "IonMonkey: el nuevo compilador JIT de JavaScript de Mozilla" . Infoq.com. Archivado del original el 8 de diciembre de 2012. Consultado el 21 de marzo de 2013 .
- ↑ "Firefox Notes - Escritorio" . Archivado del original el 3 de septiembre de 2014.
- ↑ Hunt, Ryan (20 de mayo de 2026). "Decir adiós a asm.js" . SpiderMonkey JavaScript/WebAssembly Engine . Recuperado el 20 de mayo de 2026 .
- ↑ "SpiderMonkey — Documentación de Firefox Source Docs" . firefox-source-docs.mozilla.org . Consultado el 28 de agosto de 2021 .
- ↑ "Cambios de JavaScript en MongoDB 3.2 — Manual de MongoDB 3.4" . Archivado del original el 6 de junio de 2017. Consultado el 23 de noviembre de 2016 .
- ↑ "La versión Riak 0.8 y JavaScript Map/Reduce" . Archivado del original el 3 de noviembre de 2011. Consultado el 24 de abril de 2011 .
- ↑ "Documentación del SDK de Acrobat DC" . helpx.adobe.com . Consultado el 5 de noviembre de 2021 .
- ↑ "Distributive-Network/PythonMonkey: Un motor JavaScript SpiderMonkey de Mozilla integrado en la máquina virtual de Python, que utiliza el motor de Python para proporcionar el entorno de host JS" . GitHub . 7 de julio de 2023. Consultado el 10 de julio de 2023 .
- ↑ Bolso, Erik Inge (8 de marzo de 2005). "Resumen de navegadores en modo texto de 2005" . Linux Journal . Archivado del original el 15 de marzo de 2010. Recuperado el 5 de agosto de 2010 .
- ↑ Lista de correo wine-cvs Archivada el 7 de febrero de 2009 en Wayback Machine , 16 de septiembre de 2008: "jscript: Se agregó un compilador de expresiones regulares basado en la implementación de regexp de Mozilla"
- ↑ "SpiderMonkey > FOSS" . MDN Web Docs . Consultado el 2 de abril de 2019 .
- ↑ "Introducción al intérprete de comandos de JavaScript" . MDN . Mozilla Developer Network. 29 de septiembre de 2010. Archivado del original el 29 de junio de 2011. Consultado el 14 de diciembre de 2010.
El intérprete de comandos de JavaScript es un programa de línea de comandos incluido en la distribución del código fuente de SpiderMonkey. [...] Puede usarlo como un intérprete de comandos interactivo. [...] También puede pasar, en la línea de comandos, un archivo de programa JavaScript para ejecutarlo. [...]
Enlaces externos
- Software multiplataforma
- Motores JavaScript
- Mozilla
- Software que utiliza la Licencia Pública de Mozilla.