[nb 1][3] Interpretation and JIT compilation are particularly suited for dynamic programming languages, as the runtime system can handle late-bound data types and enforce security guarantees.
The earliest published JIT compiler is generally attributed to work on LISP by John McCarthy in 1960.
Another early example was by Ken Thompson, who in 1968 gave one of the first applications of regular expressions, here for pattern matching in the text editor QED.
[6] For speed, Thompson implemented regular expression matching by JITing to IBM 7094 code on the Compatible Time-Sharing System.
[4] An influential technique for deriving compiled code from interpretation was pioneered by James G. Mitchell in 1970, which he implemented for the experimental language LC².
However, a special type of "JIT" may potentially not target the physical machine's CPU architecture, but rather an optimized VM bytecode where limitations on raw machine code prevail, especially where that bytecode's VM eventually leverages a JIT to native code.
[19] JIT causes a slight to noticeable delay in the initial execution of an application, due to the time taken to load and compile the input code.
Startup time can include increased IO-bound operations in addition to JIT compilation: for example, the rt.jar class data file for the Java Virtual Machine (JVM) is 40 MB and the JVM must seek a lot of data in this contextually huge file.
[20] One possible optimization, used by Sun's HotSpot Java Virtual Machine, is to combine interpretation and JIT compilation.
Finally, during the initial code interpretation, execution statistics can be collected before compilation, which helps to perform better optimization.
[25] Ngen pre-compiles (or "pre-JITs") bytecode in a Common Intermediate Language image into machine native code.
.NET Framework 2.0 shipped with Visual Studio 2005 runs Ngen on all of the Microsoft library DLLs right after the installation.
JIT compilation may not reliably achieve its goal, namely entering a steady state of improved performance after a short initial warmup period.
[30] Traini et al. (2022) instead focused on the HotSpot virtual machine but with a much wider array of benchmarks,[31] finding that 10.9% of process executions failed to reach a steady state of performance, and 43.5% of benchmarks did not consistently attain a steady state across multiple executions.
Several modern runtime environments rely on JIT compilation for high-speed code execution, including most implementations of Java, together with Microsoft's .NET.
Similarly, many regular-expression libraries feature JIT compilation of regular expressions, either to bytecode or to machine code.