Windows 8 führt WinRT ein, das wie .NET ist, jedoch nicht verwaltet wird. Warum ist es nicht verwaltet? Ist es ein Leistungsproblem? Bedeutet dies, dass die Speicherbereinigung nicht für APIs niedrigerer Ebene geeignet ist?
Windows 8 führt WinRT ein, das wie .NET ist, jedoch nicht verwaltet wird. Warum ist es nicht verwaltet? Ist es ein Leistungsproblem? Bedeutet dies, dass die Speicherbereinigung nicht für APIs niedrigerer Ebene geeignet ist?
Antworten:
WinRT ist ein Ersatz für das uralte C-basierte Winapi. Es ist eine API, die in vielen Laufzeitumgebungen verwendet werden muss. Vor 20 Jahren war es relativ einfach, mit einem C api zu interagieren. Das hat sich seitdem weiterentwickelt. In der letzten Hälfte der neunziger Jahre wurde COM zum universellen Klebstoff. Praktisch jede in Windows gebräuchliche Sprachlaufzeit unterstützt COM.
Ein Garbage Collector ist ein Detail für die Implementierung der Sprachlaufzeit. Der Collector für .NET unterscheidet sich stark vom Collector für Javascript. Die in beiden erstellten nativen Objekte müssen die sehr strengen Regeln des Sammlers beachten. Dies bedeutet wiederum, dass sie WinRT-Versionen erstellen müssten, die für jede Sprachlaufzeit spezifisch sind. Dies reicht nicht aus, selbst ein so großes Unternehmen wie Microsoft kann es sich nicht leisten, für jede Sprachbindung eine bestimmte WinRT-Version zu erstellen und zu unterstützen. Es ist auch nicht notwendig, da diese Sprachen COM bereits unterstützen.
Derzeit ist C ++ die beste Bindung für WinRT, da COM mit expliziter Speicherverwaltung effizienter arbeitet. Mit reichlich Hilfe der neuen C ++ - Compiler-Erweiterungen, die es automatisch machen, sehr ähnlich zu _com_ptr_t von früher mit C ++ / CLI-ähnlicher Syntax, um dies zu vermeiden. Das Binden an verwaltete Sprachen ist relativ einfach, da die CLR bereits eine hervorragende COM-Interop-Unterstützung bietet. WinRT hat auch das Metadatenformat von .NET übernommen. Afaik, bis heute wurden überhaupt keine Arbeiten an verwalteten Compilern durchgeführt.
EDIT: Larry Osterman, ein bekannter Microsoft-Programmierer und Blogger, hat in einer jetzt gelöschten Antwort einen ziemlich guten Kommentar hinterlassen. Ich werde es hier zitieren, um es zu bewahren:
WinRT wird nicht verwaltet, da das Betriebssystem nicht verwaltet wird. Durch die Gestaltung von WinRT in der Art und Weise, wie es entworfen wurde, kann es in vielen verschiedenen Sprachen ausgedrückt werden, nicht nur in C ++, C # und JS. Zum Beispiel konnte ich leicht eine Reihe von Perl-Modulen sehen, die die WinRT-APIs implementieren, die auf dem Desktop funktionieren. Wenn wir es in .Net implementiert hätten, wäre das äußerst schwierig gewesen
IInspectable
können Sie beispielsweise ein Objekt nach seinem tatsächlichen Klassentyp oder der Liste aller unterstützten Schnittstellen abfragen und mit winmd-Dateien WinRT-Metadaten für all das in Reflection projizieren ). Und winmd-Dateien können auch nicht sofort als Interop-Assemblys verwendet werden, CLR muss sie speziell behandeln.
WinRT wird nicht verwaltet, da es als Ersatz für Win32 gedacht ist - die niedrigste Entwickler-API für Windows. Eine nicht verwaltete API ist immer noch die potenziell leistungsfähigste, die dem Entwickler zur Verfügung gestellt werden kann, und es wird argumentiert, dass es immer möglich sein wird, eine verwaltete API darüber zu wickeln, was genau das ist, was 'Projektionen' tun.
Dies bedeutet auch, dass C ++ - Entwickler WinRT verwenden können, ohne durch die von C ++ / CLI eingeführten Rahmen zu springen (siehe http://www2.research.att.com/~bs/bs_faq.html#CppCLI) ). Dies bedeutet jedoch, dass Sie dies weiterhin tun werden müssen COM lernen, wenn Sie WinRT verwenden möchten.
Die eigentliche Frage ist: Warum ist COM notwendig? Warum musste Microsoft es erfinden? ' Weil einfaches C ++ ohne alle zusätzlichen Funktionen von COM für echte OOP-Arbeit nicht ausreicht und Stroustrups Behauptungen, dass C ++ Ihnen "Portabilität" bietet, angesichts der Arbeitsrealität sehr, sehr unaufrichtig sind. Siehe http://webmechs.com/webpress/2011/11/c-versus-objective-c-as-api-substrate/