Gerade rechtzeitig Kompilation

In der Computerwissenschaft gerade rechtzeitig sind Kompilation (JIT), auch bekannt als dynamische Übersetzung, eine Methode, das Zeitverhalten von Computerprogrammen zu verbessern. Historisch hatten Computerprogramme zwei Weisen der Laufzeitoperation, entweder interpretiert oder statisch (vorzeitig) Kompilation. Interpretierter Code wird von einer höheren Programmiersprache bis einen Maschinencode unaufhörlich während jeder Ausführung übersetzt, wohingegen statisch kompilierter Code in den Maschinencode vor der Ausführung übersetzt wird, und nur diese Übersetzung einmal verlangt.

JIT Bearbeiter vertreten eine hybride Annäherung mit der Übersetzung, die unaufhörlich, als mit Dolmetschern, aber mit dem Verstecken des übersetzten Codes vorkommt, um Leistungsdegradierung zu minimieren. Es bietet sich auch andere Vorteile haben statisch Code in der Entwicklungsdauer, wie das Berühren von spät gebundenen Datentypen und der Fähigkeit kompiliert, Sicherheitsgarantien geltend zu machen.

JIT baut auf zwei frühere Ideen in Laufzeitumgebungen: Bytecode-Kompilation und dynamische Kompilation. Es wandelt Code an der Durchlaufzeit vor der Durchführung davon heimisch, zum Beispiel bytecode in den heimischen Maschinencode um.

Mehrere moderne Laufzeitumgebungen, wie das.NET Fachwerk des Microsofts und die meisten Durchführungen Javas, verlassen sich auf die JIT Kompilation für die Hochleistungscodeausführung.

Übersicht

In einem bytecode-kompilierten System wird Quellcode zu einer Zwischendarstellung bekannt als bytecode übersetzt. Bytecode ist nicht der Maschinencode für jeden besonderen Computer, und kann unter Computerarchitekturen tragbar sein. Der bytecode kann dann dadurch interpretiert, oder auf, eine virtuelle Maschine geführt werden. Der JIT Bearbeiter liest den bytecodes in vielen Abteilungen (oder vollständig, selten) und kompiliert sie dynamisch in die Maschinensprache, so kann das Programm schneller laufen. Java führt Laufzeitkontrollen über verschiedene Abteilungen des Codes durch, und das ist der Grund der komplette Code wird sofort nicht kompiliert. Das kann pro Datei pro Funktion oder sogar auf jedem willkürlichen Codebruchstück getan werden; der Code kann kompiliert werden, wenn er im Begriff ist (folglich der Name "gerade rechtzeitig") durchgeführt, und dann versteckt und später wiederverwendet zu werden, ohne wiederkompiliert werden zu müssen.

Im Gegensatz wird eine traditionelle interpretierte virtuelle Maschine einfach den bytecode allgemein mit der viel niedrigeren Leistung interpretieren. Einige Dolmetscher interpretieren sogar Quellcode ohne den Schritt des ersten Kompilierens zu bytecode mit der noch schlechteren Leistung. Statisch kompilierter Code oder heimischer Code werden vor der Aufstellung kompiliert. Eine dynamische Kompilationsumgebung ist diejenige, in der der Bearbeiter während der Ausführung verwendet werden kann. Zum Beispiel haben Allgemeinste Lispeln-Systeme eine Funktion, die neue während des Laufs geschaffene Funktionen kompilieren kann. Das stellt viele der Vorteile von JIT zur Verfügung, aber der Programmierer, aber nicht die Durchlaufzeit, ist in der Kontrolle dessen, welche Teile des Codes kompiliert werden. Das kann auch dynamisch erzeugten Code kompilieren, der, in vielen Drehbüchern, wesentliche Leistungsvorteile zur Verfügung stellen kann, statisch hat Code, sowie über die meisten JIT Systeme kompiliert.

Ein gemeinsames Ziel, JIT Techniken zu verwenden, ist, die Leistung der statischen Kompilation zu erreichen oder zu übertreffen, während es die Vorteile der bytecode Interpretation aufrechterhält: Viel vom "schweren Heben", den ursprünglichen Quellcode grammatisch zu analysieren und grundlegende Optimierung durchzuführen, wird häufig während der Übersetzung vor der Aufstellung behandelt: Die Kompilation von bytecode bis Maschinencode ist viel schneller als das Kompilieren von der Quelle. Der aufmarschierte bytecode ist verschieden vom heimischen Code tragbar. Da die Durchlaufzeit Kontrolle über die Kompilation wie interpretierter bytecode hat, kann es in einem sicheren Sandkasten laufen. Bearbeiter von bytecode bis Maschinencode sind leichter zu schreiben, weil der tragbare bytecode Bearbeiter bereits viel von der Arbeit getan hat.

JIT Code bietet allgemein viel bessere Leistung an als Dolmetscher. Außerdem kann es in einigen Fällen bessere Leistung anbieten als statische Kompilation, weil viele Optimierungen nur an der Durchlaufzeit ausführbar sind:

  1. Die Kompilation kann zur ins Visier genommenen Zentraleinheit und dem Betriebssystemmodell optimiert werden, wohin die Anwendung läuft. Zum Beispiel kann JIT SSE2 Zentraleinheitsinstruktionen wählen, wenn er entdeckt, dass die Zentraleinheit sie unterstützt. Um dieses Niveau der Optimierungsgenauigkeit mit einem statischen Bearbeiter zu erhalten, muss man entweder eine Dualzahl für jede beabsichtigte Plattform/Architektur kompilieren, oder vielfache Versionen von Teilen des Codes innerhalb einer einzelnen Dualzahl einschließen.
  2. Das System ist im Stande, Statistik darüber zu sammeln, wie das Programm wirklich in der Umgebung läuft, in der es ist, und es umordnen und für die optimale Leistung wiederkompilieren kann. Jedoch können einige statische Bearbeiter auch Profil-Information als Eingang nehmen.
  3. Das System kann globale Codeoptimierungen (z.B inlining von Bibliotheksfunktionen) tun, ohne die Vorteile der dynamischen Verbindung und ohne die allgemeinen Kosten zu verlieren, die zu statischen Bearbeitern und linkers innewohnend sind. Spezifisch, wenn er globale Reihenersetzungen tut, kann ein statischer Kompilationsprozess Laufzeitkontrollen brauchen und sicherstellen, dass ein virtueller Anruf vorkommen würde, wenn die wirkliche Klasse des Gegenstands die inlined Methode überreitet, und Grenzbedingungskontrollen über Reihe-Zugänge eventuell innerhalb von Schleifen bearbeitet werden müssen. Mit gerade rechtzeitig der Kompilation in vielen Fällen kann diese Verarbeitung aus Schleifen bewegt werden, häufig große Zunahmen der Geschwindigkeit gebend.
  4. Obwohl das mit gesammelten Sprachen des statisch kompilierten Mülls möglich ist, kann ein bytecode System leichter durchgeführten Code für die bessere Anwendung des geheimen Lagers umordnen.

Anlauf-Verzögerung und Optimierungen

JIT veranlasst normalerweise eine geringe Verzögerung in der anfänglichen Ausführung einer Anwendung wegen der Zeit, die gebracht ist, den bytecode zu laden und zu kompilieren. Manchmal wird diese Verzögerung "Anlauf-Verzögerung" genannt. Im Allgemeinen, je mehr Optimierung, die JIT durchführt, desto besser der Code es erzeugen wird, aber die anfängliche Verzögerung wird auch zunehmen. Ein JIT Bearbeiter muss deshalb einen Umtausch zwischen der Übersetzungszeit und der Qualität des Codes machen, den es hofft zu erzeugen. Jedoch scheint es, dass so viel von der Anlauf-Zeit manchmal wegen IO-bound Operationen aber nicht JIT Kompilation ist (zum Beispiel, die rt.jar Klassendatendatei für Java Virtuelle Maschine ist 40 Mb, und der JVM viele Daten in dieser kontextuell riesigen Datei suchen muss).

Eine mögliche Optimierung, die von HotSpot der Sonne Java Virtuelle Maschine verwendet ist, soll Interpretation und JIT Kompilation verbinden. Der Anwendungscode wird am Anfang interpretiert, aber die JVM-Monitore, welche Folgen von bytecode oft durchgeführt werden und sie zum Maschinencode für die direkte Ausführung auf der Hardware übersetzen. Für bytecode, der nur ein paar Male durchgeführt wird, spart das die Übersetzungszeit und reduziert die anfängliche Latenz; für oft durchgeführten bytecode wird JIT Kompilation verwendet, um mit der hohen Geschwindigkeit nach einer anfänglichen Phase der langsamen Interpretation zu laufen. Zusätzlich, da ein Programm den grössten Teil der Zeit verbringt, eine Minderheit seines Codes hinrichtend, ist die reduzierte Übersetzungszeit bedeutend. Schließlich, während der anfänglichen Codeinterpretation, kann Ausführungsstatistik vor der Kompilation gesammelt werden, die hilft, bessere Optimierung durchzuführen.

Der richtige Umtausch kann sich wegen Verhältnisse ändern. Zum Beispiel hat das Java der Sonne Virtuelle Maschine zwei Hauptweisen — Kunde und Server. In der Kundenweise, minimalen Kompilation und Optimierung wird durchgeführt, um Anlauf-Zeit zu reduzieren. In der Server-Weise, umfassenden Kompilation und Optimierung wird durchgeführt, um Leistung zu maximieren, sobald die Anwendung durch das Opfern der Anlauf-Zeit läuft. Anderes Java gerade rechtzeitig haben Bearbeiter ein Laufzeitmaß der Zahl von Zeiten verwendet, die eine Methode verbunden mit der bytecode Größe einer Methode als ein heuristischer durchgeführt hat, um zu entscheiden, wenn man kompiliert. Noch verwendet ein anderer die Zahl von Zeiten durchgeführt verbunden mit der Entdeckung von Schleifen. Im Allgemeinen ist es viel härter, der Methoden genau vorauszusagen, in kurz laufenden Anwendungen zu optimieren, als in lange laufenden.

Heimischer Bildgenerator (Ngen) durch Microsoft ist eine andere Annäherung beim Reduzieren der anfänglichen Verzögerung. Ngen vorkompiliert (oder "pre-jits") bytecode in einem Allgemeinen Zwischensprachimage in den Maschineneingeborener-Code. Infolgedessen ist keine Laufzeitkompilation erforderlich..NET-Fachwerk 2.0 verladene mit dem Sehstudio 2005 führt Ngen auf der ganzen Bibliothek von Microsoft DLLs direkt nach der Installation. Pre-jitting stellt eine Weise zur Verfügung, die Anlauf-Zeit zu verbessern. Jedoch könnte die Qualität des Codes, den es erzeugt, nicht so gut sein wie derjenige, der jitted aus denselben Gründen ist, warum Code kompiliert statisch, ohne Profil-geführte Optimierung, so nicht gut sein kann wie JIT kompilierter Code im äußersten Fall: Der Mangel an Kopierfräsdaten, um, zum Beispiel, das Reihenverstecken zu steuern.

Dort auch bestehen javanische Durchführungen, die einen AOT (vorzeitig) Bearbeiter mit irgendeinem ein JIT Bearbeiter (Excelsior STRAHL) oder Dolmetscher verbinden (GNU-Bearbeiter für Java.)

Geschichte

Der frühste veröffentlichte JIT Bearbeiter wird allgemein zugeschrieben, um am LISPELN durch McCarthy 1960 zu arbeiten. In seiner Samenzeitung Rekursive Funktionen von symbolischen Ausdrücken und ihrer Berechnung durch die Maschine, den ersten Teil, erwähnt er Funktionen, die während der Durchlaufzeit übersetzt werden, dadurch das Bedürfnis verschonend, die Bearbeiter-Produktion zu sparen, um Karten zu schlagen. 1968 hat Thompson eine Methode vorgelegt, um regelmäßige Ausdrücke automatisch zu kompilieren, um Code maschinell herzustellen, der dann durchgeführt wird, um das Zusammenbringen auf einem Eingangstext durchzuführen. Für eine einflussreiche Technik, um kompilierten Code von der Interpretation abzuleiten, wurde von Mitchell 1970 den Weg gebahnt, den er für die experimentelle Sprache LC ² durchgeführt hat.

Plausch hat für neue Aspekte von JIT Kompilationen den Weg gebahnt. Zum Beispiel wurde die Übersetzung zum Maschinencode auf Verlangen getan, und das Ergebnis wurde für den späteren Gebrauch versteckt. Als Gedächtnis knapp geworden ist, würde das System etwas von diesem Code löschen und ihn regenerieren, als er wieder erforderlich war. Sonne Selbst hat Sprache diese Techniken umfassend verbessert und war einmal das schnellste Plausch-System in der Welt; das Erzielen der bis zu Hälfte der Geschwindigkeit von optimiertem C, aber mit einer völlig objektorientierten Sprache.

Selbst wurde durch die Sonne aufgegeben, aber die Forschung ist in die javanische Sprache eingetreten, und zurzeit wird es durch die meisten Durchführungen Javas Virtuelle Maschine verwendet, wie HotSpot aufbaut, und umfassend, diese Forschungsbasis verwendet.

Der HP-Projektdynamo war ein experimenteller JIT Bearbeiter, wo das 'Bytecode'-Format und das Maschinencodeformat dasselbe waren; das System hat HPA-8000 Maschinencode in den HPA-8000 Maschinencode verwandelt. Gegenintuitiv ist das auf Geschwindigkeits-USV hinausgelaufen, in einigen Fällen 30 % seit dem Tun davon hat Optimierungen am Maschinencodeniveau, zum Beispiel, inlining Code für den besseren Gebrauch des geheimen Lagers und die Optimierungen von Anrufen zu dynamischen Bibliotheken und vielen anderen Laufzeitoptimierungen erlaubt, die herkömmliche Bearbeiter nicht im Stande sind zu versuchen.

Siehe auch

  • Binäre Übersetzung
  • HotSpot
  • Durchlaufzeit der gemeinsamen Sprache
  • Crusoe, ein Mikroprozessor, der im Wesentlichen gerade rechtzeitig Kompilation aus dem X86-Code durchführt, um innerhalb des Mikroprozessors zu mikrocodieren
  • GNU-Blitz - Eine Bibliothek, die Zusammenbau-Sprachcode an der Durchlaufzeit erzeugt
  • LLVM
Das Selbständern des Codes

Außenverbindungen

  • - Eine Bibliothek durch Rhys Weatherley, Klaus Treichel, Aleksey Demakov und Kirill Kononenko für die Entwicklung von Gerade rechtzeitig Bearbeitern in Virtuellen Maschinendurchführungen, Dynamischen Programmiersprachen und Sprachen von Scripting.
  • Mozilla Nanojit - Ein kleiner, Quer-Plattform C ++ Bibliothek, die Maschinencode ausstrahlt. Es wird als der JIT für Mozilla Tamarin und SpiderMonkey Javascript Motoren verwendet.
  • SoftWire - Eine Bibliothek durch Nicolas Capens, der Zusammenbau-Sprachcode an der Durchlaufzeit (These) erzeugt
  • CCG durch Ian Piumarta
  • Dyninst
  • JatoVM, Java JIT-nur VM
  • AsmJit - Vollenden x86/x64 jit Assemblerbibliothek für C ++ Sprache durch Petr Kobalíček
  • Xbyak - Ein x86/x64 JIT Monteur für C ++ Sprache durch Herumi
  • Interpretierten und Erzeugten Laufzeitcode mit der VTune Leistung Analysator im Profil darstellend

Jean-Henry Gourgaud / Punkt des Verkaufs
Impressum & Datenschutz