Explain to me what JIT compilation is and when it is appropriate to use. How does it compare to regular compilation?
JIT compilation stands for *Just-In-Time* compilation. 
It is a technique used to improve the performance of interpreted or bytecode-based languages.
Some famous usages are in the Chrome V8 JavaScript engine, the Java JVM, or the Lua scripting language.

With JIT compilation, instead of interpreting the code line by line each time it is executed, the code is *compiled into machine code at runtime*, allowing it to run faster. 
The compilation process takes often place just before the code is executed, hence the term *Just-In-Time*.

JIT compilation is appropriate to use when you want to improve the performance of an interpreted or bytecode-based language while keeping it's scripting aspect. 

Interpreted languages are typically much slower than compiled languages, and JIT compilation can help bridge that gap.
Additionally, JIT compilation can help optimize the performance of code that is executed frequently, such as in a loop.

In comparison to regular compilation, JIT compilation has a *shorter startup time* since the code is compiled on demand, and it *doesn't require an executable file* to be generated before running the code. 
It also *doesn't require strong typing* since the actual values are often readily available and the execution can be observed, traced.
So JIT compilation can maintain the flexibility and fast feedback loop that is often associated with scripting languages.

However, JIT compilation can have a *higher overhead* since the compilation process takes place at runtime, which can add some latency to the execution time of the code. 
Also, JIT compilation may not optimize the code as well as traditional compilation since the optimization is done on the fly, and the optimizations may not be as aggressive as they would be in a traditional compiler.

In summary, JIT compilation is often **more flexible but slower** than regular compilation.
It's a useful technique to improve the performance of interpreted or bytecode-based languages, especially for frequently executed code.