Verfolgung der Just-in-Time-Zusammenstellung

Verfolgung der Just-in-Time-Zusammenstellung ist eine Technik von virtuelle Maschinen zu optimieren die Ausführung eines Programms bei Laufzeit. Dies geschieht durch Aufzeichnung einer linearen Folge häufig ausgeführter Vorgänge. Kompilieren Sie zu einheimisch Maschinensprache und sie ausführen. Dies ist gegen traditionell gerade rechtzeitig (JIT) Compiler, die pro Method arbeiten.

Überblick

Just-in-Time-Zusammenstellung ist eine Technik, um die Ausführungsgeschwindigkeit von Programmen zu erhöhen, indem Teile eines Programms zu erfasst werden Maschinensprache zur Laufzeit. Eine Möglichkeit, verschiedene JIT -Compiler zu kategorisieren, besteht in ihrem Kompilierungsbereich. Während methodbasierte JIT-Compiler jeweils eine Methode zum Maschinencode übersetzen, verwenden die Verfolgung von Jits häufig ausgeführte Schleifen als Kompilierungseinheit. Die Verfolgung von Jits basieren auf den Annahmen, die Programme die meiste Zeit in einigen verbringen Schleifen des Programms ("Hot Loops") und der nachfolgenden Schleifen -Iterationen nehmen häufig ähnliche Wege auf. Virtuelle Maschinen Die Ausführungsumgebungen mit Mixed-Mode-Ausführungen haben eine Verfolgung, was bedeutet, dass sie zusätzlich zur Verfolgung entweder einen Dolmetscher oder einen Methoden Compiler haben.

Technische Details

Ein Verfolgungs -JIT -Compiler durchläuft zur Laufzeit verschiedene Phasen. Zuerst, Profilerstellung Informationen für Schleifen werden gesammelt. Nachdem eine heiße Schleife identifiziert wurde, eine besondere Verfolgung Die Phase wird eingegeben, wodurch alle ausgeführten Operationen dieser Schleife aufgezeichnet werden. Diese Abfolge von Operationen wird als Spur bezeichnet. Die Spur wird dann optimiert und mit Maschinencode (Trace) kompiliert. Wenn diese Schleife erneut ausgeführt wird, wird die kompilierte Spur anstelle des Programms gerufen.

Diese Schritte werden im Folgenden ausführlich erklärt:

Profilerstellungsphase

Das Ziel der Profilerstellung ist es, heiße Schleifen zu identifizieren. Dies geschieht oft durch die Anzahl der Iterationen für jede Schleife. Nachdem die Anzahl einer Schleife einen bestimmten Schwellenwert überschreitet, wird die Schleife als heiß angesehen und die Verfolgungsphase wird eingegeben.

Verfolgungsphase

In der Verfolgungsphase erfolgt die Ausführung der Schleife normal, aber zusätzlich wird jeder ausgeführte Betrieb in eine Spur aufgezeichnet. Die aufgezeichneten Operationen werden in der Regel in gespeichert Spurenbaumoft in einem Zwischendarstellung (Ir). Nachverfolgung folgt Funktionsaufrufen, die dazu führen, dass sie in die Spur eingebaut werden. Die Verfolgung dauert fort, bis die Schleife sein Ende erreicht und zum Start zurückspringt.

Da die Spur durch Befolgen eines konkreten Ausführungspfads der Schleife aufgezeichnet wird, können spätere Ausführungen dieser Spur von diesem Pfad abweichen. Um die Orte zu identifizieren, an denen dies passieren kann, ist besonders bewachen Anweisungen werden in die Spur eingefügt. Ein Beispiel für einen solchen Ort ist, wenn Aussagen. Die Wache ist eine schnelle Überprüfung, um festzustellen, ob der ursprüngliche Zustand immer noch zutrifft. Wenn eine Wache fehlschlägt, wird die Ausführung der Spur abgebrochen.

Da die Verfolgung während der Ausführung erfolgt, kann die Spur gemacht werden, um enthalten zu werden Laufzeitinformationen (z.B. Geben Sie Informationen ein). Diese Informationen können später in der Optimierungsphase verwendet werden, um die Code -Effizienz zu erhöhen.

Optimierungs- und Code-Generationsphase

Spuren sind leicht zu optimieren, da sie nur einen Ausführungspfad darstellen, was bedeutet, dass kein Kontrollfluss vorhanden ist und kein Handling benötigt. Typische Optimierungen sind Eliminierung des Konstantenuntergangs, Dead Code Elimination, Zuteilung registrieren, Invariante-Code-Bewegung, Konstante Faltung, und Fluchtanalyse.[1]

Nach der Optimierung wird die Spur in den Maschinencode verwandelt. Ähnlich wie bei der Optimierung ist dies aufgrund der linearen Natur der Spuren einfach.

Ausführung

Nachdem die Spur in den Maschinencode zusammengestellt wurde, kann sie in nachfolgenden Iterationen der Schleife ausgeführt werden. Die Spurausführung dauert fort, bis eine Wache fehlschlägt.

Geschichte

Während die Idee von Jits bis in die 1960er Jahre zurückreicht, wurden die Verfolgung von Jits erst vor kurzem verwendet. Die erste Erwähnung einer Idee, die der heutigen Idee von Jits ähnelt, war 1970.[2] Es wurde beobachtet, dass kompilierter Code zur Laufzeit von einem Dolmetscher abgeleitet werden konnte, indem einfach die während der Interpretation ausgeführten Aktionen gespeichert werden.

Die erste Implementierung von Tracing ist Dynamo, "ein Software -Dynamik -Optimierungssystem, das die Leistung eines nativen Befehlsstroms, der sich im Prozessor ausführt, transparent verbessern kann".[3] Dazu wird der native Befehlsstrom interpretiert, bis eine "heiße" Anweisungssequenz gefunden wird. Für diese Sequenz wird eine optimierte Version generiert, zwischengespeichert und ausgeführt.

Dynamo wurde später auf erweitert auf Dynamorio. Ein dynamorio basiertes Projekt war ein Rahmen für die Konstruktion der Dolmetscher, das die Verfolgung und die teilweise Bewertung kombiniert. Es wurde verwendet, um "den Dolmetscheraufwand dynamisch aus Sprachimplementierungen zu entfernen".[4]

Im Jahr 2006 wurde Hotpathvm, der erste JIT-Compiler für eine hochrangige Sprache, entwickelt.[5] Diese VM war in der Lage, häufig ausgeführte Bytecode -Anweisungen dynamisch zu identifizieren, die verfolgt und dann mit dem Maschinencode kompiliert werden Statische Einzelzuweisung (SSA) Konstruktion. Die Motivation für HotpathVM bestand darin, eine effiziente JVM für mobile Ressourcenbeschränkungen zu haben.

Ein weiteres Beispiel für eine Verfolgung ist JIT Tracemonkey, einer von MozillaJavaScript -Implementierungen für Feuerfuchs (2009).[6] Tracemonkey kompiliert häufig ausgeführte Schleifenspuren in der dynamischen Sprache JavaScript zur Laufzeit und spezialisiert den generierten Code für die tatsächlichen dynamischen Typen, die auf jedem Pfad auftreten.

Ein weiteres Projekt, das die Verfolgung von Jits nutzt, ist Pypy. Es ermöglicht die Verwendung von Jits für Sprachimplementierungen, die mit der Übersetzung von PYPY geschrieben wurden, wodurch die Leistung jedes Programms verbessert wird, das mit diesem Dolmetscher ausgeführt wird. Dies ist möglich, indem der Dolmetscher selbst statt des Programms, das vom Dolmetscher ausgeführt wird, verfolgt.[7]

Nachverfolgung von Jits wurden auch von untersucht Microsoft im Spurprojekt für ihre Gemeinsame Zwischensprache (Cil). Spur ist ein generischer Tracer für CIL, der auch zur Verfolgung einer JavaScript -Implementierung verwendet werden kann.[8]

Beispiel einer Spur

Betrachten Sie das folgende Python -Programm, das eine Summe von Quadraten aufeinanderfolgender ganze Zahlen berechnet, bis diese Summe 100000 überschreitet:

def Quadrat(x):  Rückkehr x * x i = 0 y = 0 während WAHR:  y += Quadrat(i)  wenn y > 100000:  Unterbrechung  i = i + 1 

Eine Spur für dieses Programm könnte ungefähr so ​​aussehen:

 Loopstart(I1, y1)  I2 = int_mul(I1, I1)		# x*x  y2 = int_add(y1, I2)		# y += i*i  B1 = int_gt(y2, 100000)  Guard_false(B1)  i3 = int_add(I1, 1)		# i = i+1  springen(i3, y2) 

Beachten Sie, wie der Funktionsaufruf an Quadrat wird in die Spur eingebaut und wie die If -Aussage in a verwandelt wird Guard_false.

Siehe auch

Verweise

  1. ^ Bolz, Carl Friedrich; Cuni, Antonio; Fijabkowski, Maciej; Leuschel, Michael; Pedroni, Samuele; Rigo, Armin (Januar 2011). "Zuteilungsentfernung durch teilweise Bewertung in einer Verfolgung" JIT " (PDF). Verfahren des 20. ACM -Sigplan -Workshops zur teilweisen Bewertung und Programmmanipulation. Pepm '11. S. 43–52. doi:10.1145/1929501.1929508. S2CID 15871223. Abgerufen 2020-12-13.
  2. ^ Mitchell, James G. (29. Juni 1970). Das Design und die Konstruktion flexibler und effizienter interaktiver Programmiersysteme (PhD). Carnegie Mellon Universität. ISBN 978-0-8240-4414-5. Lccn 79050563. OCLC 633313022. S2CID 36249021. Docket AAI7104538. Abgerufen 2020-12-13.
  3. ^ Bala, Vasanth; Duesterwald, Evelyn; Banerjia, Sanjeev (Mai 2000). "Dynamo: Ein transparentes Dynamikoptimierungssystem" (PDF). Verfahren der ACM Sigplan 2000 -Konferenz zum Design und zur Implementierung von Programmiersprache. PLDI '00. S. 1–12. doi:10.1145/349299.349303. ISBN 978-1-58113-199-4. S2CID 53223267. Abgerufen 2020-12-13.
  4. ^ Sullivan, Gregory T.; Bruening, Derek L.; Baron, Iris; Garnett, Timothy; Amarasinghe, Saman (Juni 2003). "Dynamische native Optimierung von Dolmetschern" (PDF). Verfahren des Workshops 2003 über Dolmetscher, virtuelle Maschinen und Emulatoren. IVME '03. S. 50–57. Citeseerx 10.1.1.14.9819. doi:10.1145/858570.858576. ISBN 978-1-58113-655-5. S2CID 509405. Abgerufen 2020-12-13.
  5. ^ Gal, Andreas; Probst, Christian W.; Franz, Michael (Juni 2006). "Hotpathvm: Ein effektiver JIT-Compiler für ressourcenbeschränkte Geräte" (PDF). Verfahren der 2. Internationalen Konferenz über virtuelle Ausführungsumgebungen. Vee '06. S. 144–153. doi:10.1145/1134760.1134780. ISBN 978-1-59593-332-4. S2CID 17846788. Qid56580114. Abgerufen 2020-12-13.
  6. ^ Gal, Andreas; Orendorff, Jason; Ruderman, Jesse; Smith, Edwin W.; Reitmaier, Rick; Bebenita, Michael; Chang, Mason; Franz, Michael; Eich, Brendan; Rasierer, Mike; Anderson, David; Mandelin, David; Haghighat, Mohammad R.; Kaplan, Blake; Hoare, Graydon; Zbarsky, Boris (Juni 2009). "Trace-basierte Just-in-Time-Typspezialisierung für dynamische Sprachen" (PDF). Verfahren der 30. ACM -Sigplan -Konferenz zum Design und zur Implementierung von Programmiersprache. PLDI '09. S. 465–478. doi:10.1145/1542476.1542528. ISBN 978-1-60558-392-1. S2CID 207172806. Abgerufen 2020-12-13.
  7. ^ Bolz, Carl Friedrich; Cuni, Antonio; Fijalkowski, Maciej; Rigo, Armin (Juli 2009). "Verfolgung des Meta-Levels: Pypys Verfolgung JIT Compiler" (PDF). Verfahren des 4. Workshops zur Implementierung, Zusammenstellung, Optimierung objektorientierter Sprachen und Programmiersysteme. ICOOOLPS '09. S. 18–25. doi:10.1145/1565824.1565827. ISBN 978-1-60558-541-3. S2CID 7478596. Abgerufen 2020-12-13.
  8. ^ Bebenita, Michael; Brandner, Florian; Fahndrich, Manuel; Logozzo, Francesco; Schulte, Wolfram; Tillmann, Nikolai; Venter, Herman (Oktober 2010). "Spur: Ein Trace-basierter JIT-Compiler für CIL" (PDF). Verfahren der ACM International Conference über objektorientierte Programmiersysteme Sprachen und Anwendungen. Oopsla '10. S. 708–725. doi:10.1145/1869459.1869517. ISBN 978-1-4503-0203-6. S2CID 3395746. Abgerufen 2020-12-13.

Externe Links