Por que o WinRT não é gerenciado? [fechadas]

164

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?

user380719
fonte
56
Foi uma decisão ruim , tão ruim quanto fechá-la. Agora você insiste em referências e fontes, cortou isso mais cedo fechando a pergunta. Agora você excluiu fontes excelentes, dos programadores que trabalharam nela.
Hans Passant
9
Votei fora do tópico, pois isso não aborda uma questão prática de programação. É apenas curiosidade. Nenhum programador irá alterar seu código como resultado desta pergunta.
Raymond Chen
17
@Kev Por esse raciocínio, perguntas como "como foi formado o planeta Terra?" teria sido absolutamente terrível na comunidade científica, porque atraiu muita especulação religiosa. Existem boas respostas para essa pergunta - só porque ela atrai muitas respostas ruins não significa que seja uma pergunta ruim. Realmente, por que não mudar essa pergunta para a P.SE?
Rei Miyasaka
22
@casperOne É uma pergunta legítima do "quadro branco" para muitos desenvolvedores - queremos saber os motivos presumivelmente técnicos da decisão, para que possamos aplicar o mesmo raciocínio em outro lugar. É porque o coletor de lixo é difícil de criar um perfil? É porque facilita o acesso a abstrações de hardware de nível inferior? Se não houver razões técnicas, isso é simplesmente lamentável - mas isso não tem nada a ver com a qualidade da pergunta em si.
Rei Miyasaka
7
Eu concordo com @HansPassant; esta questão precisa ser reaberta e tratada como válida. "Por que não é gerenciado?" é uma pergunta muito boa em relação aos fundamentos do WinRT.
Rob Perkins

Respostas:

190

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

Hans Passant
fonte
14
Eu não sei sobre compiladores, mas tenho certeza de que a projeção do WinRT .NET teve muito trabalho realizado no CLR. Eles podem ter reutilizado o código de interoperabilidade COM, mas também existem diferenças (por exemplo, IInspectablepermite 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.
Pavel Minaev 17/09/11
5
Não tenho certeza, você está ignorando o elefante. IInspectable é um substituto para IDispatch que ficou preso em 1997. Trabalha em Microsoft, sinta-se livre para dar afastado alguns dos segredos aqui :)
Hans Passant
13
Foram realizados trabalhos nos três idiomas para apoiar as projeções de idiomas.
precisa
13
Eu diria que agora 'a melhor ligação para o WinRT' é realmente C #. A ligação CLR é otimizada mesmo além da rápida interoperabilidade COM, e as linguagens .NET na pré-visualização do desenvolvedor já implementam excelente suporte para as funções assíncronas onipresentes com 'aguardar'. Em algumas demos, o código C # fez muito mais do que as amostras C ++ e funcionou mais facilmente. Talvez mais tarde o C ++ obtenha uma extensão auxiliar assíncrona, mas nesta versão o assíncrono C ++ parecia terrível. E é menos provável que você vaze memória de longo prazo do CLR coletor de lixo do que a implementação C ++ com problemas de ciclo. C # FTW!
Govert
13
@ Hans: A terceira projeção é o CLR para todos os idiomas CLR (principalmente C # e VB). Além disso, o WinJS não é uma projeção, é um conjunto de bibliotecas de suporte. A projeção é diretamente incorporada ao mecanismo Chakra JS.
Home
25

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/

Andz
fonte
Link atualizado para as reflexões de Bjarne sobre C ++ / CLI: stroustrup.com/bs_faq.html#CppCLI