There's an approach to compilation where you take the input program, but instead of running it you output what the interpreter would do, as a new program. So you get meh performance but you have an executable.
Yep yep, we're talking about the same thing.
I like to call it an inline interpreter.
It's a nice compromise. The emit-logic can be kept fairly uniform and low-maintenance since its more or less identical to the regular interpreter.
I got around 10% increased performance on a Forth in C for whatever that's worth.
One thing to keep in mind is to use functions in the emitted code rather than simply dumping everything in a pile. Most compilers don't deal well with code piles from my experience , which makes the code both compile and run slower than it could.
Here's a project doing that: https://news.ycombinator.com/item?id=19508616
This is a theory around this approach: https://en.wikipedia.org/wiki/Partial_evaluation#Futamura_pr...