SpiderMonkey es un motor JavaScript y WebAssembly de código abierto de la Fundación Mozilla . [4]
Es el primer motor 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 .
Eich "escribió JavaScript en diez días" en 1995, [5] después de haber sido "reclutado para Netscape con la promesa de 'hacer Scheme ' en el navegador". [6] (La idea de utilizar 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, que necesitaba "pagar [la] sustancial deuda técnica "Se fue del primer año, "se quedó en casa durante dos semanas para reescribir Mocha como el código base 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 SpiderMonkey a Dave Mandelin. [5]
SpiderMonkey implementa la especificación ECMA-262 ( ECMAScript ). ECMA-357 ( ECMAScript para XML (E4X)) se eliminó a principios de 2013. [9]
SpiderMonkey está escrito en C / C++ y contiene un intérprete , el compilador JIT de IonMonkey y un recolector de basura .
TraceMonkey [10] fue el primer compilador JIT escrito para el lenguaje JavaScript. Introducido inicialmente 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 pasó a formar parte de la versión principal como parte de SpiderMonkey en Firefox 3.5 , proporcionando "mejoras de rendimiento que oscilan entre 20 y 40 veces más rápido" que el intérprete básico de Firefox 3 . [12]
En lugar de compilar funciones completas, TraceMonkey era un JIT de seguimiento , que opera registrando el flujo de control y los tipos de datos durante la ejecución del intérprete. Estos datos luego informaron la construcción de árboles de rastreo , rutas altamente especializadas de código nativo .
Las mejoras en JägerMonkey eventualmente hicieron que TraceMonkey quedara obsoleto, especialmente con el desarrollo del motor de inferencia de tipos SpiderMonkey . TraceMonkey está ausente en SpiderMonkey desde Firefox 11 en adelante. [13]
JägerMonkey, llamado internamente MethodJIT, era un compilador JIT de método completo diseñado para mejorar el rendimiento en los casos en que TraceMonkey no podía generar código nativo estable . [14] [15] Fue lanzado por primera vez en Firefox 4 y finalmente suplantó por completo a TraceMonkey. Él mismo ha sido reemplazado por IonMonkey.
JägerMonkey operaba de manera muy diferente a otros compiladores de su clase: mientras que los compiladores típicos trabajaban construyendo y optimizando un gráfico de flujo de control que representaba la función, JägerMonkey operaba iterando linealmente hacia adelante a través del código de bytes de SpiderMonkey , la representación de la función interna. Aunque esto prohíbe optimizaciones que requieran reordenamiento de instrucciones, la compilación de JägerMonkey tiene la ventaja de ser muy rápida, lo cual 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 cachés en línea polimórficas e inferencia de tipos . [dieciséis]
La diferencia entre las técnicas TraceMonkey y JägerMonkey JIT 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.
IonMonkey era un compilador JIT de JavaScript de Mozilla, cuyo objetivo era permitir muchas optimizaciones nuevas que eran imposibles con la arquitectura anterior de JägerMonkey. [17]
IonMonkey era un compilador más tradicional: traducía el código de bytes de SpiderMonkey en un gráfico de flujo de control , utilizando un formulario de asignación única (SSA) estático para la representación intermedia . Esta arquitectura permitió utilizar optimizaciones conocidas de otros lenguajes de programación para JavaScript, incluida la especialización de tipos, la inserción de funciones , la asignación de registros de escaneo lineal , la eliminación de códigos muertos y el movimiento de código invariante en bucle . [18]
El compilador puede emitir 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 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, utiliza el compilador JIT actual. Está incluido con Firefox desde la versión 22.
WarpMonkey JIT reemplaza el antiguo motor IonMonkey de la versión 83. [20] Es capaz de incorporar otros scripts y especializar código en función de los datos y argumentos que se procesan. Traduce el código de bytes 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 bajarlo a una representación intermedia de bajo nivel (Ion LIR). Este 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 vistos antes. Los JIT de referencia son esenciales para el éxito aquí porque generan circuitos integrados 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 referencia y luego se bifurca 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. [21]
SpiderMonkey está destinado a integrarse en otras aplicaciones que proporcionan entornos de host 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 JavaScript desde la línea de comandos. [29]
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 comando, un archivo de programa JavaScript para ejecutar [...]