A compiler is a program that translates a source program written in some high-level programming language (such as Java) into machine code for some computer architecture (such as an Intel Pentium architecture). The generated machine code can be later executed many times against different data each time.
An interpreter reads an executable source program written in a high-level programming language as well as data for this program, and it runs the program against the data to produce some results. One example is the Unix shell interpreter, which runs operating system commands interactively.
Note that both interpreters and compilers (like any other program) are written in some high-level programming language (which may be different from the language they accept) and they are translated into machine code. For a example, a Java interpreter can be completely written in Pascal, or even Java. The interpreter source program is machine independent since it does not generate machine code. (Note the difference between generate and translated into machine code.) An interpreter is generally slower than a compiler because it processes and interprets each statement in a program as many times as the number of the evaluations of this statement. For example, when a for-loop is interpreted, the statements inside the for-loop body will be analyzed and evaluated on every loop step. Some languages, such as Java and Lisp, come with both an interpreter and a compiler.
Compilers and interpreters are not the only examples of translators. Here are few more:
|Source Language||Translator||Target Language|
|SQL||database query optimizer||Query Evaluation Plan|
|Java||compiler||Java byte code|
|English text||Natural Language Understanding||semantics (meaning)|
|Regular Expressions||flex||a scanner in C|
|BNF of a language||bison||a parser in C|
This course deals mainly with compilers for high-level programming languages, but the same techniques apply to interpreters or to any other compilation scheme.