Windows 8 представляет WinRT, который похож на .NET, но неуправляемый. Почему это неуправляемо? Это проблема с производительностью? Означает ли это, что сборка мусора не подходит для API более низкого уровня?
источник
Windows 8 представляет WinRT, который похож на .NET, но неуправляемый. Почему это неуправляемо? Это проблема с производительностью? Означает ли это, что сборка мусора не подходит для API более низкого уровня?
WinRT является заменой для старого Winapi на основе Си. Это 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, которые реализуют WinRT API, которые работают на рабочем столе. Если бы мы реализовали это в .Net, это было бы чрезвычайно сложно
IInspectable
позволяет вам делать такие вещи, как запрос объекта на предмет его фактического типа класса или списка всех поддерживаемых интерфейсов, а с помощью файлов winmd можно проецировать метаданные WinRT для всего этого в Reflection. ). И файлы winmd не могут быть сразу использованы как сборки взаимодействия, CLR должен обрабатывать их специально.
WinRT неуправляем, потому что он предназначен для замены Win32 - API самого низкого уровня, доступного для разработчиков для Windows. Неуправляемый API по-прежнему является наиболее потенциально производительным, который может быть представлен разработчику, и есть основания полагать, что всегда будет возможно обернуть управляемый API поверх него, что в точности и делают «проекции».
Это также означает, что разработчики C ++ могут использовать WinRT, не перепрыгивая через обручи, которые вводит C ++ / CLI (см. Http://www2.research.att.com/~bs/bs_faq.html#CppCLI ). должен изучить COM, если вы хотите использовать WinRT.
На самом деле вопрос в том, зачем нужен COM? почему Microsoft должна была его изобрести? Потому что простой C ++ без всех дополнительных возможностей COM не подходит для реальной ООП-работы, а претензии Stroustrup на C ++, дающие вам «переносимость», очень неискренни в свете рабочей реальности. Смотрите http://webmechs.com/webpress/2011/11/c-versus-objective-c-as-api-substrate/