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.
Wenn Sie eine sprachunabhängige Zwischensprache haben, können Sie auch viele höhere Sprachen (C #, VB.NET, Python usw.) verwenden, die alle auf in anderen Sprachen geschriebene Assemblys verweisen. Da sie sich alle zu einem Ganzen zusammenfügen, 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.
Erste Konvertierung von High-Level-Sprache und dann auf Maschinenebene, so ist die .Net-Plattform konzipiert. Die erste Schicht kümmert sich um Hochsprache MSIL und die zweite Ebene kann sich auf Hitch & amp; Glitch der Plattform, um von MSIL zu Maschinenebenencode zu konvertieren. 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.
Eine ausführbare Datei ist nicht an die Plattform gebunden. Zum Beispiel zielt XNA beide PPC (Xbox360) und x86-Prozessoren. Einige Programme laufen auf Mono unter Linux oder OSX.
Damit können Sie die Zielmaschine besser optimieren oder fehlende Funktionen ersetzen: