Frage

Was ist speziell ein JIT-Compiler zu einem nicht-JIT-Compiler im Gegensatz zu tun? Kann jemand eine prägnante und leicht geben Beschreibung zu verstehen?

War es hilfreich?

Lösung

Ein JIT-Compiler läuft nach hat das Programm gestartet und kompiliert den Code (in der Regel Bytecode oder irgendeine Art von VM-Anweisungen) on the fly (oder just-in-time, wie es genannt wird) in eine bilden, das ist in der Regel schneller, in der Regel des nativen Befehlssatz des Host-CPU. Ein JIT hat Zugriff auf dynamische Laufzeitinformationen während eines Standard-Compiler nicht und bessere Optimierungen wie inlining Funktionen machen können, die häufig verwendet werden.

Dies steht im Gegensatz zu einem herkömmlichen Compiler, der stellt alle der Code in Maschinensprache vor ist das Programm zum ersten Mal ausgeführt.

In Anlehnung an konventionelle Compiler bauen das ganze Programm als EXE-Datei vor dem ersten Mal, wenn Sie es laufen. Bei neueren Stil-Programmen wird eine Baugruppe mit Pseudo-Code (P-Code) erzeugt. Erst wenn Sie das Programm auf dem OS ausführen (zB durch einen Doppelklick auf das entsprechende Symbol) wird der Compiler (JIT) Tritt in und Maschinencode (m-Code) erzeugen, dass die Intel-basierten Prozessor oder was auch immer verstehen.

Andere Tipps

Am Anfang ein Compiler war verantwortlich für das Drehen einer Hochsprache (definiert als höher als Assembler) in einen Objektcode (Maschinenbefehle), die dann (über einen Linker) verknüpft werden, würde in ein ausführbares.

An einem Punkt in der Entwicklung der Sprache, würde Compiler eine höhere Programmiersprache in Pseudo-Code kompilieren, die dann (von einem Dolmetscher) interpretiert werden würden Ihr Programm auszuführen. Dies eliminiert den Objektcode und ausführbare Dateien und erlaubt diese Sprachen tragbar mehrere Betriebssysteme und Hardware-Plattformen. Pascal (die P-Code kompiliert) war eines der ersten; Java und C # sind neuere Beispiele. Schließlich wurde der Begriff P-Code mit Bytecode ersetzt, da die meisten der pseudo-Operationen ein Byte lang sind.

Ein Just-In-Time (JIT) Compiler ist ein Merkmal der Laufzeit-Interpreter, dass anstelle Bytecode interpretiert jedes Mal eine Methode aufgerufen wird, wird den Bytecode in die Maschinencode Anweisungen der laufenden Maschine kompilieren, und dann rufen Sie stattdessen diesen Objektcode. Idealerweise wird die Effizienz der Objektcode ausgeführt wird, die Ineffizienz der neu zu kompilieren das Programm jedes Mal, es läuft.

überwinden

JIT-Just in time das Wort selbst sagt, wenn es gebraucht wird (auf Anfrage)

Typisches Szenario:

Der Quellcode vollständig in Maschinencode umgewandelt wird

JIT-Szenario:

Der Quellcode wird artige Struktur in Assembler-Sprache umgewandelt werden [für ex IL (Zwischensprache) für C #, ByteCode für Java].

Der Zwischencode in der Maschinensprache umgewandelt wird nur dann, wenn die Anwendung benötigt, die Codes erforderlich ist, nur in Maschinencode umgewandelt werden.

JIT vs Non-JIT Vergleich:

  • In JIT nicht den gesamten Code in Maschinencode umgewandelt wird zunächst ein Teil der Code, der notwendig ist, wird in Maschinencode umgewandelt werden dann, wenn eine Methode aufgerufen oder Funktionalität in Maschine dann nicht, dass wird in Maschinencode umgewandelt werden ... es reduziert Belastung der CPU.

  • Wie der Code Maschine auf Laufzeit generiert werden .... die JIT Compiler Maschinencode erzeugt, die optimiert ist für den Betrieb Maschine CPU-Architektur.

JIT Beispiele:

  1. In Java JIT ist in JVM (Java Virtual Machine)
  2. In C # ist es in CLR (Common Language Runtime)
  3. In Android in DVM (Dalvik Virtual Machine) ist, oder ART (Android Runtime) in neueren Versionen.

Wie andere erwähnt haben

JIT steht für Just-in-Time, die diesen Code bedeutet kompiliert wird, wenn es benötigt wird, nicht vor der Laufzeit.

Nur einen Punkt oben Diskussion hinzuzufügen JVM eine Zählung unterhält ab, wie viel Zeit eine Funktion ausgeführt wird. Wenn diese Zählung ein vorgegebener Grenzwert überschreitet JIT den Code in Maschinensprache kompiliert, die direkt durch den Prozessor ausgeführt werden können (im Gegensatz zu dem normalen Fall, in dem Javac den Code in Bytecode kompiliert und dann Java - der Interpreter interpretiert dies Bytecode zeilen wandeln es in Maschinencode und führt).

Auch diese Funktion der nächste Mal berechnet gleicher kompilierte Code wird wieder im Gegensatz zu normaler Interpretation ausgeführt, in der der Code wieder Zeile für Zeile interpretiert wird. Dies macht die Ausführung schneller.

JIT-Compiler kompiliert nur die Byte-Code zu äquivalenten nativen Code auf den ersten Ausführung. Bei jeder aufeinanderfolgenden Ausführung verwendet die JVM lediglich den bereits kompilierten nativen Code zu optimieren.

 image description hier

Ohne JIT-Compiler, der JVM-Interpreter übersetzt die Byte-Code-Zeile-für-Zeile, um es als erscheinen, wenn eine native Anwendung ausgeführt wird.

 image description hier

Quelle

JIT steht für Just-in-Time, die diesen Code bedeutet kompiliert wird, wenn es benötigt wird, nicht vor der Laufzeit.

Dies ist vorteilhaft, da der Compiler Code erzeugen kann, die für die jeweilige Maschine optimiert ist. Ein statischer Compiler, wie der Durchschnittswert der C-Compiler, wird der gesamte Code auf ausführbaren Code auf der Entwickler-Maschine kompilieren. Daher wird der Compiler-Optimierungen führen auf einigen Annahmen. Es kann langsamer kompilieren und Optimierungen tun, weil es nicht die Ausführung des Programms für den Benutzer verlangsamt wird.

Nach dem Byte-Code (die Architektur neutral ist) durch die Java-Compiler erzeugt worden ist, wird die Ausführung durch die JVM gehandhabt wird (Java). Der Byte-Code wird auf JVM vom Lader geladen in und dann jedem Byte-Befehl interpretiert wird.

Wenn wir eine Methode mehrfach aufrufen müssen, müssen wir die gleichen Code oft interpretieren und dies kann mehr Zeit in Anspruch nehmen als nötig. So haben wir die JIT (Just-in-Time) Compiler. Wenn das Byte wurde in JVM (seine Laufzeit), der gesamte Code und nicht interpretiert werden kompiliert geladen wird, das spart Zeit.

JIT Compiler funktioniert nur während der Laufzeit, so dass wir haben keine binäre Ausgabe.

Just In Time-Compiler (JIT):
Es kompiliert das Java-Bytecode in Maschinenbefehle dieser spezifischen CPU.

Zum Beispiel, wenn wir eine Schleife Aussage in unserem Java-Code haben:

while(i<10){
    // ...
    a=a+i;
    // ...
 }

Der obige Schleife Code läuft für 10 Mal, wenn der Wert von I 0 ist.

Es ist nicht notwendig, die Bytecode für 10 Mal immer wieder als die gleiche Anweisung zu kompilieren wird für 10-mal auszuführen. In diesem Fall ist es notwendig, dass Code nur einmal zu kompilieren und der Wert kann für die erforderliche Anzahl von Malen geändert werden. Also, Just In Time (JIT) Compiler verfolgt die Spuren solcher Aussagen und Methoden (wie oben bereits erwähnt) und kompiliert solche Stücke von Byte-Code in Maschinencode für eine bessere Leistung.

Ein weiteres ähnliches Beispiel ist, dass die Suche nach einem Muster „Regular Expression“ in einer Liste von Strings / Sätzen verwenden.

JIT-Compiler nicht kompiliert den gesamten Code in Maschinencode. Es kompiliert Code, der ein ähnliches Muster zur Laufzeit hat.

Sehen Sie diese Oracle-Dokumentation auf JIT verstehen um mehr zu lesen.

Sie haben Code, der in eine IL (Zwischensprache) compliled wird. Wenn Sie Ihr Programm ausführen, wird der Computer nicht diesen Code verstehen. Es versteht nur nativen Code. So ist der JIT-Compiler kompiliert Ihre IL in nativen Code on the fly. Er tut dies auf der Methode Ebene.

Ich weiß, das ist ein alter Thread, aber Laufzeitoptimierung ist ein weiterer wichtiger Bestandteil der JIT-Kompilierung, die hier nicht diskutiert werden muss scheint. Grundsätzlich kann der JIT-Compiler das Programm überwachen, wie es läuft Möglichkeiten, um zu bestimmen, die Ausführung zu verbessern. während der Laufzeit - dann kann es diese Änderungen im laufenden Betrieb machen. Google JIT-Optimierung (Javaworld hat eine ziemlich guter Artikel über sie. )

Jit steht für Just in Time Compiler jit ist ein Programm, das Java-Bytecode in Anweisung dreht, die direkt an den Prozessor gesendet werden können.

, um die Verwendung von Java Just in Time-Compiler (wirklich ein zweiter Compiler) an der jeweiligen Systemplattform die Bytecode in bestimmten Systemcode entspricht, wenn der Code durch den JIT-Compiler neu kompiliert wurde, wird es in der Regel läuft schneller in der Computer.

Die Just-in-Time-Compiler mit der virtuellen Maschine kommen und optional verwendet wird. Es kompiliert die Bytecode in plattformspezifischen ausführbaren Code, der sofort ausgeführt wird.

A just in time-Compiler (JIT) ist eine Software, die eine nicht ausführbare Eingabe nimmt empfängt und gibt den entsprechenden Maschinencode ausgeführt werden. Zum Beispiel:

Intermediate representation    JIT    Native machine code for the current CPU architecture

     Java bytecode            --->        machine code
     Javascript (run with V8) --->        machine code

Die Folge davon ist, dass für eine bestimmte CPU-Architektur des entsprechende JIT-Compiler muss installiert sein.

Differenz Compiler, Interpreter und JIT

Es gibt zwar Ausnahmen können in der Regel, wenn wir Quellcode in Maschinencode verwandeln wollen wir verwenden können:

  1. Compiler : Nimmt Quellcode und gibt eine ausführbare Datei
  2. Interpreter : Führt das Programm Anweisung für Anweisung. Es dauert ein ausführbares Segment des Quellcodes und dreht das Segment in Maschinenbefehle. Dieser Vorgang wiederholt sich, bis alle Quellcode in Maschinenbefehle umgewandelt und ausgeführt wird.
  3. JIT : Viele verschiedene Implementierungen eines JIT sind jedoch möglich eine JIT ist in der Regel eine Kombination aus einem Compilers und einen Dolmetscher. Der JIT drehen ersten Vermittler Daten (z.B. Java-Bytecode), die es in die Maschinensprache durch Auslegung erhält. Ein JIT kann oft sinnvoll, wenn ein bestimmte Teil des Codes oft ausgeführt wird, und das wird diesen Teil für eine schnellere Ausführung kompilieren.

Ein nicht-JIT-Compiler nimmt Quellcode und wandelt sie in maschinenspezifische Byte-Code während der Kompilierung. Ein JIT-Compiler nehmen Maschine Agnostiker Byte-Code, der bei der Kompilierung und wandelt sie in maschinenspezifische Byte-Code zur Laufzeit generiert wurde. Der JIT-Compiler, der Java verwendet ist, was ein einziges binäres ermöglicht auf einer Vielzahl von Plattformen ohne Änderungen ausgeführt werden.

just-in-time (JIT) Kompilierung (auch dynamische Übersetzung oder Laufzeit Kompilierung), ist eine Art und Weise Computercode auszuführen , die Zusammenstellung während der Ausführung beinhaltet ein Programm - zur Laufzeit -. nicht vor der Ausführung

IT Compilation ist eine Kombination aus die beiden traditionellen Ansätze zur Übersetzung in Maschinencode - -Voraus-Kompilierung (AOT) und Interpretation - und vereint sowohl einige Vorteile und Nachteile. JIT-Kompilierung kombiniert die Geschwindigkeit von kompilierten Code mit der Flexibilität der Interpretation .

Lassen Sie uns JIT in JVM verwendet betrachten,

Zum Beispiel erzeugt die HotSpot JVM JIT Compiler dynamische Optimierungen. Mit anderen Worten: sie Optimierungsentscheidungen zu treffen, während die Java-Anwendung ausgeführt wird und erzeugen leistungsstarke nativen Maschinenbefehle für die zugrunde liegende Systemarchitektur ausgerichtet.

Wenn ein Verfahren zur Kompilierung ausgewählt wird, führt die JVM seine Bytecode auf die Just-In-Time-Compiler (JIT). Der JIT muss die Semantik und Syntax der Bytecode verstehen, bevor sie das Verfahren korrekt zusammenstellen können. Damit ist die JIT-Compiler analysieren die Methode, seine Bytecode zunächst in einer internen Darstellung genannt Spur Bäume neu formuliert, der engen Maschinencode ähnelt als Bytecode. Analyse und Optimierungen werden dann an den Bäumen des Verfahrens durchgeführt. Am Ende werden die Bäume in nativen Code übersetzt.

  

Eine Spur Baum ist eine Datenstruktur, die in der Runtime-Kompilierung von Programmcode verwendet wird. Trace Bäume werden in einer Art von ‚just in time-Compiler‘ verwendet, die die Ausführung von Code während Hotspots Spuren und kompilieren. Siehe diese .

Siehe:

20% des Bytecode 80% der Zeit verwendet. Der JIT-Compiler wird diese Statistiken und optimiert diesen 20% des Codes Byte schneller laufen durch Inline-Verfahren das Hinzufügen, Entfernen von nicht verwendeten Schlösser etc und auch den Bytecode spezifisch für diese Maschine zu schaffen. Ich zitiere aus diesem Artikel, ich fand es war praktisch. http://java.dzone.com/articles/just-time-compiler -jit-Hotspot

JIT bezieht sich auf Ausführungs-Engine in einigen der JVM-Implementierungen, eine, die schneller ist, aber mehr Speicher benötigt, ist eine Just-in-Time-Compiler. In diesem Schema werden die Bytecode eines Verfahrens zu nativen Maschinencode kompiliert das erste Mal, wird die Methode aufgerufen. Der nativen Maschinencode für das Verfahren wird dann zwischengespeichert, so kann es das nächste Mal wiederverwendet wird, dass gleiche Methode aufgerufen wird.

JVM führt tatsächlich Kompilierung Schritte während der Laufzeit aus Leistungsgründen. Dies bedeutet, dass Java nicht eine saubere Kompilierung Ausführung Trennung hat. Es spielt zunächst eine so genannte statische Kompilierung von Java-Quellcode-Bytecode. Dann wird diese Bytecode auf die JVM zur Ausführung übergeben. Aber Bytecode Ausführung ist langsam, so dass die JVM misst, wie oft der Bytecode ausgeführt wird, und wenn es ein „Hotspot“ von Code erkennt, dass sehr häufig laufen gelassen führt er die dynamische Kompilierung von Bytecode Maschinencode des „Hotspot“ Code (Hotspot-Profiler). So effektiv heute Java-Programme werden von Maschinencode Ausführung ausgeführt werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top