Wie funktioniert ein Interpreter / Compiler?

74

Wie funktioniert ein Interpreter / Compiler? Was ist der Unterschied zwischen Interpreter und Compiler?

Entwickler
quelle

Antworten:

61

Compiler

Compiler waren die ersten Übersetzer, die geschrieben wurden. Die Idee ist einfach: Sie schreiben das Programm und übergeben es dem Compiler, der es übersetzt. Dann führen Sie das Ergebnis aus.

Dolmetscher

Ein Interpreter ist auch ein Programm, das eine Hochsprache in eine Niedrigsprache übersetzt, dies jedoch zum Zeitpunkt der Programmausführung. Sie schreiben das Programm mit einem Texteditor oder ähnlichem und weisen den Interpreter an, das Programm auszuführen. Es nimmt das Programm zeilenweise und übersetzt jede Zeile, bevor es ausgeführt wird: Es übersetzt die erste Zeile und führt sie aus, übersetzt dann die zweite Zeile und führt sie aus usw.

Compiler-Eigenschaften:

  • verbringt viel Zeit mit der Analyse und Verarbeitung des Programms
  • Die resultierende ausführbare Datei ist eine Form von maschinenspezifischem Binärcode
  • Die Computerhardware interpretiert den resultierenden Code (führt ihn aus)
  • Die Programmausführung ist schnell

Dolmetschereigenschaften:

  • Es wird relativ wenig Zeit für die Analyse und Verarbeitung des Programms aufgewendet
  • Der resultierende Code ist eine Art Zwischencode
  • Der resultierende Code wird von einem anderen Programm interpretiert
  • Die Programmausführung ist relativ langsam
Adriaan Stander
quelle
1
Also verwendet c # sowohl Compiler als auch Interpreter?
Entwickler
9
Das stimmt nicht Beide Sprachen werden kompiliert und interpretiert.
Matthew H
@Matt H: Ja, das wäre richtig, wenn Sie auch die Laufzeit zählen; weil die Laufzeit die übereinstimmenden Assemblys interpretiert. Aus Sicht von C # wird es zuerst kompiliert und dann ausgeführt.
KMån
1
@Aniket nein, es findet keine Interpretation des Objektcodes statt. Wenn Sie ein Programm zu etwas kompilieren, das die Maschine versteht, benötigen Sie keinen Interpreter. Darüber hinaus ist der Punkt der Frage der Unterschied zwischen dem von einem Compiler erzeugten Objektcode und dem Midcode (z. B. Bytecode), der beispielsweise von einem Java-Compiler erzeugt wird und dann bei jeder Ausführung von einem echten Interpreter interpretiert wird.
Juan
1
Es ist im Allgemeinen nicht wahr, dass Dolmetscher Zeile für Zeile arbeiten. Die überwiegende Mehrheit der Dolmetscher tut dies nicht. Es ist auch nicht allgemein gültig, dass Interpreter Code auf niedriger Ebene generieren: Es gibt Interpreter, die den AST durchlaufen (keine Codegenerierung), Interpreter, die Bytecode generieren und diesen dann interpretieren, und Interpreter, die JIT zu Maschinencode kompilieren.
sepp2k
33

Was ist ein Übersetzer?

Ein S -> T-Übersetzer akzeptiert Code, der in der Ausgangssprache S ausgedrückt wird, und übersetzt ihn in äquivalenten Code, der in einer anderen (Ziel-) Sprache T ausgedrückt wird.

Beispiele für Übersetzer:

  • Compiler - übersetzt High-Level-Code in Low-Level-Code, z. B. Java -> JVM
  • Assembler - übersetzt Assembler-Code in Maschinencode, z. B. x86as -> x86
  • Hochrangige Übersetzer - übersetzt Code von einem PL in einen anderen, z. B. Java -> C.
  • Dekompilierer - übersetzt Low-Level-Code in High-Level-Code, z. B. Java JVM-Bytecode -> Java

Was ist ein Dolmetscher?

Ein S-Interpreter akzeptiert Code, der in der Sprache S ausgedrückt wird, und führt diesen Code sofort aus. Es funktioniert durch Abrufen, Analysieren und Ausführen jeweils eines Befehls.

Großartig, wenn der Benutzer Anweisungen interaktiv eingibt (denken Sie an Python) und die Ausgabe erhalten möchte, bevor Sie die nächste Anweisung eingeben. Auch nützlich, wenn das Programm nur einmal ausgeführt werden soll oder portabel sein muss.

  • Das Interpretieren eines Programms ist viel langsamer als das Ausführen von nativem Maschinencode
  • Das Interpretieren einer Hochsprache ist ~ 100-mal langsamer
  • Das Interpretieren einer Sprache der Mittelstufe (z. B. JVM-Bytecode) ist ~ 10 langsamer
  • Wenn eine Anweisung wiederholt aufgerufen wird, wird sie wiederholt analysiert - zeitaufwändig!
  • Code muss nicht kompiliert werden

Unterschiede

Verhalten

  • Ein Compiler übersetzt Quellcode in Maschinencode, führt jedoch den Quell- oder Objektcode nicht aus.

  • Ein Interpreter führt den Quellcode einzeln aus, übersetzt den Quellcode jedoch nicht.

Performance

  • Ein Compiler benötigt ziemlich viel Zeit, um das Quellprogramm in nativen Maschinencode zu übersetzen, aber die nachfolgende Ausführung ist schnell
  • Ein Interpreter beginnt sofort mit der Ausführung des Quellprogramms, die Ausführung ist jedoch langsam

Interpretierende Compiler

Ein interpretierender Compiler ist ein guter Kompromiss zwischen Compilern und Interpreten. Es übersetzt das Quellprogramm in Code der virtuellen Maschine, der dann interpretiert wird.

Ein interpretierender Compiler kombiniert schnelle Übersetzung mit mäßig schneller Ausführung, vorausgesetzt:

  • VM-Code ist niedriger als die Ausgangssprache, aber höher als nativer Maschinencode
  • VM-Anweisungen haben einfache Formate (können von einem Dolmetscher schnell analysiert werden).

Beispiel: JDK bietet einen interpretierenden Compiler für Java.

Martynas
quelle
4
"Ein Interpreter führt den Quellcode einzeln aus, übersetzt aber nicht den Quellcode" (aus der Überschrift diff). Ich denke, der Interpreter übersetzt beide Aktionen gleichzeitig und führt sie nicht nur so aus, wie Sie es erklärt haben. Abgesehen von dieser Erklärung war klar und perfekt +1.
JAVA
20

Der Compiler wandelt den Quellcode in einer Computersprache in eine andere um.

Der Interpreter führt den Quellcode direkt aus (normalerweise in seiner eigenen virtuellen Maschine).

Alt-Text
(Quelle: answers.com )

Im Allgemeinen ist Dolmetscher leistungsintensiv.

KMån
quelle
Fast alle Interpreter führen kompilierten Bytecode aus, und einige (Simulatoren) führen kompilierten Maschinencode aus. Die Interpretation ist nur dann "leistungsintensiv", wenn die zu interpretierenden Anweisungen im Vergleich zum Abrufaufwand einfach sind.
Marquis von Lorne
Was ist mit C # und VB? In welchen Abschnitt gehören sie in Ihr Diagramm?
Variable
18

Was ist der Unterschied zwischen Interpreter und Compiler?

Geben Sie hier die Bildbeschreibung ein

Der Compiler scannt zuerst das gesamte Programm und übersetzt es dann in Maschinencode, der vom Computerprozessor ausgeführt wird.

Der Interpreter übersetzt eine Anweisung in die Maschinensprache, führt sie aus und fährt mit der nächsten Anweisung fort.

Beispiel: Der Compiler gibt fast alle Fehler auf einmal aus, aber der Interpreter wird ausgeführt, bis die Anweisung, die Sie falsch geschrieben haben, angezeigt wird

Wie funktioniert ein Interpreter / Compiler?

Geben Sie hier die Bildbeschreibung ein

  • Im Gegensatz zu kompilierten Sprachen, die vorab in Maschinensprache übersetzt werden (rechts).
  • Interpretierte Sprachen werden zur Laufzeit übersetzt.
  • dBASE- und BASIC- Interpreter (Mitte) übersetzen den ursprünglichen Quellcode.
  • Java- und Visual Basic- Interpreter (links) übersetzen Bytecode , eine Zwischensprache, die aus dem ursprünglichen Quellcode kompiliert wurde .

Quelle

Premraj
quelle
'Eine Zeile zu einer Zeit' ist nicht korrekt. Die meisten Interpreter kompilieren den Code vorab zu einem p-Code und führen dann jeweils einen p-Code-Befehl aus.
Marquis von Lorne
Dolmetscher übersetzen keinen Bytecode. Sie führen es aus. Es gibt Basisimplementierungen, die Bytecode und keinen Quellcode ausführen.
Marquis von Lorne
7

Der Unterschied zu ihrer Funktionsweise

F: Wofür werden Compiler und Interpreter verwendet?

A: Die meisten Programme sind in Hochsprachen (c #, java ...) geschrieben. Hochsprachen enthalten verständliche Wörter und Sätze. Auf der anderen Seite versteht der Computer (als ich diesen Artikel schrieb) den Maschinencode, der 0 und 1 ist, auch bekannt als Binär- / Maschinencode. Daher müssen wir den High-Level-Code in Quellcode konvertieren, der (Maschinencode / Binär) ist. Daher das Wort konvertieren.

Wir schließen daraus, dass ein Compiler / Interpreter-Job darin besteht, übergeordneten Code in Maschinencode zu übersetzen.

Beide haben jedoch unterschiedliche Möglichkeiten, den Code zu übersetzen

Unterschied:

Compiler:

konvertiert den Quellcode in eine Art Zwischenform. Bei statischer Sprache konvertiert ein Compiler normalerweise den Quellcode in eine Assembly, die normalerweise nicht auf der Festplatte gespeichert wurde. Anschließend wird der Assembler aufgerufen, um die Assembly in Binärcode zu konvertieren, der normalerweise als Objektdatei (Suffix .o oder .obj) gespeichert wird normalerweise), dann wird der Linker aufgerufen, um die Objektdatei (en) mit der ausführbaren Binärdatei zu verknüpfen. Es ist auch üblich, diesen gesamten Prozess des Kompilierens, Zusammenstellens und Verknüpfen als Kompilieren zu bezeichnen. Sie können gcc also als Compiler bezeichnen, aber es ruft tatsächlich cc1 auf, den zu kompilierenden Compiler, den zu montierenden Assembler und den zu verknüpfenden Linker.

Dolmetscher:

Sprache, die eine so genannte Bytecode-Zwischenform hat, der Quellcode wird zuerst in Bytecode konvertiert, dieser Prozess kann als Kompilieren bezeichnet werden, javac dient als Beispiel. Bytecode kann nicht auf Host-Computern ausgeführt werden. Es wird ein Programm benötigt, das aus Sicht des Betriebssystems der Prozess ist. Um den Bytecode auf dem Host-Computer zu interpretieren, wird dieses Programm als Interpreter bezeichnet. Denken Sie an Java. Einige Sprachen, wie z. B. Python, erledigen die Kompilierungs- und Interpretationsarbeit mit einer einzigen

- beide von: https://www.quora.com/Was- sind- die-Unterschiede- zwischen-einem- Compiler-einem-Interpreter-und-einem-Assembler-Bereitstellen von Beispielen

Vergleichen

Dolmetscher

  • Die Analyse des Quellcodes nimmt weniger Zeit in Anspruch, die Gesamtausführungszeit ist jedoch langsamer.
  • Es wird kein Zwischenobjektcode generiert, daher sind sie speichereffizient .
  • Setzt die Übersetzung des Programms fort, bis der erste Fehler auftritt. In diesem Fall wird es gestoppt. Daher ist das Debuggen einfach.

Compiler

  • Die Analyse des Quellcodes nimmt viel Zeit in Anspruch, die Gesamtausführungszeit ist jedoch vergleichsweise schneller.
  • Erzeugt einen Zwischenobjektcode, der eine weitere Verknüpfung erfordert und daher mehr Speicher benötigt.
  • Die Fehlermeldung wird erst nach dem Scannen des gesamten Programms generiert. Daher ist das Debuggen vergleichsweise schwierig.

- von: https://www.programiz.com/article/difference-compiler-interpreter

Beispiele mit Sprachen

Interpretiert

  • Python
  • Rubin
  • PHP
  • JAVA (allmächtig)
  • Perl
  • R.
  • Power Shell

zusammengestellt

  • C.
  • C ++
  • C #
  • Ziel c
  • SCHNELL
  • Fortran
Benutzer 451
quelle
Die meisten Compiler generieren keine Assemblersprache. Das Verknüpfen bedeutet nicht mehr Speicher. Quellcode-Interpreter existieren. C # wird interpretiert, oder Java und C # werden kompiliert und interpretiert. C und C ++ existieren in interpretierten Versionen, ebenso wie Fortran.
Marquis von Lorne
0

Compiler - Ein Compiler übersetzt eine Ausgangssprache in eine Zielsprache. Dann nimmt die Zielsprache Eingabe und gibt Ausgabe.

Der Compiler erzeugt einen Zielcode durch Kompilieren des Quellcodes

dann nimmt der Zielcode die Eingabe entgegen und gibt die Ausgabe aus

Interpreter - Anstatt einen Zielcode zu generieren, scheint der Interpreter die Eingabe direkt zusammen mit dem Quellcode zu übernehmen und gibt die Ausgabe aus.

Der Interpreter ordnet die Eingabe der Ausgabe mit dem Quellprogramm zu

Dann ist das vom Compiler erstellte maschinensprachliche Programm viel schneller als der Interpreter beim Zuordnen von Eingaben zu Ausgaben. Da der Interpreter das Quellprogramm zeilenweise ausführt, bietet er eine bessere Fehlerdiagnose als der Compiler.

Referenz - Compiler: Prinzipien, Techniken und Werkzeuge von Aho alias das Drachenbuch

vaibhaw.vipul
quelle
0

Was ist der Unterschied zwischen Interpreter und Compiler?

Um es direkt und intuitiv auszudrücken:

  • Der Compiler übersetzt den vom Menschen lesbaren Quellcode in Maschinencode, den der Computer lesen und ausführen kann.

  • Interpreter gibt vor, ein Computer zu sein oder simuliert ihn, um den Quellcode direkt zu lesen und auszuführen.

Infinitesimalrechnung
quelle
-1

Schauen Sie sich das PLAI- Buch an, es ist das beste Intro zur Verwirklichung der dymanischen Sprache, das ich je gefunden habe:

Programmiersprachen: Anwendung und Interpretation (c) Shriram Krishnamurthi

In diesem Buch geht es darum, Interpreter für dynamische Sprache in Schema (dr.Racket) zu schreiben. Mit ihm können Sie Ihren eigenen Interpreter für jede Sprache schreiben und einige Tipps zu OOP von hinzufügen

und SmallTalk und SOM: Simple Object Machine:

Alle modernen Interpreter enthalten Compiler im Inneren: Kompilieren von Highlevel-Elementen in einfachen, aber portablen Bytecode oder Verwenden von JIT zum Kompilieren in Maschinencode in RAM.

PS: Wenn jemand ein SmallTalk-System auf Python schreiben möchte, notiere mich bitte.

Dmitry Ponyatov
quelle
1
90% dieser Antwort ist nur Werbung.
Marquis von Lorne