Warum wird WinRT nicht verwaltet? [geschlossen]

164

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?

user380719
quelle
56
Dies war ein schlechter Anruf , genauso schlimm wie das Schließen. Sie bestehen jetzt auf Referenzen und Quellen. Sie haben dies früher abgeschnitten, indem Sie die Frage geschlossen haben. Jetzt haben Sie hervorragende Quellen von den Programmierern gelöscht , die daran gearbeitet haben.
Hans Passant
9
Ich habe als Off-Topic abgestimmt, da hier keine praktische Programmierfrage angesprochen wird. Es ist nur Neugier. Kein Programmierer wird aufgrund dieser Frage seinen Code ändern.
Raymond Chen
17
@Kev Nach dieser Überlegung Fragen wie "Wie wurde der Planet Erde geformt?" wäre in der Wissenschaftsgemeinschaft absolut schrecklich gewesen, weil es viele religiöse Spekulationen anzog. Es gibt gute Antworten auf diese Frage - nur weil sie viele schlechte Antworten anzieht, heißt das nicht, dass es eine schlechte Frage ist. Wirklich, warum nicht einfach diese Frage an P.SE verschieben?
Rei Miyasaka
22
@casperOne Es ist eine legitime "Whiteboard" -Frage für viele Entwickler - wir möchten die vermutlich technischen Gründe für die Entscheidung kennen, damit wir die gleichen Überlegungen an anderer Stelle anwenden können. Liegt es daran, dass der Garbage Collector schwer zu profilieren ist? Liegt es daran, dass es den Zugriff auf Hardware-Abstraktionen auf niedrigerer Ebene erleichtert? Wenn es keine technischen Gründe gibt, ist das einfach unglücklich - aber das hat überhaupt nichts mit der Qualität der Frage selbst zu tun.
Rei Miyasaka
7
Ich stimme @HansPassant zu; Diese Frage muss erneut geöffnet und als gültig behandelt werden. "Warum ist es nicht verwaltet?" ist eine sehr gute Frage in Bezug auf WinRT-Grundlagen.
Rob Perkins

Antworten:

190

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

Hans Passant
quelle
14
Ich weiß nichts über Compiler, aber ich bin mir ziemlich sicher, dass die WinRT .NET-Projektion viel Arbeit mit CLR geleistet hat. Möglicherweise haben sie COM Interop-Code wiederverwendet, aber es gibt auch Unterschiede (z. B. IInspectablekö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.
Pavel Minaev
5
Ich bin mir nicht sicher, ob du den Elefanten ignorierst. IInspectable ist ein Ersatz für IDispatch, das 1997 feststeckte. Sie arbeiten für Microsoft und können hier einige der Geheimnisse preisgeben :)
Hans Passant
13
Es wurden Arbeiten in allen drei Sprachen durchgeführt, um die Sprachprojektionen zu unterstützen.
ReinstateMonica Larry Osterman
13
Ich würde behaupten, dass "die beste Bindung für WinRT" derzeit tatsächlich C # ist. Die CLR-Bindung ist sogar über das ziemlich schnelle COM-Interop hinaus optimiert, und die .NET-Sprachen in der Entwicklungsvorschau implementieren bereits eine hervorragende Unterstützung für die allgegenwärtigen asynchronen Funktionen mit "Warten". In einigen Demos hat der C # -Code viel mehr als die C ++ - Beispiele getan und war einfacher. Vielleicht bekommt C ++ später eine asynchrone Hilfserweiterung, aber in dieser Version sah C ++ asynchron schrecklich aus. Und es ist weniger wahrscheinlich, dass Sie Langzeitspeicher aus der CLR für die Speicherbereinigung verlieren als aus der zyklusproblematischen C ++ - Implementierung. C # FTW!
Govert
13
@Hans: Die 3. Projektion ist die CLR für alle CLR-Sprachen (hauptsächlich C # und VB). Auch WinJS ist keine Projektion, sondern eine Reihe von Unterstützungsbibliotheken. Die Projektion ist direkt in die Chakra JS-Engine integriert.
ReinstateMonica Larry Osterman
25

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/

Andz
quelle
Aktualisierter Link für Bjarnes