Definition „Just-in-time-Kompilierer“ Was ist ein JIT Compiler?

Von Egoloizos

Ein JIT-Compiler übersetzt ein Programm oder Programmteile beim Start oder zur Laufzeit nach Bedarf. Das Programm wird just-ist-time in Maschinensprache kompiliert. Das Programm selbst liegt dabei in einer anderen Sprache als der Maschinensprache vor.

Ein JIT-Compiler übersetzt ein Programm oder Programmteile beim Start oder zur Laufzeit nach Bedarf in Maschinencode.
Ein JIT-Compiler übersetzt ein Programm oder Programmteile beim Start oder zur Laufzeit nach Bedarf in Maschinencode.
(© spainter_vfx – stock.adobe.com)

Die Abkürzung JIT steht für „Just in Time“. Es geht um die bedarfsweise Übersetzung eines Programms in die erforderliche Maschinensprache. Ausschlaggebend ist die Tatsache, dass das zu übersetzende Programm in einer fremden Sprache vorliegt, die nicht der des ausführenden Systems entspricht. Daher besteht bedarf nach Übersetzung beziehungsweise Kompilierung des Programms.

Das Programm liegt meist in einer höheren Programmiersprache vor, beispielsweise Java, C / C++ oder HTML. Ebenso kann es vorkommen, dass ein in einer Zwischensprache (Intermediate Language oder IL) vorliegendes Programm übersetzt werden muss. Aufgabe des JIT-Compilers ist es, diese Übersetzung vorzunehmen. Der Compiler kann entweder das vollständige Programm zum Stard oder aber Programmteile jeweils zur Laufzeit bedarfsweise übersetzen.

JIT-Kompilierung zur Ausführung von Programmen: Einsatz und Ablauf

Die JIT-Kompilierung stellt eine Technik dar, derer sich verschiedene Laufzeitumgebungen und Interpreter bedienen. Sie dient der Ausführung der Programme, die nicht in Maschinensprache geschrieben sind. Ein Beispiel für solche Laufzeitumgebungen ist die Java Virtual Machine (JVM).

JIT-Compiler unterscheiden sich von solchen Compilern, die den vollumfänglichen Quelltext in nur einem Durchgang in ausführbare Programme überführen. Der JIT-Compiler arbeitet nicht in einem Durchgang, sondern gemäß seines Namens just in time, also bedarfsweise. Er wird also in der Praxis im Prozess der Programmausführung erst tätig.

JIT als Kombination zweier Ansätze zur Maschinencode-Übersetzung

Die JIT-Kompilation lässt sich als Verbindung zweier älterer, traditioneller Ansätze zur Code-Übersetzung verstehen. Dies sind die

  • AOT (Ahead of time Compilation) und die
  • Interpretation

Damit kombiniert der JIT-Compiler auch die jeweiligen Vorzüge und Schwächen dieser Ansätze. Die JIT Compilation kombiniert das Tempo des kompilierten Codes mit der größeren Flexibilität der Interpretation. Dies ist verbunden mit einem zusätzlichen Kompilierungsaufwand. JIT-Kompilation lässt sich als Variante der dynamischen Kompilierung verstehen. Der Ansatz ermöglicht verschiedene adaptive Optimierungen. Dazu gehört die dynamische Neukompilierung.

Funktionsweise der JIT-Kompilierung

Der JIT-Compiler übersetzt den vorliegenden Code in einen so genannten nativen Maschinen-Code. Dies ist ein Code, den der eingesetzte Prozessor unmittelbar verarbeiten kann. Die Besonderheit der JIT-Compilation besteht darin, dass der Compiler erst während der Laufzeit aktiv wird. Die Kompilierung erfolgt also nicht bereits vorab.

Nach der Kompilierung kommt es zur Ausführung des Maschinen-Codes, der nun vom Prozessor verarbeitet werden kann. Diese Vorgehensweise hat gegenüber herkömmlichen Kompilierung Performance-Vorteile. Bei der Kompilierung werden gesamtheitliche ganze Codeblöcke bearbeitet. Auch dies stellt gegenüber der sonst üblichen zeilenweise erfolgenden Abarbeitung einen Tempovorteil dar.

Besonders hoch entwickelte JIT-Compiler sind imstande, speziell für dynamische Sprachen schneller Code generieren zu können. Die JIT-Kompilierung hat darüber hinaus den Vorteil, dass vor dem Programmstart nur ein geringer Teil überhaupt kompiliert wird. Dies reduziert das Problem der Verzögerungen beim Start des Programms.

Weiterhin besteht ein Vorteil in der Schonung der System-Ressourcen. Bestimmte Programmteile, die ohnehin nicht durchlaufen werden, erfahren auch keine Kompilierung. Bei der JIT Compilation werden einmal fertig kompilierte Programmteile weiterhin in einem Software-Cache gehalten. Dies hat den Vorteil, dass die Programmteile nicht bei jedem zusätzlichen Durchlauf erneut einer Kompilierung bedürfen.

Einsatzbereiche des JIT-Compilers

JIT-Compiler lassen sich auf verschiedenartige Programme anwenden, speziell jedoch für dynamische Kapazitäten. Dazu gehören reguläre Ausdrücke. So kann ein Texteditor beispielsweise reguläre Ausdrücke kompilieren, die während der Laufzeit für den Maschinencode bereitsteht. Auf diese Weise ist ein schnellerer Abgleich möglich. Es ist nicht möglich, dass dies bereits im Vorfeld geschieht, denn die Bereitstellung des Musters muss zur Laufzeit geschehen.

Jetzt Newsletter abonnieren

Täglich die wichtigsten Infos zu Softwareentwicklung und DevOps

Mit Klick auf „Newsletter abonnieren“ erkläre ich mich mit der Verarbeitung und Nutzung meiner Daten gemäß Einwilligungserklärung (bitte aufklappen für Details) einverstanden und akzeptiere die Nutzungsbedingungen. Weitere Informationen finde ich in unserer Datenschutzerklärung.

Aufklappen für Details zu Ihrer Einwilligung

Zahlreiche moderne Laufzeitumgebungen verfügen über eine JIT-Kompilierung als Grundlage, wenn es um die Ausführung des Codes in hoher Geschwindigkeit geht. Dazu gehören die meisten Java-Implementierungen, gemeinsam mit Mit dem NET-Framework von Microsoft.

Weitere Beispiele aktueller JIT-Compiler finden sich bei vielen Webbrowsern für Desktop-Betriebssysteme. Hier kommt ein JIT-Compiler zum Einsatz, um die JavaScript-Ausführung zu beschleunigen. Als Teil der virtuellen Maschine ergänzt der JIT-Compiler den Interpreter (wie etwa die Java Virtual Machine (JVM) bei Java oder CLR bei .NET).

Ähnlich bieten zahlreiche Bibliotheken, die mit regulären Ausdrücken arbeiten, eine JIT-Kompilierung an. Die Kompilierung erfolgt in diesen Fällen entweder in Bytecode oder in Maschinencode. Ebenso kommt JIT-Compilation in verschiedenen Emulatoren zum Einsatz, etwa um den Maschinencode der einen CPU-Architektur in eine andere zu übertragen beziehungsweise zu übersetzen.

JIT-Compiler kommen auch zum Einsatz, nachdem bereits eine AOT-Kompilierung in Bytecode (den Code der VM oder Virtual Machine) stattgefunden hat. Der Bytecode-Kompilierung folgt dann eine anschließende JIT-Kompilierung in Maschinencode. Diese dynamische Kompilierung verhindert, dass der Bytecode zunächst mühevoll interpretiert werden muss. Die Laufzeitleistung verbessert sich damit im direkten Vergleich zur regulären Interpretation.

(ID:47023534)