Just-in-time compilation
Just-in-time compilation
Just-in-time compilation (JIT compilation), also known as dynamic translation, is a technique for improving the performance of programs that are run in an interpreter or virtual machine. Instead of interpreting source code or bytecode instruction by instruction, a JIT compiler translates parts of the code into native machine code at runtime, and then executes that native code directly. This approach can combine the portability of interpreted code with the speed of compiled code.
History
The concept of just-in-time compilation dates back to the early 1960s, when John McCarthy described a form of dynamic compilation in his work on Lisp. However, practical implementations did not become widespread until the 1990s. The Java programming language, released in 1995, popularized JIT compilation through the Java Virtual Machine (JVM). Later, the .NET Framework’s Common Language Runtime (CLR) also adopted a JIT compiler. Modern JIT systems, such as those used in JavaScript engines (e.g., V8 in Google Chrome) and LLVM-based runtimes, have evolved to include advanced profiling and adaptive optimization.
Features
- Performance improvements: Frequently executed code paths (hot spots) are compiled to native code, which can run many times faster than interpretation.
- Adaptive optimization: The compiler can collect runtime profiling data to guide optimizations such as inlining, loop unrolling, and dead code elimination.
- Mixed execution: Code may start in an interpreter and later be compiled if it proves to be hot, allowing fast startup and then gradual acceleration.
- Trade-offs: JIT compilation introduces a delay during execution (compilation time) and consumes memory for generated native code. The balance between startup time and peak performance is a key engineering challenge.
- Combination with ahead-of-time compilation: Some runtimes use ahead-of-time compilation (AOT) for critical parts and JIT for others, or offer both modes to suit different deployment scenarios.