it-swarm.com.de

Was sind die Unterschiede zwischen einem Just-in-Time-Compiler und einem Interpreter?

Was sind die Unterschiede zwischen einem Just-in-Time-Compiler und einem Interpreter und gibt es Unterschiede zwischen dem .NET- und dem Java JIT-Compiler?

30
Rookian

Just-in-Time-Kompilierung ist die Umwandlung von nicht-nativem Code, beispielsweise Bytecode, in nativen Code, unmittelbar bevor er ausgeführt wird.

Von Wikipedia:

JIT baut auf zwei früheren Ideen in Laufzeitumgebungen auf: Bytecode-Kompilierung und dynamische Kompilierung. Es konvertiert Code zur Laufzeit vor der nativen Ausführung, beispielsweise Bytecode, in nativen Maschinencode.

Ein Interpreter führt ein Programm aus. Es kann einen Jitter haben oder nicht.

Wieder aus Wikipedia:

Ein Interpreter kann ein Programm sein, das entweder Ist

  1. führt den Quellcode direkt aus
  2. übersetzt Quellcode in eine effiziente Zwischendarstellung (Code) und führt diese sofort aus
  3. führt explizit gespeicherten vorkompilierten Code aus, der von einem Compiler erstellt wurde, der Teil des Interpreter - Systems ist

Sowohl die Standard-Java- als auch die .NET-Distribution verfügen über eine JIT-Kompilierung, die von den Standards jedoch nicht verlangt wird. Der JIT-Compiler in .NET und C # ist natürlich unterschiedlich, da sich der Byte-Zwischencode unterscheidet. Das Prinzip ist jedoch dasselbe.

32
Mark Byers

Ich habe immer herausgefunden, dass eine abstraktere Erklärung manchmal hilft. Nehmen wir an, Sie versuchen, alle in Mexiko zu fragen: "Hallo. Wie geht es Ihnen?" (Ihre Ausgangssprache ) Natürlich müssen Sie es zuerst ins Spanische übersetzen (die Muttersprache des Landes). Diese Übersetzung wäre "Hola. Como estas?"

Wenn Sie Spanisch sprechen, müssen Sie nicht übersetzen ( native code/assembler ). Sie fragen nur "Hola. Como estas?"

Wenn Sie kein Spanisch können, gibt es drei Möglichkeiten, damit umzugehen.

Die erste besteht darin, ein spanisches Wörterbuch (a compiler ) zu erhalten und nachzuschauen, was die spanischen Wörter sind, bevor Sie gehen. Vielleicht ist dir klar, dass "Hola. Que tal?" ist eine Silbe kürzer ( Compileroptimierung ) und verwendet stattdessen diese. Dies ist Sprachzusammenstellung ; Sie konvertieren die Informationen zuvor in die Muttersprache. 

Die zweite ist, wo Sie die Wörter im spanischen Wörterbuch nachschlagen, während Sie vor der ersten Person stehen, und dann das Ergebnis speichern (nachschlagen der Wörter just-in-time ). Der Vorteil hier ist, dass Sie ein Mandarin-Wörterbuch erhalten und dann dasselbe Experiment in China durchführen können, ohne zehn Haftnotizen ( Binärdateien für verschiedene Plattformen ) übersetzter Sätze aufbewahren zu müssen.

Die dritte ist, wo Sie die Wörter nachschlagen, während Sie vor jeder Person stehen. Im Wesentlichen interpretieren Sie die Wörter für jede Person separat (Sie fungieren als Interpreter ). Der Vorteil hier ist, dass alle Änderungen sofort mit der nächsten Person reflektiert werden (Sie könnten zu "Hallo" wechseln. Welche Farbe hat Ihr Hund?), Ohne nach Hause fliegen zu müssen und neu zu starten - Sie müssen nicht neu kompilieren die Phrasen).

  • Wenn Sie vorab übersetzen, können Sie die Personen am schnellsten fragen ( Pre-Compiliation ); Sie müssen nicht einmal das Wörterbuch mitbringen.
  • Das Übersetzen, wenn Sie die erste Person in jedem Land sehen, ist fast so schnell wie das Übersetzen im Voraus, aber Sie können trotzdem in mehrere Länder reisen, ohne nach Hause gehen zu müssen, um ein Wörterbuch zu erhalten. Sie müssen jedoch mehrere Wörterbücher mitbringen ( eine plattformunabhängige Laufzeit ).
  • Das Übersetzen auf Abruf ist viel langsamer, aber Sie können die Wörter ändern, ohne nach Hause zu fahren ( source distribution language ).
30

Ein Interpreter generiert für jeden Befehl sofort Maschinencodeanweisungen, unabhängig davon, ob er zuvor ausgeführt wurde.
Ein JIT speichert die Anweisungen, die zuvor in Maschinencode interpretiert wurden, im Cache und verwendet diese systemeigenen Maschinencode-Anweisungen. Dadurch werden Zeit und Ressourcen gespart, da Anweisungen, die bereits interpretiert wurden, nicht erneut interpretiert werden müssen.

13
crowne

Die Frage, ob eine Ausführungsmaschine ein Compiler oder ein Interpreter ist, kann sehr einfach beantwortet werden, indem geprüft wird, was passiert, wenn eine Routine 1000-mal ausgeführt wird. Wenn Code in der Ausführungsmaschine 1.000 bestimmte Male eine bestimmte Darstellung des Codes untersuchen muss, ist die Ausführungsmaschine ein Interpretierer dieser Darstellung. Wenn Code innerhalb der Ausführung die Ausführungsmaschine nur diese bestimmte Repräsentation des Codes einige Male (in der Regel, jedoch nicht notwendigerweise einmalig) untersuchen muss, handelt es sich um einen Compiler oder Übersetzer dieser Repräsentation. Beachten Sie, dass es sehr üblich ist, dass eine Ausführungsmaschine den Eingabecode in eine andere Form umwandelt, die sich leichter untersuchen lässt. Eine solche Ausführungsmaschine würde einen Compiler oder Übersetzer der ersten Form mit einem Interpreter der letzteren Form kombinieren.

Beachten Sie, dass Interpreter sehr selten Maschinencode erzeugen. Ein Interpreter kann nur dann einen Maschinencode erzeugen, wenn eine Anweisung eine Operation ausführen soll, die auf keine andere Weise ausgeführt werden kann. Wenn zum Beispiel ein BASIC-Interpreter auf dem 8080 auf die Anweisung "OUT 100,5" trifft, führt er diese Operation normalerweise durch Speichern von D3 64 C9 (OUT 64h/RET) in drei aufeinanderfolgenden Bytes an einer festen Adresse aus, wobei A mit geladen wird 5 und diese Adresse anrufen. Der Interpreter kann technisch gesehen Maschinencode generieren, aber wenn man den gleichen OUT-Befehl 500-mal ausführen würde, müsste der Interpreter den Maschinencode jedes Mal neu generieren.

6
supercat

tl; dr

Interpreter : benötigt jeweils nur eine Anweisung zur Ausführung

Just-in-time : Nimmt einen Codeblock auf einmal und kompiliert ihn vor der Ausführung. hat also viel Raum zur Optimierung 

2
del bao

Der JIT-Compiler erzeugt binäre Maschinencodes, die Blockquellcode übersetzen. Der Interpreter übersetzt Zeile für Zeile.

2
erasmus

Wenn zum ersten Mal auf eine Klasse verwiesen wird, kompiliert die JIT Execution Engine die von Java Compiler generierten .class-Dateien (primäre Binärdateien) mit JVM-Befehlssatz in Binärdateien mit dem Befehlssatz des Host-Systems. JIT speichert diese neu kompilierten Binärdateien aus dem Speicher in Zukunft und verwendet sie, indem sie die Interpretationszeit reduziert und die Ausführung von nativem Code nutzt. 

Auf der anderen Seite interpretiert ein einfacher alter Java-Interpreter jeweils einen JVM-Befehl aus der Klassendatei und ruft eine Prozedur dagegen auf.

Einen Detailvergleich finden Sie hier http://bitshub.blogspot.com/2010/01/Flavors-of-JVM.html

1
bitan

Wenn Sie eine Microsoft.NET-Sprache kompilieren, generiert der Komplementär Code, der in der Microsoft Intermediate Language (MSIL) geschrieben ist. MSIL besteht aus einer Reihe von Anweisungen, die schnell in nativen Code übersetzt werden können.

Eine Microsoft .NET-Anwendung kann nur ausgeführt werden, nachdem der MSIL-Code in nativen Maschinencode übersetzt wurde. In .NET Framework wird die Zwischensprache "just in time" (JIT) in nativen Code umgesetzt, wenn die Anwendung oder Komponente ausgeführt wird, anstatt die Anwendung zur Entwicklungszeit zu kompilieren.

Mehr Info

0
Kimi