I've been in the compiler camp originally, simply because I found it more intuitive to translate a language into another one than interpret syntax tree data structures.<p>But recently I've started playing with interpreters and have found them very appealing.<p>There are multiple reasons for this:<p>- With an interpreter, there are <i>no separate object files</i>. So you only need to slurp the source code and call <i>eval</i> on it. This reduces workflow overhead to zero and should not be underestimated. For example, in a JS-based language for browsers, this means you don't need an extra set of scripts for a native JS environment (like node.js) for creating JS object files.<p>- With an interpreter, there's <i>no phase separation</i>. In a compiler you're always dealing with <i>expressions</i>, and you can't deal with the <i>values</i> they evaluate to. In an interpreter you have access to both, so you can do a lot more fun crazy things.<p>- With an interpreter, the implementor keeps <i>more control</i> of programs. It's simply much easier to instrument and manipulate the execution of programs when you are interpreting them than when they run on their own on the target architecture.<p>- Potentially <i>smaller code sizes</i>. In languages with macros, source code is highly compressed and irredundant - basically all boilerplate has already been stripped away by the programmer. If you compile this code, you have a huge code expansion compared to the source code.