Frage

Q1) Warum ist C # zunächst auf IL kompiliert und dann zur Laufzeit JIT halten und laufen auf einer virtuellen Maschine (?). Oder ist es JIT einzuhaltenden nativen Maschinencode?

Q2) Wenn die zweiten wahr ist (JIT einzuhaltenden nativen Maschinencode), wo ist dann die .NET-Sandbox unter dem Code ausgeführt wird?

Q3) Außerdem, warum ist der Code zu IL in erster Linie zusammengestellt. Warum kompilieren nicht einfach zu nativen Maschinencode die ganze Zeit? Es ist ein Werkzeug von MS aus diesen genannten ngen aber warum ist das optional?

War es hilfreich?

Lösung

Die IL ist JIT'd (JIT = Just In Time) zu nativen Maschinencode kompiliert, wie der Prozess ausgeführt wird.

Die Verwendung einer virtuellen Maschine Schicht ermöglicht .NET in einer konsistenten Art und Weise über Plattformen hinweg zu verhalten (zB ein int ist immer 32 Bit, unabhängig davon, ob Sie auf einer 32- oder 64-Bit-Maschine laufen lassen, dies ist nicht die Fall mit C ++).

JIT Compilierung ermöglicht Optimierungen dynamisch sich an den Code anzupassen, wie es läuft (zB Anwendung aggressiver Optimierungen Bits des Codes, die häufig genannt werden, oder die Nutzung von Hardware-Anweisungen auf der speziellen Maschine wie SSE2 machen), die man‘ t tun mit einem statischen Compiler.

Andere Tipps

A1) JIT kompiliert nativen Maschinencode

A2) In .net gibt es keinen solchen Begriff als Sandbox. Es gibt AppDomains statt. Und sie wird als Teil der CLR (das heißt als Teil des ausführbaren Prozesses)

A3) NGen Nachteile von Jeffrey Richter:

  • NGen'd Dateien können nicht mehr synchronisiert sind. Wenn die CLR eine NGen'd-Datei lädt, vergleicht es ein Anzahl der Merkmale zu den zuvor kompilierte Code und der aktuellen Ausführung Umgebung. Wenn eines der Merkmale nicht übereinstimmen, kann die NGen'd Datei nicht verwendet, und der normale JIT-Compiler Prozess stattdessen verwendet wird.

  • Inferior Lastzeitleistung (Umbasierung / Binding). Assembly-Dateien sind Standard-Windows-PE-Dateien und als solche enthalten jeweils eine bevorzugte Basisadresse. Viele Fenster Entwickler sind mit den Fragen rund um Basisadressen und Rebasieren vertraut. Wenn die JIT-Code kompiliert, sind diese Fragen kein Problem, da richtige Speicheradresse Referenzen zur Laufzeit berechnet werden.

  • Inferior Execution-Time Performance. Wenn Code kompilieren, können NGen nicht so viele machen Annahmen über die Ausführungsumgebung wie der JIT-Compiler kann. Dies bewirkt NGen.exe zu minderwertigem Code zu erzeugen. Zum Beispiel wird NGen optimiert die Verwendung von bestimmte CPU-Anweisungen; es fügt Indirekt für statisches Feld Zugriff, weil die tatsächlichen Adresse der statischen Felder nicht bis zur Laufzeit bekannt. NGen fügt Code Klasse aufrufen überall Konstruktoren, weil sie die Bestellung nicht wissen, in dem der Code ausführen und wenn eine Klasse Konstruktor wird bereits aufgerufen.

Sie können mit NGEN erstellen native Versionen von .NET-Baugruppen. Dadurch bedeutet, dass der JIT dies nicht zu tun, zur Laufzeit hat.

.NET zuerst und dann zu nativem IL kompiliert, seit der JIT entworfen IL-Code für die aktuelle CPU optimieren Sie den Code unter ausgeführt wird.

.NET-Code wird an IL für Kompatibilität zusammengestellt. Da Sie Code mit C # erstellen, VB.NET, etc. dann muss die JIT einen gemeinsamen Befehlssatz (IL), um nativen Code zu kompilieren. Wenn der JIT bewusst Sprachen sein mußte, dann würde die JIT muß aktualisiert werden, wenn eine neue .NET-Sprache veröffentlicht wurde.

Ich bin mir nicht sicher über die Sandbox Frage, meine beste Vermutung ist, dass eine .NET-Anwendung mit 3 Anwendungsdomänen ausgeführt wird. Eine Domäne enthält die .NET Runtimes (mscorlib, system.dll, usw.), eine andere Domäne enthält .NET-Code, und ich kann nicht daran erinnern, was die andere Domain für. Schauen Sie sich http://my.safaribooksonline.com/9780321584090

1. C # wird in CIL kompiliert (oder IL), weil es eine Plattform mit dem Rest der .NET-Sprachen teilt (das ist, warum Sie eine DLL in C # schreiben und verwenden Sie es in VB.NET oder F # ohne Streit). Die CLR wird JIT dann Kompilieren Sie den Code in nativen Maschinencode.

.NET kann auch auf mehreren Plattformen (Mono auf * NIX und OS X) ausgeführt werden. Wenn C # zu nativen Code kompiliert, würde dies bei weitem nicht so einfach sein.

2. Es gibt keine Sandbox.

3. in der Antwort Covered # 1

A1) Auf diese Weise ist es plattformunabhängig (Windows, Linux, Mac), und es kann auch spezifische Optimierungen für Ihre aktuelle Hardware verwenden. Wenn es JIT kompiliert wird es in Maschinencode.

A2) Der gesamte Rahmen (die .NET-Framework) ist alles Sandbox, so dass alle Anrufe, die Sie vielleicht Ihre Anwendung machen durch durch die .NET-Framework-Sandbox gehen.

A3) Wie in der Antwort 1, ermöglicht es die .NET binäre in verschiedenen Plattformen zu arbeiten und spezifische Optimierungen in der Client-Maschine im laufenden Betrieb durchführen.

Compiled -Code wird IL, die wie die von Javas' Objektcode eine Zwischensprache in der exakt gleichen Art und Weise ist. Ja, es ist möglich, nativen Maschinencode zu erzeugen, mit dem NGen Tool. NGen bindet das resultierende Nativbild an der Maschine, das Kopieren so die ngen'd binär in ein anderes System würde nicht die erwarteten Ergebnisse produzieren. Kompilieren zu Zwischencode ermöglicht Laufzeit Entscheidungen, die sonst gemacht werden können, dass nicht (leicht) mit einer staticly typisierte Sprache wie C ++ gemacht werden, sondern ermöglicht auch die Funktionsweise des Codes auf unterschiedliche Hardware-archetectures, da der Code dann beschreibende wird in dem Sinn, dass es beschreibt auch die Absicht von dem, was in einem Bit (zB 32 oder 64) -agnostic Art und Weise geschehen soll, als zu maschinenspezifischen Code im Gegensatz, die nur auf 32-Bit-Systemen arbeiten oder 64-Bit-Systemen, aber nicht beide.

Auch NGen optional ist, weil, wie ich sagte, dass es die binäre an dem System bindet, kann es nützlich sein, wenn Sie die Leistung von kompilierten Maschinencode mit der Flexibilität einer dynamisch typisierte Sprache benötigen, und Sie wissen, dass die binäre wird nicht zu einem System, es ist nicht gebunden bewegen.

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