Ich habe dieses schöne Bild hier gesehen . Ich habe erfahren, dass alle Compiler, die die .net-Sprache unterstützen, den Quellcode in das CIL
Format konvertieren. Jetzt bringt Microsoft niemals das .NET
gesamte Betriebssystem ein, indem es eine CLR für alle Betriebssysteme schreibt. Warum sollten Sie dann ein solches Zwischencodeformat und eine CLR beibehalten, um diese CIL auszuführen? Ist das nicht Kopfschmerzen zu behandeln. Warum hat Microsoft so gewählt?
BEARBEITEN Diese Art von Architektur hat ihren Preis. Es wird die Leistung reduzieren, nicht wahr? Java tut dies, um die Plattformunabhängigkeit aufrechtzuerhalten. Aus welchem Grund tut .NET dies? Warum nicht einen einfachen C-ähnlichen Compiler behalten? In jedem Fall muss ein Compiler den Code in CIL konvertieren, wenn ich eine neue Sprache hinzufügen muss. Der einzige Unterschied wäre die Zielsprache. Tat ist alles.
Antworten:
Weil sie nur einen Compiler für C # in CIL schreiben müssen - was der schwierige Teil ist. Das Erstellen eines Interpreters (oder häufiger eines Just-In-Time-Compilers) für die CIL pro Plattform ist relativ einfach im Vergleich zum Schreiben eines Compilers von C # in (pro Plattform) ausführbaren Code.
Darüber hinaus kann die Laufzeit alles verarbeiten, was zu CIL kompiliert wird. Wenn Sie eine neue Sprache (wie F #) möchten, müssen Sie nur einen Compiler dafür schreiben , und Sie erhalten automatisch die gesamte Plattformunterstützung für Dinge, die .NET unterstützt.
Oh, und ich kann eine .NET-DLL nehmen und diese unter Windows oder Linux über Mono ohne Neukompilierung ausführen (vorausgesetzt, alle meine Abhängigkeiten sind erfüllt).
Die Leistung ist umstritten. Es gibt im Wesentlichen "Pre-Compiler", die die CIL verwenden und native Binärdateien erstellen. Andere argumentieren, dass Just-in-Time-Compiler Optimierungen vornehmen können, die statische Compiler einfach nicht können. Nach meiner Erfahrung hängt es stark davon ab, was Ihre Anwendung tut und auf welcher Plattform Sie sie ausführen (hauptsächlich, wie gut der JITer auf dieser Plattform ist). Es ist äußerst selten, dass ich auf ein Szenario stoße, in dem .NET nicht gut genug war .
quelle
readonly
Feldern. Herkömmliche Compiler können einige dieser Optimierungen durchführen, jedoch nur, wenn sie durch statische Analyse erkannt werden können. Im Gegensatz dazu kann ein Jitter zur Laufzeit feststellen, dass (zum Beispiel) ein Codeabschnitt keine nützliche Arbeit leistet, da die von ihm geänderten Objekte oder Variablen nirgendwo anders referenziert werden. Ich bin kein Experte für Jitter, aber es ist im Grunde eine Frage der Kraft der dynamischen vs. statischen Analyse..NET verfügt aus dem gleichen Grund wie Java über eine Zwischensprache (CIL / MSIL) und plattformspezifische Implementierungen einer plattformunabhängigen Laufzeit (CLR). Microsoft beabsichtigte, C # direkt mit Java zu konkurrieren, und zwar auf den Betriebssystemen, auf die Microsoft abzielt (seine eigenen).
Die Vorteile sind ähnlich wie bei Java, obwohl .NET nur auf Windows-Plattformen (oder anderen Betriebssystemen mit .NET-ähnlichen Funktionen wie Mono / Linux) unterstützt wird:
Aus kartellrechtlichen Gründen achtet MS darauf, dass andere wichtige Plattformen wie Android, Mac OSX / iOS und Linux nicht zu stark "gestört" werden. Es gibt jedoch tatsächlich Teams, die sich für alle drei dieser Plattformen entwickeln. Es gibt eine von MS entwickelte Version von Office für OSX, es gibt zahlreiche Anwendungen, einschließlich Office Interop-Apps für iOS und Android, Skype (jetzt ein Microsoft-Produkt) läuft unter Linux, und Microsoft hat sogar einen Beitrag zum Linux-Kernel geleistet (hauptsächlich in a Virtualisierungs-Denkweise).
quelle
Das Windows-Betriebssystem ist für verschiedene CPU-Typen verfügbar, heute hauptsächlich x64, x86, Intel, ARM.
CIL / CLR ist unabhängig von dieser Hardwareplattform - diese Unterschiede werden von der IL-Ausführungsumgebung "abstrahiert". Beispielsweise kann eine für "jede CPU" kompilierte .NET-Assembly normalerweise unter Win64 als 64-Bit-Prozess und unter Win32 als 32-Bit-Prozess ausgeführt werden, ohne dass unterschiedliche ausführbare Dateien bereitgestellt werden müssen.
Darüber hinaus ermöglicht die CIL das Speichern von Metadaten in Assemblys, was mit nativen DLLs nicht einfach möglich ist (es ist natürlich möglich, dass MS dies zuvor mit COM-Komponenten getan hat, aber diese Technologie war nie so einfach zu handhaben wie .NET-Komponenten). Das macht die Erstellung von Softwarekomponenten um einiges einfacher und ist die Grundlage für Reflexion / Selbstbeobachtung in allen .NET-Sprachen.
quelle