In the earlier ages of computing execution engines were just the raw processors that the native code ran upon. Then, as languages and methodologies progressed, came the introduction of interpreted and more dynamic languages. However, these also required an execution engine in addition to the native execution engine. This multi-tiered approach carried with it a significant performance penalty. To mitigate this just-in-time compiling (JIT) interpreters were developed to speed up the execution of these languages. However, making a fast JIT is a massive undertaking.