Neue Frage:
Kompiliert oder führt ein Programm, das mit dem Microsoft .NET Framework geschrieben wurde, nativen Code aus?
Ich meine nicht, ob es eine Möglichkeit gibt, das .net-Framework nicht auf einer Maschine installieren zu müssen. Einfach ausgedrückt: Läuft eine .net-Anwendung auf einer anderen Ebene wie Java (z. B. Bytecode).
Eine .NET-Anwendung muss über die Common Language Runtime (CLR) laufen.
Die CLR ist Microsofts Implementierung des CLI Standards. (Und neben dem Microsoft .NET Framework gibt es weitere Implementierungen der CLR, z. B .: Mono , Portable.NET ).
Die CLR führt einen Typ von Bytecode aus, der als Common Intermediate Language ( CIL ) bekannt ist.
Sortieren. Der .NET-Compiler kompiliert Ihren Quellcode in IL (eine Zwischensprache) und packt ihn in eine Assembly (normalerweise eine .DLL- oder .EXE-Datei), die Sie bereitstellen. Zur Laufzeit wird es von einer CLR (Common Language Runtime) gehostet, die für die Ausführung des Codes, die Durchsetzung von Sicherheitsregeln usw. zuständig ist. Die Haupt-Desktop-CLR für Windows (es gibt andere wie Mono und Silverlight) interpretiert die IL nicht, sondern "JIT" s (nur in Zeit kompiliert) den IL-Code in nativen Code vor dem Ausführen von Methoden (Funktionen).
Beachten Sie, dass Just-in-Time-Kompilierung tatsächlich einige Leistungsvorteile bietet. Beispielsweise kann die CLR den von ihr erzeugten nativen Code basierend auf den Leistungsmerkmalen der Maschine, auf der sie ausgeführt wird, wie CPU-Typ, CPU-Cache-Größe, Anzahl der CPUs, RAM-Größe usw. optimieren. Herkömmliche Compiler können dies nicht so wie sie tun Ich weiß nicht, auf welcher Maschine der von ihnen erzeugte Code letztendlich ausgeführt wird.
Außerdem können Assemblies mit einem Tool namens ngen <"vor JIT" erstellt werden / a>. In diesem Prozess wird der systemeigene Code aus der IL kompiliert, bevor die Assembly ausgeführt und auf der Festplatte zwischengespeichert wird. Auf diese Weise entsteht zur Laufzeit kein JIT-Overhead.
Wenn Sie ein .NET-Programm kompilieren, wird es in IL (Intermediate Language) kompiliert. IL ist der Assemblersprache sehr ähnlich. Diese IL wird dann zur Laufzeit über den JIT-Compiler (Just In Time) in nativen Code konvertiert.
Also, um Ihre Frage zu beantworten, ja und nein. Der Compiler gibt keinen nativen Code aus, sondern IL, das beim Ausführen der Anwendung in nativen Code konvertiert wird.
Nun, zumindest mit Mono weiß ich, dass Sie nativen Code anstelle von verwalteten Assemblys generieren können. Ich denke, es gibt OpenSource-Tools für Windows, die das auch können.
Ich denke, man muss vorsichtig sein, wenn man fragt, ob es "kompiliert" ist und angenommen, dass dies bedeutet, dass das ausgegebene Ergebnis "nativer Code" sein muss. Dies ist nicht was "kompiliert" bedeutet:
"Wir sagen im Allgemeinen, dass eine Sprache" interpretiert "wird, wenn der ursprüngliche Übersetzer einfach ist. Wenn der Übersetzer kompliziert ist, sagen wir, dass die Sprache" kompiliert "ist. Die Unterscheidung kann verwirrend sein, weil" einfach "und "Kompliziert" sind subjektive Begriffe, und weil es für einen Compiler möglich ist, Code zu erzeugen, der dann von einer komplizierten virtuellen Maschine (Interpreter) ausgeführt wird ... Diese zwei Eigenschaften - gründliche Analyse und nicht-triviale Transformation - sind die Kennzeichen der Kompilierung.
Von "Programmiersprache Pragmatik" von Michael L. Scott. Seltsamerweise ist dies ein Lehrbuch zur Programmierung der Sprachtheorie, das ich zufällig heute Nachmittag mit der Seite gelesen habe, die zu diesem Zitat offen ist.
Also, ja, C # und andere .NET Sprachen laufen auf der CLR und sie sind kompiliert.
C ++ ist die eine .Net-Sprache, die nicht in IL kompiliert werden muss, aber Sie können keine .NET-Referenzen oder Code von .Net haben, wenn Sie diese Option verwenden.
Die andere Sache, in die wir schauen müssen, ist, was c dragon darauf hinwies - ngen.exe, die einige bemerkenswerte Verbesserungen für viele .Net windows / konsolenbasierte Anwendungen haben kann.
zum Zeitpunkt der Ausführung generiert der Compiler einen IL-Code, der ein Zwischensprachcode ist, dann wird der Code durch den JIT-Compiler in nativen Code umgewandelt