From Wikipedia, the free encyclopedia
JavaScript and WebAssembly engine
SpiderMonkey is an open-source JavaScript and WebAssembly engine by the Mozilla Foundation.[4] The engine powers the Firefox web browser and has used multiple generations of JavaScript just-in-time (JIT) compilers, including TraceMonkey, JägerMonkey, IonMonkey, and the current WarpMonkey.
It is the first JavaScript engine, written by Brendan Eich at Netscape Communications, and later released as open source and currently maintained by the Mozilla Foundation. Its design allows it to be embedded in applications beyond web browsers, with implementations including MongoDB database system, Adobe Acrobat, and the GNOME desktop environment.
Eich "wrote JavaScript in ten days" in 1995,[5] having been "recruited to Netscape with the promise of 'doing Scheme' in the browser".[6] (The idea of using Scheme was abandoned when "engineering management [decided] that the language must 'look like Java'".)[6] In late 1996, Eich, needing to "pay off [the] substantial technical debt" left from the first year, "stayed home for two weeks to rewrite Mocha as the codebase that became known as SpiderMonkey".[5] (Mocha was the original working name for the language.)[6][7] In 2011, Eich transferred management of the SpiderMonkey code to Dave Mandelin.[5]
SpiderMonkey version history Version Release date Corresponding ECMAScript version Browser version Added functionality Old version, not maintained: 1.0 March 1996 Netscape Navigator 2.0 Old version, not maintained: 1.1 August 1996 Netscape Navigator 3.0 Old version, not maintained: 1.2 June 1997 Netscape Navigator 4.0 - 4.05 Old version, not maintained: 1.3 October 1998 ECMA-262 1st + 2nd edition Netscape Navigator 4.06-4.7x Old version, not maintained: 1.4 Netscape Server Old version, not maintained: 1.5 November 2000 ECMA-262 3rd edition Netscape Navigator 6, Firefox 1.0 Old version, not maintained: 1.6 November 2005[8] Firefox 1.5 additional array methods, array and string generics, E4X Old version, not maintained: 1.7 October 2006 Firefox 2.0 iterators and generators, let statement, array comprehensions, destructuring assignment Old version, not maintained: 1.8 June 2008 Firefox 3.0 generator expressions, expression closures Old version, not maintained: 1.8.5 March 2011 ECMA-262 5th edition Firefox 4.0 JSON support Old version, not maintained: 1.8.8 January 2012 Firefox 10.0 Old version, not maintained: 17 November 2012 Firefox 17.0 Old version, not maintained: 24 September 2013 Firefox 24.0 Old version, not maintained: 31 July 2014 Firefox 31.0 Old version, not maintained: 38 May 2015 Firefox 38.0 Old version, not maintained: 45 March 2016 Firefox 45.0 Old version, not maintained: 52 March 2017 Firefox 52.0 Old version, not maintained: 60 May 2018 Firefox 60.0 Old version, not maintained: 68 July 2019 Firefox 68.0 Old version, not maintained: 78 June 2020 Firefox 78.0 Old version, not maintained: 91 August 2021 Firefox 91.0 Old version, not maintained: 102 June 2022 Firefox 102.0 Old version, not maintained: 103 July 2022 Firefox 103.0 Latest version: 131 September 2024[9] Firefox 131.0Legend:
Old version, not maintained
Old version, still maintained
Latest version
Latest preview version
Future version
SpiderMonkey implements the ECMA-262 specification (ECMAScript). ECMA-357 (ECMAScript for XML (E4X)) was dropped in early 2013.[10]
SpiderMonkey is written in C/C++ and contains an interpreter, the WarpMonkey JIT compiler, and a garbage collector.
TraceMonkey[11] was the first JIT compiler written for the JavaScript language. Initially introduced as an option in a beta release and introduced in Brendan Eich's blog on August 23, 2008,[12] the compiler became part of the mainline release as part of SpiderMonkey in Firefox 3.5, providing "performance improvements ranging between 20 and 40 times faster" than the baseline interpreter in Firefox 3.[13]
Instead of compiling whole functions, TraceMonkey was a tracing JIT, which operates by recording control flow and data types during interpreter execution. This data then informed the construction of trace trees, highly specialized paths of native code.
Improvements to JägerMonkey eventually made TraceMonkey obsolete, especially with the development of the SpiderMonkey type inference engine. TraceMonkey is absent from SpiderMonkey from Firefox 11 onward.[14]
JägerMonkey, internally named MethodJIT, was a whole-method JIT compiler designed to improve performance in cases where TraceMonkey could not generate stable native code.[15][16] It was first released in Firefox 4 and eventually entirely supplanted TraceMonkey. It has itself been replaced by IonMonkey.
JägerMonkey operated very differently from other compilers in its class: while typical compilers worked by constructing and optimizing a control-flow graph representing the function, JägerMonkey instead operated by iterating linearly forward through SpiderMonkey bytecode, the internal function representation. Although this prohibits optimizations that require instruction reordering, JägerMonkey compiling has the advantage of being very fast, which is useful for JavaScript since recompiling due to changing variable types is frequent.
Mozilla implemented a number of critical optimizations in JägerMonkey, most importantly polymorphic inline caches and type inference.[17]
The difference between TraceMonkey and JägerMonkey JIT techniques and the need for both was explained in a hacks.mozilla.org article. A more in-depth explanation of the technical details was provided by Chris Leary, one of SpiderMonkey's developers, in a blog post Archived 9 December 2012 at archive.today. More technical information can be found in other developer's blogs: dvander, dmandelin.
IonMonkey was a JavaScript JIT compiler of Mozilla, which was aimed to enable many new optimizations that were impossible with the prior JägerMonkey architecture.[18]
IonMonkey was a more traditional compiler: it translated SpiderMonkey bytecode into a control-flow graph, using static single assignment form (SSA) for the intermediate representation. This architecture enabled well-known optimizations from other programming languages to be used for JavaScript, including type specialization, function inlining, linear-scan register allocation, dead code elimination, and loop-invariant code motion.[19]
The compiler can emit fast native code translations of JavaScript functions on the ARM, x86, and x86-64 platforms. It has been the default engine since Firefox 18.[20]
OdinMonkey is the name of Mozilla's new optimization module for asm.js, an easily compilable subset of JavaScript. OdinMonkey itself is not a JIT compiler, it uses the current JIT compiler. It's included with Firefox from release 22.
The WarpMonkey JIT replaces the former IonMonkey engine from version 83.[21] It is able to inline other scripts and specialize code based on the data and arguments being processed. It translates the bytecode and Inline Cache data into a Mid-level Intermediate Representation (Ion MIR) representation. This graph is transformed and optimized before being lowered to a Low-level Intermediate Representation (Ion LIR). This LIR performs register allocation and then generates native machine code in a process called Code Generation. The optimizations here assume that a script continues to see data similar what has been seen before. The Baseline JITs are essential to success here because they generate ICs that match observed data. If after a script is compiled with Warp, it encounters data that it is not prepared to handle it performs a bailout. The bailout mechanism reconstructs the native machine stack frame to match the layout used by the Baseline Interpreter and then branches to that interpreter as though we were running it all along. Building this stack frame may use special side-table saved by Warp to reconstruct values that are not otherwise available.[22]
SpiderMonkey is intended to be embedded in other applications that provide host environments for JavaScript. An incomplete list follows:
SpiderMonkey includes a JavaScript Shell for interactive JavaScript development and for command-line invocation of JavaScript program files.[30]
The JavaScript shell is a command-line program included in the SpiderMonkey source distribution. [...] You can use it as an interactive shell [...] You can also pass in, on the command line, a JavaScript program file to run [...]
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.3