In order to achieve a better speed of execution, can be sent to this Bytecode along with the collected Profiling data to an optimizing Compiler. The optimizing Compiler based on this Profiling data, certain assumptions and then produces highly optimized machine code. If one of the assumptions shall eventually prove to be wrong, is deoptimiert of the Code and the execution returns to the Interpreter, the new Profiling collects data to optimize the Code again later.
Why do some Engines more compilers than others? An Interpreter can generate Bytecode quickly, but the Bytecode is in General not very efficient. An optimizing Compiler needs to be longer, but ultimately much more efficient machine code. It is therefore important to find the right compromise between the rapid generation of Code (the Interpreter) or faster execution of the generated code (Optimizing Compiler). Some of the Engines decide to more optimizing compilers with different time and efficiency – add properties, which allows a finer control of these trade-offs at the expense of additional complexity and Compile times.