stringtranslate.com

Mono Araña

SpiderMonkey es un motor JavaScript y WebAssembly de código abierto de la Fundación Mozilla . [4]

Es el primer motor de JavaScript , escrito por Brendan Eich en Netscape Communications, y posteriormente lanzado como código abierto y actualmente mantenido por la Fundación Mozilla. Se utiliza en el navegador web Firefox .

Historia

Eich "escribió JavaScript en diez días" en 1995, [5] habiendo sido "reclutado para Netscape con la promesa de 'hacer Scheme ' en el navegador". [6] (La idea de usar Scheme fue abandonada cuando "la gerencia de ingeniería [decidió] que el lenguaje debía 'parecerse a Java ' ".) [6] A fines de 1996, Eich, que necesitaba "pagar [la] deuda técnica sustancial " que le quedaba del primer año, "se quedó en casa durante dos semanas para reescribir Mocha como la base de código que se conocería como SpiderMonkey". [5] (Mocha era el nombre de trabajo original para el lenguaje). [6] [7] En 2011, Eich transfirió la administración del código SpiderMonkey a Dave Mandelin. [5]

Versiones

Normas

SpiderMonkey implementa la especificación ECMA-262 ( ECMAScript ). La especificación ECMA-357 ( ECMAScript para XML (E4X)) se abandonó a principios de 2013. [9]

Internos

SpiderMonkey está escrito en C / C++ y contiene un intérprete , el compilador JIT IonMonkey y un recolector de basura .

Rastreo de monos

TraceMonkey [10] fue el primer compilador JIT escrito para el lenguaje JavaScript. Inicialmente presentado como una opción en una versión beta y presentado en el blog de Brendan Eich el 23 de agosto de 2008, [11] el compilador se convirtió en 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 de línea base en Firefox 3. [ 12]

En lugar de compilar funciones completas, TraceMonkey era un JIT de seguimiento que funcionaba registrando el flujo de control y los tipos de datos durante la ejecución del intérprete. Estos datos luego informaban la construcción de árboles de seguimiento , rutas altamente especializadas de código nativo .

Las mejoras de JägerMonkey acabaron por hacer que TraceMonkey quedara obsoleto, especialmente con el desarrollo del motor de inferencia de tipos SpiderMonkey . TraceMonkey no está presente en SpiderMonkey a partir de Firefox 11. [13]

Cazador de monos

JägerMonkey, internamente llamado MethodJIT, fue un compilador JIT de métodos completos diseñado para mejorar el rendimiento en casos en los que TraceMonkey no podía generar código nativo estable . [14] [15] Se lanzó por primera vez en Firefox 4 y eventualmente suplantó 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 funcionaban construyendo y optimizando un gráfico de flujo de control que representaba la función, JägerMonkey funcionaba iterando linealmente hacia adelante a través del bytecode de SpiderMonkey , la representación interna de la función. Aunque esto prohíbe las optimizaciones que requieren reordenamiento de instrucciones, la compilación de JägerMonkey tiene la ventaja de ser muy rápida, lo que es útil para JavaScript, ya que la recompilación debido al cambio de tipos de variables es frecuente.

Mozilla implementó una serie de optimizaciones críticas en JägerMonkey, las más importantes son los cachés en línea polimórficos y la inferencia de tipos . [16]

La diferencia entre las técnicas JIT de TraceMonkey y JägerMonkey y la necesidad de ambas se explicó en un artículo de hacks.mozilla.org. Chris Leary, uno de los desarrolladores de SpiderMonkey, proporcionó una explicación más detallada de los detalles técnicos en una publicación de blog archivada el 9 de diciembre de 2012 en archive.today . Puede encontrar más información técnica en los blogs de otros desarrolladores: dvander, dmandelin.

Mono de iones

IonMonkey fue un compilador JIT de JavaScript de Mozilla, cuyo objetivo era permitir muchas optimizaciones nuevas que eran imposibles con la arquitectura JägerMonkey anterior. [17]

IonMonkey era un compilador más tradicional: traducía el bytecode de SpiderMonkey a un gráfico de flujo de control , utilizando la forma de asignación única estática (SSA) para la representación intermedia . Esta arquitectura permitió que se utilizaran optimizaciones conocidas de otros lenguajes de programación para JavaScript, incluida la especialización de tipos, la inserción de funciones en línea, la asignación de registros de escaneo lineal , la eliminación de código muerto y el movimiento de código invariante en bucles . [18]

El compilador puede emitir traducciones rápidas de código nativo de funciones de JavaScript en las plataformas ARM , x86 y x86-64 . Ha sido el motor predeterminado desde Firefox 18. [19]

Odín Mono

OdinMonkey es el nombre del nuevo módulo de optimización de Mozilla para asm.js , un subconjunto de JavaScript fácilmente compilable. OdinMonkey en sí no es un compilador JIT, sino que utiliza el compilador JIT actual. Está incluido en Firefox desde la versión 22.

Mono de la deformación

El JIT WarpMonkey reemplaza al antiguo motor IonMonkey de la versión 83. [20] Es capaz de incorporar en línea otros scripts y especializar el código en función de los datos y argumentos que se procesan. Traduce el código de bytes y los datos de caché en línea en 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 nivel bajo (Ion LIR). Esta LIR realiza la asignación de registros y luego genera código de máquina nativo en un proceso llamado Generación de código. Las optimizaciones aquí suponen que un script continúa viendo datos similares a los que se han visto antes. Los JIT de línea base 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 línea base y luego se ramifica a ese intérprete como si lo estuviéramos ejecutando todo el tiempo. Para construir este marco de pila se puede utilizar una tabla auxiliar especial guardada por Warp para reconstruir valores que de otro modo no estarían disponibles. [21]

Usar

SpiderMonkey está pensado para integrarse en otras aplicaciones que proporcionen entornos de alojamiento para JavaScript. A continuación se incluye una lista incompleta:

SpiderMonkey incluye un shell de JavaScript para el desarrollo interactivo de JavaScript y para la invocación de archivos de programa de JavaScript desde la línea de comandos. [29]

Véase también

Referencias

  1. ^ "1.8.8 – SpiderMonkey | MDN". Developer.mozilla.org. 10 de enero de 2013. Archivado desde el original el 2 de mayo de 2013. Consultado el 21 de marzo de 2013 .
  2. ^ "Boletín informativo de SpiderMonkey (Firefox 110-111)". spidermonkey.dev . 16 de febrero de 2023 . Consultado el 27 de diciembre de 2023 .
  3. ^ Políticas de licencias de Mozilla, mozilla.org, archivado desde el original el 2 de abril de 2013 , consultado el 26 de marzo de 2013
  4. ^ "Inicio". SpiderMonkey JavaScript/WebAssembly Engine . Consultado el 24 de abril de 2023 .
  5. ^ abc Eich, Brendan (21 de junio de 2011). "Nuevo propietario del módulo del motor JavaScript". BrendanEich.com. Archivado desde el original el 14 de julio de 2011. Consultado el 1 de julio de 2011 .
  6. ^ abc Eich, Brendan (3 de abril de 2008). «Popularity». BrendanEich.com. Archivado desde el original el 3 de julio de 2011. Consultado el 1 de julio de 2011 .
  7. ^ Eich, Brendan (19 de agosto de 2011). "Mapping the Monkeysphere". Archivado desde el original el 13 de enero de 2013. Consultado el 19 de agosto de 2011 .
  8. ^ "Novedades en JavaScript 1.6". Archivado desde el original el 5 de septiembre de 2015 . Consultado el 28 de julio de 2015 .
  9. ^ "759422 – Eliminar el uso de e4x en la creación de cuentas" . Consultado el 5 de febrero de 2013 .
  10. ^ "JavaScript: TraceMonkey, MozillaWiki" . Consultado el 22 de julio de 2020 .
  11. ^ "TraceMonkey: JavaScript Lightspeed, blog de Brendan Eich" . Consultado el 22 de julio de 2020 .
  12. ^ Paul, Ryan (22 de agosto de 2008). «Firefox obtendrá un gran aumento del rendimiento de JavaScript». Ars Technica. Archivado desde el original el 6 de mayo de 2012. Consultado el 21 de marzo de 2013 .
  13. ^ Nethercote, Nicholas (1 de noviembre de 2011). «SpiderMonkey está a dieta | Nicholas Nethercote». Blog.mozilla.com. Archivado desde el original el 28 de marzo de 2012. Consultado el 21 de marzo de 2013 .
  14. ^ "JaegerMonkey – Fast JavaScript, Always! » Mystery Bail Theater". Bailopan.net. 26 de febrero de 2010. Archivado desde el original el 24 de marzo de 2013. Consultado el 21 de marzo de 2013 .
  15. ^ Paul, Ryan (9 de marzo de 2010). «Mozilla toma elementos de WebKit para crear un nuevo y rápido motor JS». Ars Technica. Archivado desde el original el 16 de abril de 2012. Consultado el 21 de marzo de 2013 .
  16. ^ "JaegerMonkey - MozillaWiki". Wiki.mozilla.org. Archivado desde el original el 23 de agosto de 2013. Consultado el 21 de marzo de 2013 .
  17. ^ "Plataforma/Características/IonMonkey - MozillaWiki". Wiki.mozilla.org. 11 de febrero de 2013. Archivado desde el original el 8 de marzo de 2013 . Consultado el 21 de marzo de 2013 .
  18. ^ "IonMonkey: el nuevo compilador JIT de JavaScript de Mozilla". Infoq.com. Archivado desde el original el 8 de diciembre de 2012. Consultado el 21 de marzo de 2013 .
  19. ^ "Firefox Notes - Desktop". Mozilla.org. 8 de enero de 2013. Archivado desde el original el 2 de septiembre de 2014. Consultado el 21 de marzo de 2013 .
  20. ^ "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 .
  21. ^ "SpiderMonkey — Documentación de Firefox Source Docs". firefox-source-docs.mozilla.org . Consultado el 28 de agosto de 2021 .
  22. ^ "Cambios de JavaScript en MongoDB 3.2 — Manual de MongoDB 3.4". Archivado desde el original el 6 de junio de 2017 . Consultado el 23 de noviembre de 2016 .
  23. ^ "La versión Riak 0.8 y JavaScript Map/Reduce". Archivado desde el original el 3 de noviembre de 2011 . Consultado el 24 de abril de 2011 .
  24. ^ "Documentación del SDK de Acrobat DC". helpx.adobe.com . Consultado el 5 de noviembre de 2021 .
  25. ^ "Distributive-Network/PythonMonkey: un motor de JavaScript SpiderMonkey de Mozilla integrado en la máquina virtual Python, que utiliza el motor Python para proporcionar el entorno de host JS". GitHub . 7 de julio de 2023 . Consultado el 10 de julio de 2023 .
  26. ^ Bolso, Erik Inge (8 de marzo de 2005). «2005 Text Mode Browser Roundup». Linux Journal . Archivado desde el original el 15 de marzo de 2010. Consultado el 5 de agosto de 2010 .
  27. ^ Lista de correo wine-cvs Archivado 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 expresiones regulares de Mozilla"
  28. ^ "SpiderMonkey > FOSS". Documentos web de MDN . Consultado el 2 de abril de 2019 .
  29. ^ "Introducción al shell de JavaScript". MDN . Mozilla Developer Network. 29 de septiembre de 2010. Archivado desde el original el 29 de junio de 2011 . Consultado el 14 de diciembre de 2010 . El shell de JavaScript es un programa de línea de comandos incluido en la distribución fuente de SpiderMonkey. [...] Puede usarlo como un shell interactivo [...] También puede pasar, en la línea de comandos, un archivo de programa JavaScript para ejecutar [...]

Enlaces externos