Unterschied zwischen Compiler und Interpreter ?



  • Hallo kann mir wer die Unterschiede zwischen Compiler und Interpreter erklären ?





  • Ein Compiler übersetzt den Code bereits zur compilezeit zu Maschinencode (Binärcode), sodass der PC direkt damit arbeiten kann. Ein Interpreter übersetzt den Code erst zur Laufzeit des Programms zu Binärcode. Folglich ist ein Interpreter in der Regel langsamer als ein bereits vorkompilierter Code.



  • ok thx.

    Aber eines verstehe ich nicht.

    Also was bedeutet dieser Satz genau:

    Reine Interpreter sind auf jeder Rechnerarchitektur lauffähig wenn der Quellcode des Interpreters dort übersetzt werden kann .



  • Ach ja nochwas die Vorteile zwischen Compiler und Interpreter weiss ich ja jetzt aber wo ist denn dann der Nachteil beim Compiler 😕



  • Ein Interpreter ist ein Programm, das den Quellcode Deines Programmes Befehl für Befehl zur Laufzeit ließt, in Maschinencode umsetzt und ausführt. Ein Kompiler setzt den gesamten am Stück Quellcode in Maschinensprache um und speicher diese als Exe-Datei ab. Erst dann kannst Du Dein Programm ausführen. (Die meisten Compiler haben eine Option, mit der Du die Exe aus dem Arbeitsspeicher heraus ausprobierenkannst, ohne sie abzuspeichern).

    Interpreter und Kompiler sind für verschiedene Plattformen angepaßt.

    auf jeder Rechnerarchitektur lauffähig wenn der Quellcode des Interpreters dort übersetzt werden kann

    Dieser Satz gilt sowohl für Kompiler alsauch für Interpreter alsauch für selbsterstellte/ kompilierte Programme (Schließlich sind Kompiler und Interpreter (für DOS/Win) auch nur Exe-Dateien).

    Der Nachteil beim Compiler ist, daß er nur für eine bestimmte Plattform compilieren kann. Für eine andere Plattform brauchst Du einen entsprechenden angepaßten Compiler. Wobei dies natürlich auch für den Interpreter gilt, also kann man hier nicht unbedingt von Nachteil sprechen. Ein Nachteil der Interpreter ist: Mit ihnen laufen Programme wesentlich langsamer. Vorteil: Laufzeitfehler lassen sich leichter aufspüren, weil der Interpreter die Ausführung verweigert. Ein Kompiler kann Laufzeitfehler (z. B. falsch initialisierte Zeiger) nicht erkennen.



  • Mistery Ftw schrieb:

    Ach ja nochwas die Vorteile zwischen Compiler und Interpreter weiss ich ja jetzt aber wo ist denn dann der Nachteil beim Compiler 😕

    Eine compilierte exe ist Plattformabhängig. Daher ist der Nachteil des Compilers in dem Sinne das er nur für eine konkrete Plattform übersetzt. Wenn du z.B. C++ Code compilierst hast du eine exe die du nur für bestimmte Plattformen ausliefern kannst (z.B. Windows ab Windows 2000...).

    Nimmst du im Gegensatz dazu eine Interpretersprache, muss die Plattform nur diesen Interpreter besitzen um den Code auszuführen (Sprich wird unabhängiger von der Plattform). Auch wenn es nur vereinfacht stimmt gilt dies z.B. für Javaprogramme (Vereinfacht weil Java nicht unter die reinrassigen Interpretersprachen zählt, sondern mit Zwischencode arbeitet).

    cu André



  • mikey schrieb:

    Ein Interpreter übersetzt den Code erst zur Laufzeit des Programms zu Binärcode. Folglich ist ein Interpreter in der Regel langsamer als ein bereits vorkompilierter Code.

    Das was du beschreibst, ist ein JIT. Ein Interpreter wandelt nichts in Maschinencode um. Der interpretiert immer und immer wieder plaintext. JITs dagegen machen aus Plaintext/Bytecode einen Binärcode. Bzw. du solltest besser von Maschinencode sprechen, damit es klarer wird, was du mit Binärcode meinst... binär ist nämlich alles im Computer...



  • Dieser Thread wurde von Moderator/in CStoll aus dem Forum C++ in das Forum Rund um die Programmierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Artchi schrieb:

    Ein Interpreter wandelt nichts in Maschinencode um. Der interpretiert immer und immer wieder plaintext.

    Mit dem Plaintext wird aber der Rechner nicht sehr viel anfangen können - folglich muß der Interpreter den Plaintext-Befehl in etwas übersetzen, was der Rechner versteht -> Maschinencode (diesen Maschinencode jagt er allerdings "nur" durch den Rechner und vergisst ihn dann wieder).



  • Ok thx 🙂



  • Elektronix schrieb:

    Ein Interpreter ist ein Programm, das den Quellcode Deines Programmes Befehl für Befehl zur Laufzeit ließt, in Maschinencode umsetzt und ausführt.

    Richtig bis auf den Teil "in Maschinencode umsetzt". Wenn er das tun würde wär es ein Compiler.

    Ein Kompiler setzt den gesamten am Stück Quellcode in Maschinensprache um und speicher diese als Exe-Datei ab. Erst dann kannst Du Dein Programm ausführen.

    Nein, siehe oben. Man kann auch Programmteile im Speicher compilieren und von dort ausführen. Ein Compiler muss übrigens keine Maschinensprache erzeugen, Bytecodecompiler sind in letzter Zeit auch recht häufig ...

    (Die meisten Compiler haben eine Option, mit der Du die Exe aus dem Arbeitsspeicher heraus ausprobierenkannst, ohne sie abzuspeichern).

    Die meisten? Welche denn? Außer Turbo Pascal fällt mir keiner ein.

    Der Nachteil beim Compiler ist, daß er nur für eine bestimmte Plattform compilieren kann. Für eine andere Plattform brauchst Du einen entsprechenden angepaßten Compiler. Wobei dies natürlich auch für den Interpreter gilt, also kann man hier nicht unbedingt von Nachteil sprechen.

    Da ein Interpreter keinen Code erzeugt, gilt das eben nicht. Er muss nur selbst lauffähig sein.

    Ein Nachteil der Interpreter ist: Mit ihnen laufen Programme wesentlich langsamer. Vorteil: Laufzeitfehler lassen sich leichter aufspüren, weil der Interpreter die Ausführung verweigert. Ein Kompiler kann Laufzeitfehler (z. B. falsch initialisierte Zeiger) nicht erkennen.

    Der Interpreter kann auf nicht initialisierte Zeiger zugreifen und dann halt abstürzen, und der Compiler kann Code generieren, der jeden Zeigerzugriff vorher prüft.



  • Hallo,
    einen Compiler für einen Compiler gibt es meines Wissens nach nicht.



  • Bashar schrieb:

    "in Maschinencode umsetzt". Wenn er das tun würde wär es ein Compiler.

    Wenn er das nicht tut- was führt der Rechner dann aus?

    Elektronix schrieb:

    (Die meisten Compiler haben eine Option, mit der Du die Exe aus dem Arbeitsspeicher heraus ausprobierenkannst, ohne sie abzuspeichern).

    Die meisten? Welche denn? Außer Turbo Pascal fällt mir keiner ein.

    Sorry, ich meinte hier nicht die Compiler, sondern meistens die IDEs. Da ich immer nur mit IDEs arbeite, verwechsle ich die manchmal... 😃

    Elektronix schrieb:

    Der Nachteil beim Compiler ist, daß er nur für eine bestimmte Plattform compilieren kann. Für eine andere Plattform brauchst Du einen entsprechenden angepaßten Compiler. Wobei dies natürlich auch für den Interpreter gilt, also kann man hier nicht unbedingt von Nachteil sprechen.

    Da ein Interpreter keinen Code erzeugt, gilt das eben nicht. Er muss nur selbst lauffähig sein.

    Eben. Ein Interpreter als Programm ist plattformabhängig. Für mich ergeben sich da keine Unterschiede. Der Unterschied ist, daß bei Weitergabe eines Programmescodes der (plattformabhängige!) Interpreter ebenfalls vorhanden sein muß. Die Plattformunabhängigkeit ist nur gegeben, wenn sicher ist, daß es für alle gewünschten Systeme entsprechende Interpreter gibt.



  • Monger schrieb:

    Hallo,
    einen Compiler für einen Compiler gibt es meines Wissens nach nicht.

    Und wie programmiert man dann Compiler? Im Bitcode?



  • Elektronix schrieb:

    Bashar schrieb:

    "in Maschinencode umsetzt". Wenn er das tun würde wär es ein Compiler.

    Wenn er das nicht tut- was führt der Rechner dann aus?

    Eine Unterfunktion des Interpreters mit Eingabedaten als Parameter aufrufen (z.B. ;)). Jedenfalls keinen selbst generierten Maschinencode.

    Elektronix schrieb:

    Der Unterschied ist, daß bei Weitergabe eines Programmescodes der (plattformabhängige!) Interpreter ebenfalls vorhanden sein muß.

    Der Unterschied ist vor allem, dass man den Interpreter (im Idealfall) für eine andere Plattform unverändert neu übersetzt. Der Compiler (zumindest das Backend, welches den Maschinencode generiert) muss für jede Plattform neu geschrieben oder u.U. erheblich angepasst werden.

    EDIT: Verben ergänzt



  • Selbst wenn der Interpreter sich nicht direkt für eine andere Plattform übersetzen lässt, es muss nr der Interpreter angepasst/neugeschrieben werden und alle zu Interpretierenden Programme funktionieren (im Idealfall) auf auch der neuen Plattform.

    In der Uni wurde uns folgender Satz noch gesagt: Ein interpretiertes Programm ist genau dann schneller, wenn man es nur einmal benutzt.



  • CStoll schrieb:

    Artchi schrieb:

    Ein Interpreter wandelt nichts in Maschinencode um. Der interpretiert immer und immer wieder plaintext.

    Mit dem Plaintext wird aber der Rechner nicht sehr viel anfangen können - folglich muß der Interpreter den Plaintext-Befehl in etwas übersetzen, was der Rechner versteht -> Maschinencode (diesen Maschinencode jagt er allerdings "nur" durch den Rechner und vergisst ihn dann wieder).

    Genau das ist eben nicht der Fall.



  • Dass er den Quellcode interpretiert stimmt aber auch nicht ganz, außer vielleicht für Shellscripte und ähnliches, normalerweise wird er eine Zwischencodedarstellung interpretieren (AST oder Bytecode (was ihn dann auch fast schon zu einer Art Compiler macht)).



  • Ein Compiler erzeugt aus einer Sprache einen Code (Text) in einer anderen Sprache, während ein Interpreter sofort während der Übersetzung den Code auf der gleichen Maschine ausführt.

    Und es gibt auch noch Compiler-Compiler, welche aus einer Sprachbeschreibung (für einen Compiler) einen Compiler erzeugen.

    Diese sind besonders für das sog. "Bootstrapping" nützlich, d.h. um in kurzer Zeit einen Compiler für eine neue Maschine (Prozessor) zu erstellen.


Anmelden zum Antworten