Der erste .NET-Code wird nach MSIL kompiliert und anschließend von JIT in maschinenabhängigen Code konvertiert. Kann jemand mir erklären, was alle Vorteile wegen der 2-Schritt-Compilation bekommen. DankeWarum .NET-Code zu MSIL kompiliert?
Antwort
Es gibt ein paar Gründe. In erster Linie ist es wahrscheinlich, es plattformübergreifend zu machen. Wenn C# oder andere .NET-Sprachen direkt in systemeigenen Code kompiliert werden, müssen sie für jede Plattform, auf der sie ausgeführt werden, neu kompiliert werden. Bei einer VM kann der gesamte Code in einem Zwischenformat gespeichert werden, und Sie müssen nur eine VM-Implementierung für jede Plattform schreiben.
Durch eine sprachunabhängige Zwischensprache können Sie auch viele höhere Programmiersprachen (C#, VB.NET, Python usw.) verwenden, die alle auf in anderen Sprachen geschriebene Assemblys verweisen. Da sie alle zu einer Einheit zusammengefügt sind, können sie nahtlos miteinander arbeiten.
Es gibt auch Leistungsvorteile. Der JIT-Compiler kann speziell für die Maschine, auf der der Code gerade ausgeführt wird, aggressive Optimierungen vornehmen. Ich weiß nicht, wie viel Optimierung der .NET JIT-Compiler in diesem Sinne macht, aber es gibt sehr große theoretische Vorteile, die man haben könnte.
Cross-Plattform gilt nicht wirklich viel für das .NET-Framework, da es nur unter Windows ausgeführt werden sollte, aber immer noch einen gültigen Punkt. +1 –
Wirklich? Dann erkläre Mono. :) –
@Matt können Sie bitte erklären, wie kann ich es möglich machen, meinen .net-Code auf verschiedenen Plattformen laufen zu lassen? Bedeutet, wenn ich meine .net-Anwendung auf Linux ausführen möchte? Ist es möglich? – Siddiqui
Die Antwort kann bei MSDN
Eine ausführbare an die Plattform gebunden ist, nicht gefunden werden. Zum Beispiel zielt XNA beide PPC (Xbox360) und x86-Prozessoren. Einige Programme laufen auf Mono unter Linux oder OSX.
Es ermöglicht Ihnen, besser für die Zielmaschine zu optimieren oder fehlende Funktionen ersetzen:
- Zum Beispiel OSX> = 10.5 kompiliert in GPU Anweisungen zur Laufzeit mit OpenCL fehlt.
- Angenommen, Sie arbeiten an einer CPU ohne Gleitkommaunterstützung, dann können Sie sie mit dem JIT emulieren, ohne dass ein vollständiger Code neu geschrieben werden muss.
- Irgendwann könnte es möglich sein, die Verarbeitung dynamisch in die GPU oder andere Ziele zu verschieben (ich vermute, dass funktionale Sprachen dafür etwas besser geeignet sind).
Sie haben Recht mit der funktionalen Sprachen Assertion. GPUs sind wirklich mächtig für * bestimmte * Situationen. Funktionale Sprachen erleichtern der Infrastruktur die Entscheidung, wann diese Situation eintritt. –
Ich denke, Zukunft wird wahrscheinlich eine Mischung aus beiden sein, FP + massiv parallelen Thread-Code (GPGPU). – Stringer
Erste Konvertierung von High-Level-Sprache und dann auf Maschinenebene, ist dies, wie .NET-Plattform entwickelt wird. Die erste Schicht kümmert sich um Hochsprache MSIL und die zweite Ebene kann sich auf & Glitch der Plattform von MSIL auf Maschinenebene Code zu konvertieren konzentrieren. Es unterstützt hauptsächlich die Sprachen-Interoperabilität und wird in naher Zukunft auch Cross-Platform-Unterstützung bieten, wenn Projekt wie Mono mehr Boden gewinnen wird.
- 1. Warum RegexOptions zu RegexOptions.None in MSIL kompiliert werden?
- 2. MSIL Referenzhandbuch
- 3. Warum müssen wir den übergeordneten Konstruktor explizit in MSIL aufrufen?
- 4. Warum kompiliert diese enum?
- 5. Warum kompiliert g ++ das?
- 6. Warum kompiliert das?
- 7. Warum kompiliert int main() {}?
- 8. Warum kompiliert dieser Codeausschnitt?
- 9. Warum kompiliert es?
- 10. MSIL Frage (Basic)
- 11. IDE für MSIL
- 12. Stringbuilder in CIL (MSIL)
- 13. MSIL: Überflüssig Zweig
- 14. Warum ist die .MaxStack-Richtlinie in MSIL-Code optional?
- 15. Warum kompiliert diese neuinterpret_cast nicht?
- 16. Warum kompiliert es nicht Problem
- 17. Warum wird DateTime.ToDateTime() nicht kompiliert?
- 18. Kompiliert das Kompilieren von systemeigenem Code in .NET die MSIL vollständig?
- 19. Warum werden nicht alle Assemblys in GAC als MSIL erstellt?
- 20. Warum kompiliert dieser Code überhaupt?
- 21. Warum/wie kompiliert sich das?
- 22. Warum kompiliert diese LINQ-Abfrage?
- 23. Warum kompiliert "ELSE:" in vb.net?
- 24. Warum kompiliert endl (std :: cout)
- 25. String Verkettung, warum kompiliert dies?
- 26. Warum zweites Beispiel kompiliert sucessfuly
- 27. Warum kompiliert diese Teilanwendung nicht?
- 28. Warum wird Code nicht kompiliert?
- 29. A() = A() - warum kompiliert es?
- 30. C#: Schreiben MSIL eine Präprozessordirektive
Nun, Java tat das vor Jahren, bevor .NET geboren wurde. Ich denke einfach, dass .NET diese Idee kopiert hat. :) –
Nun, UCSD Pascal tat das in den 1970ern und Java (und viele andere) "kopierten" es. Komm schon! :-) – CesarGon