Since then, however, Firefox has left TraceMonkey behind and switched to a succession of method JITs, and in general, the major JavaScript engines have converged on an implementation strategy of a fast interpreter and one or more JIT compilation tiers (V8's TurboFan [2]/JavaScriptCore's Baseline & DFG & FTL [3]/SpiderMonkey's Baseline & IonMonkey [4]/ChakraCore's Simple & Full [5]).
Notably, none of these JavaScript JITs use tracing. Other dynamic language JITs that have appeared since 2010 (e.g. Julia, Pyston) have also avoided tracing. The only remaining major tracing JITs seem to be LuaJIT (which is no longer receiving new features) and PyPy (which uses a unique meta-tracing approach).
Contrary to what was predicted in 2010, it appears that for dynamic languages, method JITs have won over tracing JITs. For what reason(s) have tracing JITs been superseded? Have method JITs proven:
- Less complex to develop and maintain?
- Faster in the best/average case?
- To provide more consistent performance, i.e. less slowdown in the worst case?
Do you see any future for tracing JIT compilers, or do you expect future dynamic language JITs to only use the per-method strategy? Does tracing have any advantages - are there any situations in which tracing may be a good choice, or have tracing JITs proven to be a dead end?
[1] lambda-the-ultimate.org/node/3851 | [2] v8project.blogspot.com/2017/05/launching-ignition-and-turbofan.html | [3] webkit.org/blog/3362/
[4] blog.mozilla.org/javascript/2013/04/05/the-baseline-compiler-has-landed/ | [5] github.com/Microsoft/ChakraCore/wiki/Architecture-Overview