Etwas ausführlicher: (

)
Ein Compiler übersetzt aus dem Code, den man programmiert hat, maschinenlesbare Programme, die eigenständig lauffähig sind. (Compiler werden auch oft "Übersetzer" genannt, was es eigentlich auch ganz gut trifft)
Ein Interpreter ist ein Programm, das sich Sourcecode nimmt und ihn Schritt für Schritt ausführt.
Der Unterschied ist also der, dass man ein Programm in z.B. C einfach nur einmal durch den Compiler jagd und danach kann man das daraus entstehende Programm ohne weiter Hilfsmittel ausführen, während Programme, die z.B. in Perl geschrieben wurden, immer ein zusätzlichen Programm (den Interpreter) brauchen, damit man sie laufen lassen kann.
Man könnte übrigens durchaus auch einen Compiler programmieren, der aus Perl-Code ausführbare Programm compiliert. Ich glaube da gibt es sogar diverse Projekte. Nur braucht das eigentlich niemand.
Warum eigentlich überhaupt Interpreter benutzen? Compilieren ist doch besser, da kann man das Programm ausführen ohne den Interpreter.
Der Grund, warum es viele Interpreter gibt, ist der, dass dann die entsprechenden Programme oft portabler sind. Ein Compiler erstellt eine ausführbare Datei, die sehr spezielle auf eine Platform (die CPU und das Betriebssystem), auf der das Programm laufen soll, zugeschnitten ist. Man kann auch nicht ohne weiteres einen Compiler bauen, der z.B. ein Windows-Programm auch für Linux compilieren würde, da solche Programme oft auf spezielle Eigenschaften der CPU bzw. des Betriebssystems zugreifen. Dafür gibt es Interpreter. Ein Perl-Programm läuft in der Regel auf jeder Platform, für die es einen Perl-Interpreter gibt.
Java übrigens ist streng genommen eine Interpreter-Sprache (soweit es sowas überhaupt gibt.... wie gesagt, man kann für jede Sprache einen Compiler bauen), hat aber auch einige Eigenschaften einer Compiler-Sprache. Bei Java erzeugt ein Compiler einen sogenannten Bytecode, dieser wird dann später von einem Java-Bytecode-Interpreter ausgeführt. Das dient hauptsächlich dazu, dass der Compiler diverse Optimierungen einbauen kann, damit der Interpreter dann nachher schneller arbeiten kann.... denn der Hauptnachteil interpretierter Programme ist immer noch, dass sie langsamer sind, als compilierte. Ist ja auch logisch, da läuft ja noch ein Interpreter im Hintergrund und Programmierer programmieren ja oft auch nicht so, wie es für den Rechner am besten (schnellsten) ist, sondern so, dass sie das Programm auch gut verstehen können. Dafür gibt es halt bei Java vorher diesen Schritt mit dem Bytecode-Compiler.
Also, kurz zusammengefasst:
Ein
Compiler ist nichts anderes, als ein Programm, dass einen Code in etwas anderes tranformiert - was nicht zwingender Weise eine .EXE-Datei sein muss, wie man z.B. beim Java-Bytestream-Compiler sieht.
Ein
Interpreter ist ein Programm, der ein für einen Computer nicht lesbares Computerprogramm sozusagen während der Laufzeit einliest und in computerlesbare Befehle umsetzt (also das Programm ausführt).
Eine Unterteilung in Interpreter- und Compiler-Sprachen ist eigentlich nicht ganz korrekt, denn für so ziemlich jede Sprache kann man einen Interpreter bzw. Compiler programmieren. Es gibt meines Wissens sogar einen Interpreter für einen Teilbereich der Programmiersprache C, die ja allgemein als eine _der_ Compiler-Sprachen schlechthin gilt. Es gibt auch Projekte, um einen Compiler für Perl-Programme zu erstellen... und Perl ist eine _der_ Interpretersprachen schlechthin. Aber generell kann man schon sagen, dass C, C++ und Pascal-Programme meistens durch einen Compiler gejagt werden, währen Perl, Python, Javascript typischer Weise von einem Interpreter ausgeführt werden. Java ist so ne Mischung - streng genommen steht ganz hinten bei Java aber ein Interpreter, also würde Java in die Kategorie "Interpreter-Sprachen" stecken
Eine schöne Beschreibung gibt's übrigens bei Wiki-Pedia:
KLICK