An interpreter is another way of implementing a programming language. Interpretation
shares many aspects with compiling. Lexing, parsing and type-checking are
in an interpreter done just as in a compiler. But instead of generating code from
the syntax tree, the syntax tree is processed directly to evaluate expressions and
execute statements, and so on. An interpreter may need to process the same piece
of the syntax tree (for example, the body of a loop) many times and, hence, interpretation
is typically slower than executing a compiled program. But writing an
interpreter is often simpler than writing a compiler and the interpreter is easier to
move to a different machine (see chapter 13), so for applications where speed is not
of essence, interpreters are often used.
With the speed of PCs these days it's hard to tell the difference between compiled and interpretive applications. (at least what I write for clients)