Почему WinRT неуправляемый?

В Windows 8 представлена ​​WinRT, похожая на .NET, но неуправляемая. Почему он неуправляемый? Это проблема производительности? Означает ли это, что сборка мусора не подходит для API более низкого уровня?


person user380719    schedule 17.09.2011    source источник
comment
Это был плохой звонок, такой же плохой, как и закрытие. Теперь вы настаиваете на ссылках и источниках, вы отключили это раньше, закрыв вопрос. Теперь вы удалили отличные исходники от программистов, которые над этим работали.   -  person Hans Passant    schedule 27.07.2012
comment
Я проголосовал не по теме, поскольку это не касается практического вопроса программирования. Это просто любопытство. Ни один программист не собирается менять свой код из-за этого вопроса.   -  person Raymond Chen    schedule 27.07.2012
comment
@HansPassant - удаленные ответы содержат слухи, предположения и личное мнение, а не фактические проверяемые факты. Да, могут быть два или три (нынешних и бывших) сотрудника MS, вносящих свой вклад в комментарии, но нам нужны правильные ответы, поддающиеся проверке. Сам вопрос уже вызывает подозрения, потому что он привлекает ответы такого типа. Это связано с такими вопросами, как «Почему Windows не написана на .NET?».   -  person Kev    schedule 27.07.2012
comment
@Kev Исходя из этого рассуждения, такие вопросы, как образование планеты Земля? было бы абсолютно ужасным в научном сообществе, потому что это вызвало множество религиозных спекуляций. На этот вопрос есть хорошие ответы — то, что он вызывает много плохих ответов, не означает, что это плохой вопрос. Действительно, почему бы просто не перенести этот вопрос в P.SE?   -  person Rei Miyasaka    schedule 02.08.2012
comment
@ReiMiyasaka Этот вопрос не по теме P.SE. P.SE не является свалкой всего, что не является конструктивным в Stack Overflow.   -  person casperOne    schedule 05.08.2012
comment
@casperOne Это законный вопрос на доске для многих разработчиков - мы хотим знать предположительно технические причины решения, чтобы мы могли применить те же рассуждения в другом месте. Это потому, что сборщик мусора сложно профилировать? Это потому, что это упрощает доступ к аппаратным абстракциям более низкого уровня? Если нет технических причин, то это просто неудачно, но это не имеет никакого отношения к качеству самого вопроса.   -  person Rei Miyasaka    schedule 05.08.2012
comment
@ReiMiyasaka Если бы это было сформулировано так, это законный вопрос, но этот вопрос не похож ни на что похожее на вопрос, который вы задали в своем комментарии.   -  person casperOne    schedule 05.08.2012
comment
@casperOne Что?? На самом деле это сформулировано почти так же, как мой вопрос: это проблема с производительностью? Означает ли это, что сборка мусора не подходит для API более низкого уровня?   -  person Rei Miyasaka    schedule 05.08.2012
comment
@casperOne Может быть, нам следует отнести это к мета - я думаю, что есть что-то интересное, что можно сказать о классификации такого вопроса, как этот.   -  person Rei Miyasaka    schedule 05.08.2012
comment
Я согласен с @HansPassant; этот вопрос необходимо снова открыть и рассматривать как действительный. Почему он неуправляемый? — очень хороший вопрос относительно основ WinRT.   -  person Rob Perkins    schedule 18.07.2013
comment
Ни один программист не собирается менять свой код из-за этого вопроса. Действительно? Я пришел сюда, потому что думаю отказаться от WPF в пользу чего-то лучшего, а WinRT — это кандидат, о котором мне нужно знать больше.   -  person Bent Tranberg    schedule 19.12.2015
comment
@bre: я не уверен, как ответ на этот вопрос поможет вам определить, что WinRT чем-то лучше, чем WPF. Если речь идет о производительности, то при использовании языка CLR ничего принципиально не меняется. Как и в случае с WPF, у вас по-прежнему есть множество управляемых и неуправляемых переходов. Если вы хотите отказаться от этого, вам придется выбрать неуправляемый язык программирования (C++ с WRL или без него, C++/CX, C++/WinRT). По сути, это переписывание, а не просто изменение вашего кода.   -  person IInspectable    schedule 13.09.2018


Ответы (2)


WinRT — это замена старого Winapi на основе C. Это API, который должен использоваться во многих средах выполнения. Еще 20 лет назад с C API было относительно легко взаимодействовать. С тех пор это изменилось, COM стал универсальным клеем во второй половине 1990-х годов. Практически любая языковая среда выполнения, обычно используемая в Windows, поддерживает COM.

Сборщик мусора — это деталь реализации среды выполнения языка. Например, сборщик для .NET сильно отличается от сборщика для Javascript. Собственные объекты, созданные в любом из них, должны соответствовать очень строгим правилам сборщика. Что, в свою очередь, означает, что им пришлось бы создавать версии WinRT, специфичные для среды выполнения каждого языка. Это не годится, даже такая крупная компания, как Microsoft, не может позволить себе создание и поддержку конкретной версии WinRT для каждой языковой привязки. В этом нет необходимости, учитывая, что эти языки уже поддерживают COM.

На данный момент лучшей привязкой для WinRT является C++, поскольку COM более эффективно работает с явным управлением памятью. С достаточной помощью новых расширений компилятора C++, которые делают его автоматическим, очень похожим на старый _com_ptr_t с синтаксисом, подобным C++/CLI, чтобы избежать этого. Привязка к управляемым языкам относительно проста, поскольку CLR уже имеет отличную поддержку COM-взаимодействия. WinRT также приняла формат метаданных .NET. Afaik, на сегодняшний день работа над управляемыми компиляторами вообще не проводилась.

РЕДАКТИРОВАТЬ: Ларри Остерман, известный программист Microsoft и блогер, оставил довольно хороший комментарий в уже удаленном ответе. Я процитирую его здесь, чтобы сохранить его:

WinRT неуправляема, потому что ОС неуправляема. А благодаря разработке WinRT в том виде, в котором она была разработана, она получает возможность выражаться на многих различных языках, а не только на C++, C# и JS. Например, я мог легко увидеть набор модулей Perl, которые реализуют API-интерфейсы WinRT, работающие на рабочем столе. Если бы мы реализовали это в .Net, это было бы крайне сложно

person Hans Passant    schedule 17.09.2011
comment
Я не знаю о компиляторах, но я почти уверен, что проекция WinRT .NET проделала большую работу над CLR. Возможно, они повторно использовали код COM-взаимодействия, но есть и различия (например, IInspectable позволяет вам делать такие вещи, как запрос объекта для его фактического типа класса или списка всех поддерживаемых интерфейсов, а с файлами winmd можно проецировать метаданные WinRT для всего этого в Отражение). И файлы winmd также нельзя сразу использовать в качестве сборок взаимодействия, CLR должна обрабатывать их специально. - person Pavel Minaev; 18.09.2011
comment
Не уверен, вы игнорируете слона. IInspectable — это замена IDispatch, который застрял в 1997 году. Вы работаете в Microsoft, не стесняйтесь раскрывать некоторые секреты здесь :) - person Hans Passant; 18.09.2011
comment
Вам нужно выведать секреты у Ларри, он тот парень, который над всем этим работал. :) Я не состою ни в одной из команд, которые принимали непосредственное участие в этом, так что мое единственное преимущество в том, что я видел предварительные сборки раньше. В любом случае, я разместил свое исследовательское резюме здесь: interrupt19h. blogspot.com/2011/09/so-what-heck-is-winrt.html — возможно, вам будет интересно. О, и под слоном вы имеете в виду слабые ссылки/явный выпуск объекта в проекции .NET? - person Pavel Minaev; 18.09.2011
comment
@Pavel - нет, слон - это RCW, не реализующие IDisposable. - person Hans Passant; 18.09.2011
comment
Была проделана работа на всех трех языках для поддержки языковых проекций. - person ReinstateMonica Larry Osterman; 18.09.2011
comment
Я бы сказал, что на данный момент «лучшей привязкой для WinRT» на самом деле является C#. Связывание CLR оптимизировано даже за пределами довольно быстрого COM-взаимодействия, а языки .NET в предварительной версии для разработчиков уже реализуют отличную поддержку вездесущих асинхронных функций с «ожиданием». В некоторых демонстрациях код C# делал намного больше, чем примеры C++, и работал проще. Возможно, позже C++ получит вспомогательное расширение async, но в этой версии C++ async выглядел ужасно. И у вас меньше шансов на утечку долговременной памяти из среды CLR, собирающей мусор, чем в проблемной с циклом реализации C++. С# FTW! - person Govert; 21.09.2011
comment
@Larry: C++/CX для проекта C++, WinJS для проекта Javascript, какой третий? В .NET уже есть 2,5 языка. - person Hans Passant; 26.09.2011
comment
@Pavel: в какой //сборке обсуждалось, что было изменено в clr? В сеансе «Что нового в .NET 4.5» никогда не упоминалась WinRT. - person Hans Passant; 26.09.2011
comment
@Hans: 3-я проекция — это CLR для всех языков CLR (в основном C# и VB). Также WinJS — это не проекция, это набор вспомогательных библиотек. Проекция напрямую встроена в движок Chakra JS. - person ReinstateMonica Larry Osterman; 26.09.2011
comment
Спасибо! Это, наконец, имеет смысл - я давно задавался этим вопросом. - person laktak; 12.11.2012
comment
Вам может быть интересно, что вызовы между компонентами быстрее в C #, чем в C ++. Меня удивило, но это может быть полиморфный встроенный кеш jit. - person user1496062; 23.08.2013
comment
им пришлось бы создавать версии WinRT, специфичные для среды выполнения каждого языка. Если бы только была какая-то общеязыковая среда выполнения... - person J D; 01.09.2013

WinRT является неуправляемым, поскольку он предназначен для замены Win32 — самого низкого уровня доступного для разработчиков API для Windows. Неуправляемый API по-прежнему является наиболее потенциально эффективным, который может быть представлен разработчику, и аргументация заключается в том, что всегда можно будет обернуть управляемый API поверх него, что и делают «проекции».

Это также означает, что разработчики C++ могут использовать WinRT, не прыгая через обручи, которые вводит C++/CLI (см. https://www.stroustrup.com/bs_faq.html#CppCLI ) Однако это означает, что вам все равно придется изучать COM, если вы хотите использовать WinRT.

Реальный вопрос: зачем нужен COM? зачем Microsoft это изобретать?» Потому что простой C++ без всех дополнительных возможностей COM не подходит для реальной работы ООП, а заявления Страуструпа о том, что C++ дает вам «переносимость», очень и очень неискренни в свете рабочей реальности. См. https://webmechs.com/webpress/2011/11/09/c-versus-objective-c-as-api-substrate/

person Andz    schedule 12.11.2011