Windows 8 представляє WinRT, який схожий на .NET, але некерований. Чому це некеровано? Це проблема продуктивності? Це означає, що збір сміття не підходить для API нижчого рівня?
Windows 8 представляє WinRT, який схожий на .NET, але некерований. Чому це некеровано? Це проблема продуктивності? Це означає, що збір сміття не підходить для API нижчого рівня?
Відповіді:
WinRT - це заміна віковому вінапі на базі С. Це 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. Афаїку, на сьогоднішній день жодна робота над керованими компіляторами не проводилася.
EDIT: Ларрі Остерман, відомий програміст та блогер Microsoft, залишив досить хороший коментар у видаленій відповіді. Я цитую його для збереження:
WinRT не управляється, тому що ОС не керована. І проектуючи WinRT таким, яким він був розроблений, він набуває здатності виражатися на багатьох різних мовах, а не тільки на C ++, C # та JS. Наприклад, я міг легко бачити набір модулів Perl, які реалізують API WinRT, які працюють на робочому столі. Якби ми реалізували це у .Net, це було б надзвичайно важко
IInspectable
ви можете робити такі речі, як запит об’єкта на його фактичний тип класу чи список усіх підтримуваних інтерфейсів, а з файлами winmd можна спроектувати метадані WinRT для всього цього у відображення ). І файли 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 є недостатнім для реальної роботи OOP, а претензії Stroustrup на C ++, що дають вам «переносимість», є дуже обережними з огляду на робочу реальність. Дивіться http://webmechs.com/webpress/2011/11/c-versus-objective-c-as-api-substrate/