Quatsch. Viel allgemeiner!
Ein
Compiler übersetzt von einer Sprache in eine andere, ohne dass dabei Information verloren geht. Also 1:1. Total egal ob das jetzt von C in eine Assemblersprache ist, oder von Ruby in Scheme oder von C# in Java-Bytecode ist absolut egal. Ja, Java-Bytecode kann man auch tatsächlich mit anderen Sprachen wie Java generieren .. dazu gibt es ja eben Compiler.
Wir haben während dem Studium auch schon einen Compiler geschrieben der von einer selbst definierten Sprache (in ENBF definiert) einfach nur Code erzeugt hat der in Python ausführbar war.
Maschinencode, was du wohl meinst, wird von "einem"
Assembler (!) (es gibt nicht nur "den" Assembler, sondern ist ein allgemeiner Ausdruck wie Compiler oder Interpreter) erzeugt, nicht von einem Compiler.
Richtig ist aber, dass dies nur ein einziger Vorgang ist der danach abgeschlossen ist und alles zur Compilzeit übersetzt wird - was es an Variablen etc. gibt.
Ein
Interpreter erstellt nichts sondern führt einfach nur aus, direkt aus dem Quellcode - zur Laufzeit.
Ein
Parser ist bestandteil von Compiler und Interpreter. Beim parsen geht es nur darum Zeichenketten zu analysieren. Das müssen Compiler und Interpreter gleichermaßen machen, um danach einen Parsebaum zu haben. Aus dem Parsebaum wird ein Abstract Syntax Tree, darauf können noch Optimierungen angwendet werden (oder auch nicht), und auf dieser Basis kann dann das Programm ausgeführt werden (beim Interpreter) oder auch die Zielsprache generiert werden (beim Compiler).
Sorry das ich so viel schrieb, aber ich musste diese Unklarheiten beseitigen .. außerdem hab ich erst am Donnerstag das im Unterricht aufgefrischt bekommen