Bei der Wahl einer Pro­gram­mier­spra­che kommt es ins­be­son­de­re auf zwei Dinge an: Ei­ner­seits muss die Sprache alle Bausteine bieten, die für das geplante Software-Projekt benötigt werden. An­de­rer­seits sollte die Pro­gram­mie­rung und Umsetzung dieses Projekts so einfach wie möglich sein. Eine gute Les­bar­keit und Sim­pli­zi­tät des Sprach­codes sind die ent­schei­den­den Trümpfe, um letzteres ge­währ­leis­ten zu können, denn diese Ei­gen­schaf­ten ver­ein­fa­chen nicht nur den Einstieg und das Erlernen, sondern auch die tägliche Anwendung einer Pro­gram­mier­spra­che.

Damit die An­wei­sun­gen eines ge­schrie­be­nen Programms im Anschluss aber auch von einem Computer bzw. Prozessor ver­stan­den werden können, muss der Quellcode moderner Pro­gram­mier­spra­chen zunächst in eine ma­schi­nen­les­ba­re Form gebracht werden. Dies geschieht – je nach Pro­gram­mier­spra­che – mit einem Compiler oder In­ter­pre­ter. Was genau hat es mit diesen beiden Werk­zeu­gen auf sich? Und in welcher Hinsicht un­ter­schei­den sie sich von­ein­an­der?

Was ist ein In­ter­pre­ter?

Ein In­ter­pre­ter ist ein Com­pu­ter­pro­gramm, das den Quellcode eines Software-Projekts während dessen Laufzeit – also während es aus­ge­führt wird – ver­ar­bei­tet und als Schnitt­stel­le zwischen diesem Projekt und dem Prozessor fungiert. Dabei geht ein In­ter­pre­ter immer Codezeile für Codezeile vor, sodass die einzelnen An­wei­sun­gen der Reihe nach gelesen, ana­ly­siert und für den Prozessor auf­be­rei­tet werden. Dieses Prinzip gilt auch für wie­der­keh­ren­de An­wei­sun­gen, die jeweils neu aus­ge­führt werden, sobald sie an der Reihe sind. Für die Ver­ar­bei­tung des Software-Codes greifen In­ter­pre­ter auf eigene, interne Bi­blio­the­ken zurück: Ist eine Quellcode-Zeile in die ent­spre­chen­den, ma­schi­nen­les­ba­ren Befehle um­ge­wan­delt, wird sie direkt an den Prozessor wei­ter­ge­lei­tet.

Der Um­wand­lungs­pro­zess ist erst dann ab­ge­schlos­sen, wenn der gesamte Code in­ter­pre­tiert ist. Er wird lediglich dann vorzeitig un­ter­bro­chen, wenn bei der Ver­ar­bei­tung ein Fehler auftritt – ein Umstand, der die Feh­ler­be­hand­lung erheblich ver­ein­facht, da die pro­ble­ma­ti­sche Codezeile sofort mit dem Auf­tau­chen des Fehlers gefunden ist.

Hinweis

Zu den be­kann­tes­ten Pro­gram­mier­spra­chen, die bei der Um­wand­lung von Quellcode in Ma­schi­nen­code über­wie­gend auf einen In­ter­pre­ter setzen, zählen BASIC, Perl, Python, Ruby und PHP. Häufig fasst man diese Sprachen daher auch unter dem Begriff „In­ter­pre­ter-Sprachen“ zusammen.

Was ist ein Compiler?

Ein Compiler ist ein Com­pu­ter­pro­gramm, das den gesamten Quellcode eines Software-Projekts noch vor dessen Aus­füh­rung in Ma­schi­nen­spra­che übersetzt. Erst im Anschluss wird das Projekt dann vom Prozessor aus­ge­führt, dem dadurch von Beginn an sämtliche An­wei­sun­gen in Ma­schi­nen­code zur Verfügung stehen. Auf diese Weise hat der Prozessor alle not­wen­di­gen Bausteine parat, um die jeweilige Software aus­zu­füh­ren, Eingaben zu ver­ar­bei­ten und die Ausgabe zu erzeugen. In vielen Fällen findet während des Com­pi­lie­rungs­pro­zes­ses aber noch ein ent­schei­den­der Zwi­schen­schritt statt: Vor der end­gül­ti­gen Über­set­zung in Ma­schi­nen­spra­che wandeln die meisten Compiler Quellcode nämlich häufig zunächst in einen Zwi­schen­code (auch „Ob­jekt­code“) um, der oft für ver­schie­de­ne Platt­for­men geeignet ist und zudem von einem In­ter­pre­ter verwendet werden kann.

Compiler legen im Rahmen der Code-Ge­ne­rie­rung fest, welche An­wei­sun­gen dem Prozessor in welcher Rei­hen­folge über­mit­telt werden. Sofern die In­struk­tio­nen nicht von­ein­an­der abhängig sind, kann dieser die An­wei­sun­gen dabei sogar parallel ver­ar­bei­ten.

Hinweis

Zu den reinen Compiler-Sprachen zählen unter anderem die Ur­ge­stei­ne C, C++ und Pascal.

Compiler vs. In­ter­pre­ter: Die Un­ter­schie­de im ta­bel­la­ri­schen Überblick

Sowohl Compiler als auch In­ter­pre­ter dienen dem Zweck, ge­schrie­be­nen Software-Code in eine ma­schi­nen­les­ba­re, aus­führ­ba­re Form zu bringen. Ohne diese Über­set­zung wäre es den Pro­zes­so­ren von Computern nicht möglich, Programme in Sprachen wie C, C++, PHP, Python oder Ruby aus­zu­füh­ren, weshalb diese Tools für die Nutzung von PCs, Laptops und Smart­phones un­ver­zicht­bar sind. Die vor­an­ste­hen­den Kurz­por­träts haben bereits auf­ge­zeigt, dass es ent­schei­den­de Un­ter­schie­de zwischen Compilern und In­ter­pre­tern gibt, was ins­be­son­de­re bei der Wahl der passenden Pro­gram­mier­spra­che für eine neue Software zu be­rück­sich­ti­gen ist. Die folgende Tabelle fasst die wich­tigs­ten Punkte zum Vergleich „Compiler vs. In­ter­pre­ter“ zusammen:

  In­ter­pre­ter Compiler
Zeitpunkt der Quellcode-Über­set­zung während der Laufzeit der Software vor der Aus­füh­rung der Software
Vor­ge­hens­wei­se bei der Über­set­zung Zeile für Zeile immer gesamter Code
Anzeige von Code­feh­lern nach jeder Zeile gesammelt nach kom­plet­ter Com­pi­lie­rung
Über­set­zungs­ge­schwin­dig­keit hoch niedrig
Über­set­zungs­ef­fi­zi­enz niedrig hoch
Ent­wick­lungs­auf­wand Niedrig hoch
Typische Sprachen PHP, Perl, Python, Ruby, BASIC C, C++, Pascal

Anhand der Un­ter­schie­de zwischen Compiler und In­ter­pre­ter werden auch die Stärken bzw. Schwächen der je­wei­li­gen Lösung für die Über­set­zung von Pro­gramm­code deutlich: Programme mit In­ter­pre­ter lassen sich sofort ausführen und sind daher deutlich schneller gestartet. Zudem ist die Ent­wick­lung deutlich einfacher als bei einer Compiler-Anwendung, denn der Debugging-Prozess (also die Feh­ler­be­rei­ni­gung) funk­tio­niert wie die Über­set­zung Zeile für Zeile. Bei einer Software mit Compiler muss zunächst immer der komplette Code um­ge­wan­delt werden, bevor Fehler behandelt werden können oder die Anwendung sich starten lässt. Läuft das Programm al­ler­dings erst einmal, werden die Dienste des Compilers nicht mehr benötigt, während ein In­ter­pre­ter weiterhin Re­chen­leis­tung in Anspruch nimmt.

  Vorteil Nachteil
In­ter­pre­ter einfacher Ent­wick­lungs­pro­zess (ins­be­son­de­re Debugging) in­ef­fi­zi­en­ter Über­set­zungs­pro­zess und langsame Aus­füh­rungs­ge­schwin­dig­keit
Compiler Über­mit­telt dem Prozessor den kom­plet­ten ein­satz­fer­ti­gen, aus­führ­ba­ren Ma­schi­nen­code jegliche An­pas­sun­gen am Code erfordern eine Neu­über­set­zung (Feh­ler­be­hand­lung, Software-Er­wei­te­rung etc.)

Hy­brid­lö­sung aus Compiler und In­ter­pre­ter: Just-in-time-Compiler

Um die Schwächen der je­wei­li­gen Über­set­zungs­lö­sung aus­zu­glei­chen, existiert außerdem das Modell des so­ge­nann­ten Just-in-time-Compilers (engl. für ter­min­ge­recht, recht­zei­tig). Diese spezielle Compiler-Art, die ver­ein­zelt auch als Compreter (Kof­fer­wort aus Compiler und Interpreter) be­zeich­net wird, bricht mit dem ei­gent­li­chen Compiler-Ansatz und übersetzt den Pro­gramm­code – wie In­ter­pre­ter – erst zur Laufzeit. Auf diese Weise wird die (dank Compiler) hohe Aus­füh­rungs­ge­schwin­dig­keit um einen ver­ein­fach­ten Ent­wick­lungs­pro­zess ergänzt.

Eines der be­kann­tes­ten Beispiele für eine Sprache, die auf das Prinzip der Just-in-time-Com­pi­lie­rung setzt, ist Java: Als Kom­po­nen­te der Java-Lauf­zeit­um­ge­bung (JRE) ver­bes­sert dort ein solcher JIT-Compiler die Per­for­mance von Java-Ap­pli­ka­tio­nen, indem er bereits zuvor erzeugten Bytecode zur Laufzeit in Ma­schi­nen­code umwandelt.

Zum Hauptmenü