Windows 8 introduit WinRT, qui ressemble à .NET mais non géré. Pourquoi n'est-il pas géré? Est-ce un problème de performances? Cela signifie-t-il que le garbage collection n'est pas adapté aux API de niveau inférieur?
Windows 8 introduit WinRT, qui ressemble à .NET mais non géré. Pourquoi n'est-il pas géré? Est-ce un problème de performances? Cela signifie-t-il que le garbage collection n'est pas adapté aux API de niveau inférieur?
Réponses:
WinRT remplace l'ancien Winapi basé sur C. C'est une API qui doit être utilisable dans de nombreux environnements d'exécution. Il y a 20 ans, une API C était relativement facile à interopérer. Cela a évolué depuis, COM est devenu la colle universelle dans la dernière moitié des années 1990. Pratiquement n'importe quel environnement d'exécution de langage couramment utilisé dans Windows prend en charge COM.
Un garbage collector est un détail d'implémentation d'exécution du langage. Le collecteur pour .NET est très différent du collecteur pour 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 à son tour qu'ils auraient dû créer des versions WinRT spécifiques à chaque environnement d'exécution de langue. Cela ne fonctionnera pas, même une entreprise aussi grande que Microsoft ne peut pas se permettre de créer et de prendre en charge une version WinRT spécifique pour chaque liaison de langue. Ce n'est pas non plus nécessaire, étant donné que ces langages prennent déjà en charge COM.
À l'heure actuelle, la meilleure liaison pour WinRT est C ++ puisque COM fonctionne plus efficacement avec une gestion de mémoire explicite. Avec l'aide des nouvelles extensions de compilateur C ++ qui le rendent automatique, très similaire à _com_ptr_t de l'ancien avec une syntaxe de type C ++ / CLI pour l'éviter. La liaison aux langages gérés est relativement simple car le CLR a déjà un excellent support d'interopérabilité COM. WinRT a également adopté le format de métadonnées de .NET. Afaik, aucun travail n'a été fait du tout sur les compilateurs gérés à ce jour.
EDIT: Larry Osterman, un programmeur et blogueur Microsoft bien connu, a laissé un assez bon commentaire dans une réponse maintenant supprimée. Je vais le citer ici pour le préserver:
WinRT n'est pas géré car le système d'exploitation n'est pas géré. Et en concevant WinRT tel qu'il a été conçu, il gagne la capacité de s'exprimer dans de nombreux langages différents, pas seulement C ++, C # et JS. Par exemple, je pourrais facilement voir un ensemble de modules Perl qui implémentent les API WinRT qui fonctionnent sur le bureau. Si nous l'avions implémenté dans .Net, cela aurait été extrêmement difficile
IInspectable
vous permet de faire des choses comme interroger un objet pour son type de classe réel ou la liste de toutes les interfaces prises en charge, et avec les fichiers winmd, on peut projeter des métadonnées WinRT pour tout cela dans Reflection ). Et les fichiers winmd ne sont pas non plus immédiatement utilisables comme assemblages d'interopérabilité, CLR doit les gérer spécialement.
WinRT n'est pas géré car il est destiné à remplacer Win32 - l'API accessible aux développeurs de plus bas niveau pour Windows. Une API non gérée est toujours la plus potentiellement 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, ce qui est précisément ce que font les `` projections ''.
Cela signifie également que les développeurs C ++ peuvent utiliser WinRT sans sauter par les obstacles que C ++ / CLI introduit (voir http://www2.research.att.com/~bs/bs_faq.html#CppCLI ) Cela signifie cependant que vous allez toujours devez étudier COM si vous souhaitez utiliser WinRT.
La vraie question est «pourquoi COM est-il nécessaire? pourquoi Microsoft a-t-il dû l'inventer? Parce que le simple C ++ sans toutes les fonctionnalités supplémentaires de COM est inadéquat pour un vrai travail de POO et les affirmations de Stroustrup de C ++ vous donnant la «portabilité» sont très très malhonnêtes à la lumière de la réalité de travail. Voir http://webmechs.com/webpress/2011/11/c-versus-objective-c-as-api-substrate/