646 Stimmen

Was macht ein Just-in-Time-Compiler (JIT)?

Was macht ein JIT-Compiler speziell im Gegensatz zu einem Nicht-JIT-Compiler? Kann jemand eine knappe und leicht verständliche Beschreibung geben?

1 Stimmen

2 Stimmen

2 Stimmen

見つけた youtube.com/watch?v=yQ27DjKnxwo um nützlich zu sein.

623voto

Mark Cidade Punkte 95914

Ein JIT-Compiler läuft nach Das Programm wurde gestartet und kompiliert den Code (in der Regel Bytecode oder eine Art von VM-Befehlen) während der Ausführung (oder Just-in-Time, wie es genannt wird) in eine Form, die in der Regel schneller ist, in der Regel den nativen Befehlssatz der Host-CPU. Ein JIT hat Zugang zu dynamischen Laufzeitinformationen, während ein Standardcompiler dies nicht hat, und kann bessere Optimierungen vornehmen, wie z. B. das Inlining von Funktionen, die häufig verwendet werden.

Dies steht im Gegensatz zu einem herkömmlichen Compiler, der Folgendes kompiliert 何れも den Code in Maschinensprache antes de das Programm zum ersten Mal ausgeführt wird.

Um es kurz zu machen: Herkömmliche Compiler erstellen das gesamte Programm als EXE-Datei, BEVOR Sie es zum ersten Mal ausführen. Für neuere Programme wird eine Baugruppe mit Pseudocode (p-code) erzeugt. Erst NACH dem Ausführen des Programms auf dem Betriebssystem (z. B. durch Doppelklick auf das Symbol) setzt der (JIT-)Compiler ein und generiert Maschinencode (m-Code), den der Intel-Prozessor oder was auch immer verstehen wird.

32 Stimmen

Im Gegensatz zu interpretiertem Code, der die Bytecode- oder VM-Befehle sofort und ohne Verzögerung ausführt, werden die Befehle jedoch langsamer als in Maschinensprache ausgeführt.

5 Stimmen

Ein JIT wird oft mit interpretiertem Code verwendet, um ihn in Maschinensprache umzuwandeln, aber ja, rein interpretierter Code (ohne JITting) ist langsam. Selbst Java-Bytecode ohne JITter ist wirklich langsam.

57 Stimmen

Das Ziel muss aber nicht unbedingt Maschinencode sein. JRuby hat einen JIT-Compiler, der Ruby-Quellcode nach ein paar Aufrufen in Java-Bytecode kompiliert. Nach ein paar weiteren Aufrufen schaltet sich der JVM JIT-Compiler ein und kompiliert den Bytecode in nativen Code.

289voto

Craig Trader Punkte 15283

Ursprünglich war ein Compiler dafür zuständig, eine Hochsprache (die als höheres Niveau als Assembler definiert ist) in Objektcode (Maschinenbefehle) umzuwandeln, der dann (durch einen Linker) zu einer ausführbaren Datei verknüpft wurde.

Zu einem bestimmten Zeitpunkt in der Entwicklung von Sprachen kompilierten Compiler eine Hochsprache in Pseudocode, der dann (von einem Interpreter) interpretiert wurde, um das Programm auszuführen. Dadurch entfielen der Objektcode und die ausführbaren Dateien, und diese Sprachen konnten auf verschiedene Betriebssysteme und Hardwareplattformen übertragen werden. Pascal (das zu P-Code kompiliert wurde) war eine der ersten Sprachen; Java und C# sind neuere Beispiele. Schließlich wurde der Begriff P-Code durch Bytecode ersetzt, da die meisten Pseudooperationen nur ein Byte lang sind.

Ein Just-In-Time-Compiler (JIT) ist eine Funktion des Laufzeitinterpreters, die den Bytecode nicht jedes Mal interpretiert, wenn eine Methode aufgerufen wird, sondern den Bytecode in die Maschinencode-Anweisungen der laufenden Maschine kompiliert und dann stattdessen diesen Objektcode aufruft. Im Idealfall wird die Effizienz der Ausführung von Objektcode die Ineffizienz der Neukompilierung des Programms bei jeder Ausführung überwinden.

5 Stimmen

Doch dieser Satz "Ein Just-In-Time-Compiler (JIT) ist eine Funktion des Laufzeit-Interpreters". verursacht Verwirrung; z.B. - stackoverflow.com/questions/16439512/

12 Stimmen

Eigentlich war JIT ein Add-on, und man kann es immer noch mit dem Parameter -Xint in Java deaktivieren, es ist also nur eine Funktion.

0 Stimmen

@CraigTrader - Der Hotspot JIT-Compiler ist seit Java 1.3 ein untrennbarer Bestandteil der Hotspot JVMs. Heutzutage ist es verwirrend, ihn "eine Funktion des Interpreters" zu nennen. Und die Tatsache, dass Sie die JIT-Kompilierung deaktivieren können, ist orthogonal.

81voto

Durai Amuthan.H Punkte 30175

JIT - Just in time das Wort selbst sagt, wann es gebraucht wird (on demand)

Typisches Szenario:

Der Quellcode wird vollständig in Maschinencode umgewandelt

JIT-Szenario:

Der Quellcode wird in eine assemblerähnliche Struktur umgewandelt [z.B. IL (intermediate language) für C#, ByteCode für Java].

Der Zwischencode wird nur dann in Maschinensprache umgewandelt, wenn die Anwendung dies erfordert.

JIT vs. Nicht-JIT-Vergleich:

  • Bei JIT wird nicht der gesamte Code in Maschinencode umgewandelt, sondern erst ein Teil des Codes, der notwendig ist, in Maschinencode umgewandelt Wenn dann eine Methode oder Funktionalität aufgerufen wird, die nicht im Maschinencode enthalten ist, wird diese in Maschinencode umgewandelt... das reduziert die Belastung der CPU.

  • Da der Maschinencode zur Laufzeit erzeugt wird...., wird der JIT Compiler Maschinencode, der für die CPU-Architektur der laufenden Maschine optimiert ist. die CPU-Architektur der Maschine optimiert ist.

JIT-Beispiele:

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

8 Stimmen

JIT bietet einige besondere Vorteile in Frameworks mit Unterstützung für echte generische Typen; es ist möglich, eine generische Methode zu definieren, die in der Lage wäre, eine unbegrenzte Anzahl von Typen zu erzeugen, von denen jeder einen anderen Maschinencode erfordern würde, aber das JIT erzeugt nur Code für die Typen, die tatsächlich erzeugt werden. Im Gegensatz dazu ist es in C++ erforderlich, dass der Compiler Code für alle Typen erzeugt, die ein Programm jemals verwenden wird.

8 Stimmen

Die JVM führt beim ersten Mal keinen JIT-Code aus. Die ersten paar Male interpretiert sie den Bytecode. Wenn der Code dann oft genug ausgeführt wird, kann es sein, dass sie sich die Mühe macht, ihn zu jitten.

1 Stimmen

Sie sagen, JIT in Java ist JVM. Aber wir liefern den kompilierten Code bereits an die JVM, nicht wahr? Dann kompiliert sie ihn wieder, meinen Sie?

38voto

Aniket Thakur Punkte 62911

Wie andere bereits erwähnt haben

JIT steht für Just-in-Time, was bedeutet, dass der Code kompiliert wird, wenn er benötigt wird, und nicht vor der Laufzeit.

Nur um einen Punkt zur obigen Diskussion hinzuzufügen, führt die JVM einen Zähler, wie oft eine Funktion ausgeführt wurde. Übersteigt diese Anzahl eine vordefinierte Grenze, kompiliert JIT den Code in Maschinensprache, die direkt vom Prozessor ausgeführt werden kann (im Gegensatz zum normalen Fall, in dem javac den Code in Bytecode kompiliert und dann Java - der Interpreter interpretiert diesen Bytecode Zeile für Zeile, wandelt ihn in Maschinencode um und führt ihn aus).

Auch beim nächsten Mal, wenn diese Funktion berechnet wird, wird derselbe kompilierte Code erneut ausgeführt, im Gegensatz zur normalen Interpretation, bei der der Code erneut Zeile für Zeile interpretiert wird. Das macht die Ausführung schneller.

16voto

Brian Lyttle Punkte 14413

JIT steht für Just-in-Time, was bedeutet, dass der Code kompiliert wird, wenn er benötigt wird, und nicht vor der Laufzeit.

Dies hat den Vorteil, dass der Compiler Code erzeugen kann, der für Ihren speziellen Rechner optimiert ist. Ein statischer Compiler, wie z. B. ein durchschnittlicher C-Compiler, kompiliert den gesamten Code zu ausführbarem Code auf dem Rechner des Entwicklers. Daher führt der Compiler Optimierungen auf der Grundlage einiger Annahmen durch. Er kann langsamer kompilieren und mehr Optimierungen vornehmen, da er die Ausführung des Programms für den Benutzer nicht verlangsamt.

0 Stimmen

Warum werden die kompilierten Codes nicht irgendwo auf dem Computer des Benutzers gespeichert, so dass JIT sie bei der nächsten Ausführung der Anwendung nicht erneut kompilieren muss?

0 Stimmen

Gute Beobachtungen. Es ist möglich, dies zu tun, aber ob es tatsächlich von Vorteil ist, hängt von der Plattform und der Verwendung der App ab. JIT-Optimierung ist nicht notwendigerweise dasselbe wie Offline- oder Vorab-Optimierung, so dass der Vorteil möglicherweise nur darin besteht, dass keine JIT-Optimierung stattfindet, was hilfreich sein kann, aber nicht muss.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X