Was sind die Unterschiede zwischen einem Compiler, einem Interpreter und einem Assembler?
Wenn wir mal an der Basis anfangen und uns dann langsam hocharbeiten:
Assembler: Jede CPU hat einen Befehlssatz der von Hersteller in den Chip designed wird. Z.B. bewirkt die folgende Abfolge von bits:
1011 0100 0000 0111 
bzw. in Hexadecimal Notierung:
b407 
bei einem intel x86 Prozessor, das das AH Register mit dem Wert 7 geladen wird. Wie man sehen kann, ist das für einen Menschen nicht so besonders toll zu lesen. Also kam jemand auf die Idee, eine für Menschen einfachere Version zu erfinden:
mov ah, 7 
dass ist exact der selbe Befehl in Assembler - Für Menschen um ein vielfaches einfacher zu verstehen, aber von der CPU nicht direkt zu verarbeiten. Dazu muss dann erst ein Programm her - das sinnigerweise Assembler genannt wird - das “mov ah, 7” einliest und “10110100 00000111” ausspuckt.
Programmieren in Assembler ist immer noch reichlich mühsam, also kam recht bald der nächste Mensch auf die Idee, das man dem Computer noch noch besser in einer Form programmieren könnte, die der Menschlichen Kommunikation noch ein Stück ähnlicher ist. Die direkte 1:1 Umsetzung von dem Befehl den ein Mensch hinschreibt zu dem das die CPU versteht fällt dabei weg, aber der Mensch kann das noch viel einfacher hinschreiben:
int a=5, b=7, c; 
c = a * b; 
führt am Ende dann zu folgendem Assembler Programm:
mov    DWORD PTR [rbp-0x4],0x5 
mov    DWORD PTR [rbp-0x8],0x7 
mov    eax,DWORD PTR [rbp-0x4] 
imul   eax,DWORD PTR [rbp-0x8] 
mov    DWORD PTR [rbp-0xc],eax 
und das selbe nochmal als CPU-Befehle:
C705FCFFFFFF05000000 
C705F8FFFFFF07000000 
A1FCFFFFFF 
0FAF05F8FFFFFF 
A3F4FFFFFF 
Wir sind uns glaube ich darüber einig, dass die Lesbarkeit dieses Programms von C über Assembler bis hin zu den CPU-Befehlen deutlich abnimmt.
Compiler: Ein Compiler nimmt den Code wie eben beschrieben, denkt darüber nach und setzt dann das Programm direkt in die entsprechenden CPU-Befehle um und schreibt das ganze in eine neue Datei die dann später von der CPU direkt so ausgeführt werden kann.
Interpreter: Ein Interpreter liest eine Zeile Code ein, kratzt sich am Kopf und macht dann was vom Programm vorgegeben ist direkt sofort, um dann die nächste Zeile einzulesen sich wieder am Kopf zu kratzen und …..
Der Unterschied ist, dass der Compiler nur einmal über die Umsetzung des Programms in CPU-Befehle nachdenken muss und dann das Programm bei jedem Lauf sofort ohne weitere Verzögerung ausgeführt werden kann.
Bei einem Interpreter findet die Umsetzung bei jedem Programmlauf von neuem statt, d.h. die Ausführung des Programms ist deutlich langsamer, weil der Interpreter jedesmal von neuem drüber nachdenken muss, was eigentlich “c = a * b;” bedeutet und wie man es umsetzt.
Bei der Geschwindigkeit heutiger Computer spielt es oft keine Rolle ob das Programm einmal übersetzt wird (Compiler) oder etliche Male (Interpreter), aber wenn wirklich aufwändige Berechnungen wirklich oft ausgeführt werden müssen, dann macht sich das schon bemerkbar, das compilierte Programme schon mal um den Faktor 1000 schneller laufen können als das gleiche Programm interpretiert.