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/