В Windows 8 представлена WinRT, похожая на .NET, но неуправляемая. Почему он неуправляемый? Это проблема производительности? Означает ли это, что сборка мусора не подходит для API более низкого уровня?
Почему WinRT неуправляемый?
Ответы (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, это было бы крайне сложно
IInspectable позволяет вам делать такие вещи, как запрос объекта для его фактического типа класса или списка всех поддерживаемых интерфейсов, а с файлами winmd можно проецировать метаданные WinRT для всего этого в Отражение). И файлы winmd также нельзя сразу использовать в качестве сборок взаимодействия, CLR должна обрабатывать их специально.
- person Pavel Minaev; 18.09.2011
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/