Compiler und Interpreter: Erklärung und Unterscheidung
Bei der Wahl einer Programmiersprache kommt es insbesondere auf zwei Dinge an: Einerseits muss die Sprache alle Bausteine bieten, die für das geplante Software-Projekt benötigt werden. Andererseits sollte die Programmierung und Umsetzung dieses Projekts so einfach wie möglich sein. Eine gute Lesbarkeit und Simplizität des Sprachcodes sind die entscheidenden Trümpfe, um letzteres gewährleisten zu können, denn diese Eigenschaften vereinfachen nicht nur den Einstieg und das Erlernen, sondern auch die tägliche Anwendung einer Programmiersprache.
Damit die Anweisungen eines geschriebenen Programms im Anschluss aber auch von einem Computer bzw. Prozessor verstanden werden können, muss der Quellcode moderner Programmiersprachen zunächst in eine maschinenlesbare Form gebracht werden. Dies geschieht – je nach Programmiersprache – mit einem Compiler oder Interpreter. Was genau hat es mit diesen beiden Werkzeugen auf sich? Und in welcher Hinsicht unterscheiden sie sich voneinander?
Was ist ein Interpreter?
Ein Interpreter ist ein Computerprogramm, das den Quellcode eines Software-Projekts während dessen Laufzeit – also während es ausgeführt wird – verarbeitet und als Schnittstelle zwischen diesem Projekt und dem Prozessor fungiert. Dabei geht ein Interpreter immer Codezeile für Codezeile vor, sodass die einzelnen Anweisungen der Reihe nach gelesen, analysiert und für den Prozessor aufbereitet werden. Dieses Prinzip gilt auch für wiederkehrende Anweisungen, die jeweils neu ausgeführt werden, sobald sie an der Reihe sind. Für die Verarbeitung des Software-Codes greifen Interpreter auf eigene, interne Bibliotheken zurück: Ist eine Quellcode-Zeile in die entsprechenden, maschinenlesbaren Befehle umgewandelt, wird sie direkt an den Prozessor weitergeleitet.
Der Umwandlungsprozess ist erst dann abgeschlossen, wenn der gesamte Code interpretiert ist. Er wird lediglich dann vorzeitig unterbrochen, wenn bei der Verarbeitung ein Fehler auftritt – ein Umstand, der die Fehlerbehandlung erheblich vereinfacht, da die problematische Codezeile sofort mit dem Auftauchen des Fehlers gefunden ist.
Zu den bekanntesten Programmiersprachen, die bei der Umwandlung von Quellcode in Maschinencode überwiegend auf einen Interpreter setzen, zählen BASIC, Perl, Python, Ruby und PHP. Häufig fasst man diese Sprachen daher auch unter dem Begriff „Interpreter-Sprachen“ zusammen.
Was ist ein Compiler?
Ein Compiler ist ein Computerprogramm, das den gesamten Quellcode eines Software-Projekts noch vor dessen Ausführung in Maschinensprache übersetzt. Erst im Anschluss wird das Projekt dann vom Prozessor ausgeführt, dem dadurch von Beginn an sämtliche Anweisungen in Maschinencode zur Verfügung stehen. Auf diese Weise hat der Prozessor alle notwendigen Bausteine parat, um die jeweilige Software auszuführen, Eingaben zu verarbeiten und die Ausgabe zu erzeugen. In vielen Fällen findet während des Compilierungsprozesses aber noch ein entscheidender Zwischenschritt statt: Vor der endgültigen Übersetzung in Maschinensprache wandeln die meisten Compiler Quellcode nämlich häufig zunächst in einen Zwischencode (auch „Objektcode“) um, der oft für verschiedene Plattformen geeignet ist und zudem von einem Interpreter verwendet werden kann.
Compiler legen im Rahmen der Code-Generierung fest, welche Anweisungen dem Prozessor in welcher Reihenfolge übermittelt werden. Sofern die Instruktionen nicht voneinander abhängig sind, kann dieser die Anweisungen dabei sogar parallel verarbeiten.
Zu den reinen Compiler-Sprachen zählen unter anderem die Urgesteine C, C++ und Pascal.
Compiler vs. Interpreter: Die Unterschiede im tabellarischen Überblick
Sowohl Compiler als auch Interpreter dienen dem Zweck, geschriebenen Software-Code in eine maschinenlesbare, ausführbare Form zu bringen. Ohne diese Übersetzung wäre es den Prozessoren von Computern nicht möglich, Programme in Sprachen wie C, C++, PHP, Python oder Ruby auszuführen, weshalb diese Tools für die Nutzung von PCs, Laptops und Smartphones unverzichtbar sind. Die voranstehenden Kurzporträts haben bereits aufgezeigt, dass es entscheidende Unterschiede zwischen Compilern und Interpretern gibt, was insbesondere bei der Wahl der passenden Programmiersprache für eine neue Software zu berücksichtigen ist. Die folgende Tabelle fasst die wichtigsten Punkte zum Vergleich „Compiler vs. Interpreter“ zusammen:
Interpreter | Compiler | |
---|---|---|
Zeitpunkt der Quellcode-Übersetzung | während der Laufzeit der Software | vor der Ausführung der Software |
Vorgehensweise bei der Übersetzung | Zeile für Zeile | immer gesamter Code |
Anzeige von Codefehlern | nach jeder Zeile | gesammelt nach kompletter Compilierung |
Übersetzungsgeschwindigkeit | hoch | niedrig |
Übersetzungseffizienz | niedrig | hoch |
Entwicklungsaufwand | Niedrig | hoch |
Typische Sprachen | PHP, Perl, Python, Ruby, BASIC | C, C++, Pascal |
Anhand der Unterschiede zwischen Compiler und Interpreter werden auch die Stärken bzw. Schwächen der jeweiligen Lösung für die Übersetzung von Programmcode deutlich: Programme mit Interpreter lassen sich sofort ausführen und sind daher deutlich schneller gestartet. Zudem ist die Entwicklung deutlich einfacher als bei einer Compiler-Anwendung, denn der Debugging-Prozess (also die Fehlerbereinigung) funktioniert wie die Übersetzung Zeile für Zeile. Bei einer Software mit Compiler muss zunächst immer der komplette Code umgewandelt werden, bevor Fehler behandelt werden können oder die Anwendung sich starten lässt. Läuft das Programm allerdings erst einmal, werden die Dienste des Compilers nicht mehr benötigt, während ein Interpreter weiterhin Rechenleistung in Anspruch nimmt.
Vorteil | Nachteil | |
---|---|---|
Interpreter | einfacher Entwicklungsprozess (insbesondere Debugging) | ineffizienter Übersetzungsprozess und langsame Ausführungsgeschwindigkeit |
Compiler | Übermittelt dem Prozessor den kompletten einsatzfertigen, ausführbaren Maschinencode | jegliche Anpassungen am Code erfordern eine Neuübersetzung (Fehlerbehandlung, Software-Erweiterung etc.) |
Hybridlösung aus Compiler und Interpreter: Just-in-time-Compiler
Um die Schwächen der jeweiligen Übersetzungslösung auszugleichen, existiert außerdem das Modell des sogenannten Just-in-time-Compilers (engl. für termingerecht, rechtzeitig). Diese spezielle Compiler-Art, die vereinzelt auch als Compreter (Kofferwort aus Compiler und Interpreter) bezeichnet wird, bricht mit dem eigentlichen Compiler-Ansatz und übersetzt den Programmcode – wie Interpreter – erst zur Laufzeit. Auf diese Weise wird die (dank Compiler) hohe Ausführungsgeschwindigkeit um einen vereinfachten Entwicklungsprozess ergänzt.
Eines der bekanntesten Beispiele für eine Sprache, die auf das Prinzip der Just-in-time-Compilierung setzt, ist Java: Als Komponente der Java-Laufzeitumgebung (JRE) verbessert dort ein solcher JIT-Compiler die Performance von Java-Applikationen, indem er bereits zuvor erzeugten Bytecode zur Laufzeit in Maschinencode umwandelt.