166 votes

Pourquoi WinRT n'est-il pas géré ?

Windows 8 introduit WinRT, qui est comme .NET mais non géré. Pourquoi n'est-il pas géré ? Est-ce un problème de performance ? Cela signifie-t-il que le garbage collection n'est pas adapté aux API de niveau inférieur ?

56 votes

C'était un mauvais choix aussi mauvais que de le fermer. Vous insistez maintenant sur les références et les sources, alors que vous les avez supprimées plus tôt en fermant la question. Maintenant, vous supprimé d'excellentes sources, provenant des programmeurs qui ont travaillé dessus.

9 votes

J'ai voté comme hors sujet car cela ne répond pas à une question pratique de programmation. C'est juste de la curiosité. Aucun programmeur ne va modifier son code suite à cette question.

0 votes

@HansPassant - les réponses supprimées contiennent des ouï-dire, des spéculations et des opinions personnelles plutôt que des faits réels vérifiables. Oui, il se peut qu'il y ait deux ou trois employés (actuels et anciens) de MS qui interviennent dans les commentaires, mais nous voulons des faits vérifiables. réponses . La question elle-même est déjà suspecte car elle attire ce type de réponses. Elle est au même niveau que des questions comme "Pourquoi Windows n'est-il pas écrit en .NET ?".

195voto

Hans Passant Points 475940

WinRT est un remplacement pour le très ancien Winapi basé sur le langage C. Il s'agit d'une api qui doit être utilisable dans de nombreux environnements d'exécution. Il y a 20 ans, il était relativement facile d'interopérer avec une api C. Les choses ont évolué depuis, COM est devenu la colle universelle dans la dernière moitié des années 1990. Pratiquement tous les environnements d'exécution de langage couramment utilisés sous Windows supportent COM.

Un ramasseur de déchets est un détail d'implémentation de l'exécution du langage. Le collecteur de .NET est très différent de celui de Javascript, par exemple. Les objets natifs créés dans l'un ou l'autre doivent respecter les règles très strictes du collecteur. Ce qui signifie qu'il aurait fallu créer des versions de WinRT spécifiques à chaque langage d'exécution. Ce n'est pas possible, même une entreprise aussi importante que Microsoft ne peut se permettre de créer et de prendre en charge une version WinRT spécifique pour chaque liaison linguistique. Ce n'est pas non plus nécessaire, étant donné que ces langues prennent déjà en charge COM.

Actuellement, la meilleure liaison pour WinRT est C++, car COM fonctionne plus efficacement avec une gestion explicite de la mémoire. Avec l'aide des nouvelles extensions du compilateur C++ qui la rendent automatique, très similaire à _com_ptr_t de l'ancien temps avec une syntaxe de type C++/CLI pour l'éviter. La liaison aux langages gérés est relativement simple puisque le CLR dispose déjà d'un excellent support d'interopérabilité COM. WinRT a également adopté le format de métadonnées de .NET. À ce jour, aucun travail n'a été effectué sur les compilateurs gérés.

EDIT : Larry Osterman, un programmeur et blogueur Microsoft bien connu, a laissé un commentaire plutôt intéressant dans une réponse maintenant supprimée. Je vais le citer ici pour le préserver :

WinRT est non géré parce que le système d'exploitation est non géré. Et en concevant WinRT de la manière dont il a été conçu, il acquiert la capacité d'être exprimé dans de nombreux langages différents, et pas seulement en C++, C# et JS. Par exemple, je pourrais facilement imaginer un ensemble de modules Perl qui mettent en œuvre les API de WinRT et qui fonctionnent sur le bureau. Si nous l'avions implémenté en .Net, cela aurait été extrêmement difficile

14 votes

Je ne sais pas ce qu'il en est des compilateurs, mais je suis presque sûr que la projection WinRT .NET a beaucoup travaillé sur CLR. Ils ont peut-être réutilisé le code COM Interop, mais il y a aussi des différences (par ex. IInspectable vous permet de faire des choses comme interroger un objet pour connaître son type de classe réel ou la liste de toutes les interfaces prises en charge, et avec les fichiers winmd, vous pouvez projeter les métadonnées WinRT pour tout cela dans Reflection). Les fichiers winmd ne sont pas non plus immédiatement utilisables en tant qu'assemblages interop, le CLR doit les traiter de manière spécifique.

5 votes

Pas sûr, vous ignorez l'éléphant. IInspectable est un remplacement de IDispatch qui est resté bloqué en 1997. Vous travaillez pour Microsoft, n'hésitez pas à donner certains des secrets ici :)

2 votes

Vous devez demander des secrets à Larry, c'est lui qui a travaillé sur tout ça :) Je ne fais partie d'aucune des équipes qui ont eu un rôle direct dans ce projet, donc mon seul avantage est de voir les previews plus tôt. Quoi qu'il en soit, j'ai posté mon résumé exploratoire ici : interrupt19h.blogspot.com/2011/09/so-what-heck-is-winrt.html - vous pourriez trouver cela intéressant. Oh, et par "éléphant", voulez-vous dire les références faibles / la libération explicite des objets dans la projection .NET ?

25voto

Andz Points 711

WinRT n'est pas géré parce qu'il est destiné à remplacer Win32, l'API de plus bas niveau accessible aux développeurs pour Windows. Une API non gérée reste la plus performante qui puisse être exposée au développeur et le raisonnement est qu'il sera toujours possible d'envelopper une API gérée par-dessus, ce qui est précisément ce que font les "projections".

Cela signifie également que les développeurs C++ peuvent utiliser WinRT sans avoir à franchir les obstacles introduits par C++/CLI ( cf. https://www.stroustrup.com/bs_faq.html#CppCLI ) Cela signifie cependant que vous devrez toujours étudier COM si vous voulez utiliser WinRT.

La véritable question est la suivante : "Pourquoi COM est-il nécessaire ? Pourquoi Microsoft a-t-il dû l'inventer ? Parce que le simple C++, sans toutes les facilités ajoutées par COM, est inadéquat pour un vrai travail de POO et les affirmations de Stroustrup selon lesquelles le C++ vous donne la "portabilité" sont très très malhonnêtes à la lumière de la réalité du travail. Voir https://webmechs.com/webpress/2011/11/09/c-versus-objective-c-as-api-substrate/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X