|Version||Release date||Corresponding ECMAScript version||Browser version||Added functionality|
|scope="row" 1.0||March 1996||Netscape Navigator 2.0|
|scope="row" 1.1||August 1996||Netscape Navigator 3.0|
|scope="row" 1.2||June 1997||Netscape Navigator 4.0 - 4.05|
|scope="row" 1.3||October 1998||ECMA-262 1st + 2nd edition||Netscape Navigator 4.06-4.7x|
|scope="row" 1.4||Netscape Server|
|scope="row" 1.5||November 2000||ECMA-262 3rd edition||Netscape Navigator 6, Firefox 1.0|
|scope="row" 1.6||November 2005||Firefox 1.5||additional array methods, array and string generics, E4X|
|scope="row" 1.7||October 2006||Firefox 2.0||iterators and generators, let statement, array comprehensions, destructuring assignment|
|scope="row" 1.8||June 2008||Firefox 3.0||generator expressions, expression closures|
|scope="row" 1.8.5||March 2011||ECMA-262 5th edition||Firefox 4.0||JSON support|
|scope="row" 1.8.8||January 2012||Firefox 10.0|
|scope="row" 17||November 2012||Firefox 17.0|
|scope="row" 24||September 2013||Firefox 24.0|
|scope="row" 31||July 2014||Firefox 31.0|
|scope="row" 38||May 2015||Firefox 38.0|
|scope="row" 45||March 2016||Firefox 45.0|
|scope="row" 52||March 2017||Firefox 52.0|
|scope="row" 60||May 2018||Firefox 60.0|
|scope="row" 68||July 2019||Firefox 68.0|
|scope="row" 78||June 2020||Firefox 78.0|
|scope="row" 90||2021||Firefox 90.0|
SpiderMonkey implements the ECMA-262 specification (ECMAScript). ECMA-357 (ECMAScript for XML (E4X)) was dropped in early 2013.
SpiderMonkey is written in C/C++ and contains an interpreter, the IonMonkey JIT compiler, and a garbage collector.
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.
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. It was first released in Firefox 4 and eventually entirely supplanted TraceMonkey. It has itself been replaced by IonMonkey.
Mozilla implemented a number of critical optimizations in JägerMonkey, most importantly polymorphic inline caches and type inference.
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. More technical information can be found in other developer's blogs: dvander, dmandelin.
The WarpMonkey JIT replaces the former IonMonkey engine from version 83. 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.