O Windows 8 apresenta o WinRT, que é como o .NET, mas não gerenciado. Por que não é gerenciado? É um problema de desempenho? Isso significa que a coleta de lixo não é adequada para APIs de nível inferior?
O Windows 8 apresenta o WinRT, que é como o .NET, mas não gerenciado. Por que não é gerenciado? É um problema de desempenho? Isso significa que a coleta de lixo não é adequada para APIs de nível inferior?
Respostas:
O WinRT é um substituto para o antigo Winapi baseado em C. É uma API que deve ser utilizável em muitos ambientes de tempo de execução. Há 20 anos, uma API C era relativamente fácil de interoperar. Isso mudou desde então, o COM se tornou a cola universal na última metade da década de 90. Praticamente qualquer tempo de execução de idioma em uso comum no Windows suporta COM.
Um coletor de lixo é um detalhe de implementação do tempo de execução do idioma. O coletor para .NET é muito diferente do coletor para Javascript, por exemplo. Os objetos nativos criados em qualquer um devem observar as regras muito estritas do coletor. O que, por sua vez, significa que eles precisariam criar versões do WinRT específicas para cada idioma de execução. Isso não serve, mesmo uma empresa do tamanho da Microsoft não pode se dar ao luxo de criar e oferecer suporte a uma versão específica do WinRT para todas as associações de idiomas. Também não é necessário, já que esses idiomas já oferecem suporte ao COM.
No momento, a melhor associação para o WinRT é o C ++, pois o COM funciona de maneira mais eficiente com o gerenciamento explícito da memória. Com ampla ajuda das novas extensões do compilador C ++ que o tornam automático, muito semelhante ao _com_ptr_t de antigamente com sintaxe semelhante a C ++ / CLI para evitá-lo. A ligação a idiomas gerenciados é relativamente simples, pois o CLR já possui excelente suporte à interoperabilidade COM. O WinRT também adotou o formato de metadados do .NET. Afaik, nenhum trabalho foi feito em todos os compiladores gerenciados a partir de hoje.
Edição: Larry Osterman, um conhecido programador e blogueiro da Microsoft, deixou um comentário bastante bom em uma resposta agora excluída. Vou citar aqui para preservá-lo:
O WinRT não é gerenciado porque o sistema operacional não é gerenciado. E, ao projetar o WinRT da maneira como foi projetado, ele ganha a capacidade de ser expresso em muitas linguagens diferentes, não apenas em C ++, C # e JS. Por exemplo, eu pude ver facilmente um conjunto de módulos Perl que implementam as APIs do WinRT que funcionam na área de trabalho. Se o tivéssemos implementado no .Net, isso teria sido extremamente difícil
IInspectable
permite que você faça coisas como consultar um objeto por seu tipo de classe real ou a lista de todas as interfaces suportadas, e com os arquivos winmd é possível projetar os metadados do WinRT para tudo isso no Reflection ) E os arquivos winmd não são imediatamente utilizáveis como assemblies de interoperabilidade, o CLR precisa lidar com eles especialmente.
O WinRT não é gerenciado porque se destina a substituir o Win32 - a API acessível para desenvolvedores de nível mais baixo para Windows. Uma API não gerenciada ainda é a de maior desempenho potencial que pode ser exposta ao desenvolvedor e o raciocínio é que sempre será possível agrupar uma API gerenciada em cima dela, que é exatamente o que as 'projeções' fazem.
Isso também significa que os desenvolvedores de C ++ podem usar o WinRT sem pular os bastidores introduzidos pelo C ++ / CLI (consulte http://www2.research.att.com/~bs/bs_faq.html#CppCLI ). precisa estudar COM se quiser usar o WinRT.
A verdadeira questão é 'por que COM é necessário? por que a Microsoft teve que inventá-lo? Como o C ++ simples, sem todos os recursos adicionais do COM, é inadequado para o trabalho de OOP real, e as reivindicações do Stroustrup sobre o C ++ fornecendo a você 'portabilidade' são muito, muito falsas, à luz da realidade do trabalho. Consulte http://webmechs.com/webpress/2011/11/c-versus-objective-c-as-api-substrate/