Frage

Was ist der Unterschied zwischen den JIT-Compiler und CLR? Wenn Sie kompilieren Sie Ihren Code il und CLR läuft, dass Code was ist dann der JIT tun? Wie hat sich mit der Zugabe von Generika auf die CLR JIT-Kompilierung geändert?

War es hilfreich?

Lösung

Der JIT ist ein Aspekt der CLR.

Insbesondere ist es der Teil verantwortlich für CIL / MSIL Wechsel (im Folgenden IL genannt) durch die Originalsprache des Compilers (csc.exe für Microsoft C # zum Beispiel) erzeugt in Maschinencode stammt aus dem aktuellen Prozessor (und Architektur, die es macht in der aktuelle Prozess, beispielsweise 32/64-Bit). Wenn die Anordnung in Frage ngen'd wurde dann den der JIT-Prozess ist völlig unnötig und die CLR wird diesen Code sehr gut ohne auszuführen.

Bevor ein Verfahren verwendet wird, die noch nicht von der Zwischendarstellung umgewandelt wurde es die JIT-Verantwortung ist es zu konvertieren.
Genau , wenn wird die JIT-Kick in ist die Umsetzung spezifisch und Änderungen vorbehalten. Allerdings ist das CLR-Design vor, dass der JIT geschieht vor der entsprechende Code ausführt, JVM im Gegensatz wäre frei, den Code für eine Weile zu interpretieren, während ein separater Thread eine Maschinencode-Darstellung erzeugt.
Die 'normale' CLR verwendet ein Pre-JIT-Stub Ansatz wo durch Methoden JIT nur zusammengestellt, wie sie verwendet werden. Dies beinhaltet die anfängliche native Methode Stub ein indirection sein mit der JIT zu instruieren modifizieren, um die Methode zu kompilieren anschließend das erste Gespräch über die anfänglichen Stummel zu überspringen. Die aktuelle kompakte Ausgabe kompiliert stattdessen alle Methoden auf eine Art, wenn es geladen wird.

Um die Zugabe von Generics Adresse.

Dies war die letzte große Änderung der IL-Spezifikation und JIT hinsichtlich ihrer Semantik hinsichtlich seiner internen Implementierungsdetails gegenüber.

Einige neue IL Anweisungen gegeben und weitere Metadaten-Optionen wurden für Instrumentierungstypen und Mitgliedern zur Verfügung gestellt. Einschränkungen wurden auch bei der IL-Ebene hinzugefügt.

Wenn der JIT ein Verfahren kompiliert, die generischen Argumente (entweder explizit oder implizit durch die enthaltenden Klasse) hat es kann verschiedene Codepfade (Maschinencodeanweisungen) für jeden Typen verwendet einzurichten. In der Praxis verwendet die JIT eine gemeinsame Implementierung für alle Referenztypen, da Variablen für diese die gleiche Semantik und belegen den gleichen Raum (IntPtr.Size) aufweisen.

wird Jeder Wert typspezifischen Code dafür bekommen erzeugt, mit der reduzierten / zunehmenden Größe der Variablen auf dem Stack / Heap ist hierfür ein wichtiger Grund zu tun. Auch durch Emittieren des erzwungener Opcode vor Methode viele Anrufungen auf nicht Verweistypen ruft brauchen nicht auf das Feld Wert die Methode aufzurufen (diese Optimierung wird in nicht generischen Fällen auch). Dies ermöglicht auch die default<T> Verhalten korrekt gehandhabt werden und für Vergleiche, da keine ops werden auf null zu (immer falsch), wenn ein nicht Nullable Werttyp verwendet wird.

Wenn ein Versuch zur Laufzeit erfolgt eine Instanz eines generischen Typs über Reflexion zu schaffen, dann werden die Parameter des Typs von der Laufzeit validiert werden sie keine Einschränkungen passieren zu gewährleisten. Dies gilt nicht direkt Einfluss auf die JIT es sei denn, dies innerhalb des Typs System verwendet wird (unwahrscheinlich, obwohl möglich).

Andere Tipps

Sie Ihren Code kompilieren IL, die während der Laufzeit in Maschinencode ausgeführt und kompiliert werden, das ist, was JIT genannt wird.

Bearbeiten , einige die Antwort auf Fleisch aus mehr (noch übermäßig vereinfacht):

Wenn Sie Ihre C # -Code in Visual Studio kompilieren es in IL gedreht wird, dass die CLR versteht, die IL ist die gleiche für alle Sprachen auf dem CLR läuft (das ist, was die .NET-Laufzeit ermöglicht es, mehrere Sprachen zu verwenden und inter-op leicht zwischen ihnen).

Während der Laufzeit wird die IL in Maschinencode interpretiert (die die Architektur spezifisch ist, du bist auf) und dann ist es ausgeführt. Dieser Prozess wird Just In Time Kompilierung oder JIT kurz genannt. Nur die IL, die benötigt wird, wird in Maschinencode umgewandelt (und nur einmal, es ist „Cache“, sobald es in Maschinencode kompiliert), nur in der Zeit , bevor er ausgeführt hat, daher der Name JIT.

Dies ist, wie es für C # aussehen würde

  

C # -Code > C # Compiler > IL > .NET Runtime > JIT Compiler > Maschinencode > Ausführung

Und das ist, was es für VB aussehen würde

  

VB-Code > VB-Compiler > IL > .NET Runtime > JIT Compiler > Maschinencode > Ausführung

Und wie Sie können nur die beiden ersten Schritte sehen zu jeder Sprache einzigartig sind, und alles, nachdem es in IL gedreht ist schon ist das gleiche, das ist, wie ich schon sagte, der Grund, warum Sie mehrere verschiedene Sprachen auf der laufen kann. NET

Wie Jon Skeet sagt, ist JIT Teil der CLR. Im Grunde ist dies, was unter der Haube passiert:

  1. Ihr Quellcode wird in einen Bytecode kompiliert wissen als gemeinsame Zwischensprache (CIL).
  2. Metadaten aus jeder Klasse und alle Methoden (und jede andere Sache: O) in der PE-Header des resultierenden ausführbaren (sei es eine DLL oder eine exe) enthalten
  3. .
  4. Wenn Sie eine ausführbare Datei sind die Herstellung des PE-Header enthält auch ein herkömmliches Bootstrap-Programm, das von dem Laden des CLR (Common Language Runtime) zuständig ist, wenn man Sie ausführbare ausführen.

Wenn Sie nun ausführen:

  1. Die bootstraper initialisiert die CLR (vor allem durch die mscorlib Montage Laden) und weist sie an Ihre Montage auszuführen.
  2. Die CLR führt Ihren Haupteintrag.
  3. Nun Klassen haben eine Vektortabelle, die die Adressen der Methodenfunktionen halten, so dass, wenn Sie MyMethod aufrufen, diese Tabelle durchsucht wird und dann ein entsprechender Aufruf der Adresse erfolgt. Nach dem Start werden alle Einträge für alle Tabellen haben die Adresse des JIT-Compiler.
  4. Wenn ein Anruf zu einem dieses Verfahren hergestellt wird, wird der JIT anstelle der tatsächlichen Methode aufgerufen und übernimmt die Kontrolle. Die JIT-kompiliert dann den CIL-Code in tatsächlichen Assembler-Code für die sachgemäße Architektur.
  5. Sobald der Code kompiliert der JIT geht in die Methode Vektortabelle und ersetzt die Adresse mit der des kompilierten Codes, so dass jeder nachfolgende Aufruf nicht mehr die JIT aufruft.
  6. Schließlich behandelt der JIT die Ausführung an den kompilierten Code.
  7. Wenn Sie eine andere Methode aufrufen, die noch nicht dann auf 4 zurückgehen kompiliert wird ... und so weiter ...

Der JIT ist im Grunde Teil des CLR. Der Garbage-Collector ist eine andere. Ganz wo Sie Interop setzen Verantwortlichkeiten usw. ist eine andere Sache, und eine, wo ich sehr groß bin unterqualifiziert Kommentar:)

Ich weiß, dass der Thread ist ziemlich alt, aber ich dachte, dass ich in dem Bild setzen könnte, die mich JIT verstehen gemacht. Es ist von dem ausgezeichneten Buch CLR via C # von Jeffrey Ritcher . Im Bild sind die Metadaten er spricht die Metadaten in dem Montagekopf emittieren, in der alle Informationen über Typen in der Assembly gespeichert ist:

JIT Bild von CLR via C #

1), während das .net Programm kompiliert wird, .net Programmcode umgewandelt in Intermediate Language (IL) Code

2) bei der Ausführung des Programms des Zwischensprache-Code in Maschinencode-Betriebssystem umgewandelt wird, wie und wann eine Methode genannt wird; dies ist JIT (Just in Time) Kompilation genannt.

  1. Common Language Runtime (CLR) ist Dolmetscher während Just In Time (JIT) Compiler in .NET Framework.

2.JIT ist der interne Compiler von .NET, die von CLR Microsoft Intermediate Code Sprache (MSICL) Code nimmt und führt sie aus, um maschinenspezifische Instruktionen während CLR als Motor ist seine Hauptaufgabe arbeitet MSICL Code JIT zur Verfügung zu stellen, um sicherzustellen, dieser Code wird vollständig per Maschinenspezifikation zusammengestellt.

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