[ANN] WinRT - новое компонентное API для Windows 8
От: Gollum Россия  
Дата: 15.09.11 13:54
Оценка: 196 (17)
Я тут попробовал описать свои впечатления от WinRT
Честно, даже не знаю куда отправить По логике вещей это надо в COM, или C++. Но что-то мне кажется, что это нужно в первую очередь в .NET, так как по идее, это то, что нас всех ждет в самом ближайшем будущем. Копирую сообщение сюда, чтобы в блог было необязательно ходить Сиплюсплюсник из меня аховый, конечно, если что — поправляйте.

После второго дня конференции сложилось впечатление, что ходить нужно только на сессии про С++. Все остальное лишь показывает, как использовать новые API WinRT, но при этом остается непонятно, как собственно этот WinRT устроен. Я напишу, как понял сам

Итак, WinRT — это COM следующей версии. В общем, это и неудивительно, учитывая что Steven Sinofsky делал и предыдущую версию. Плюс к этому, WinRT использует расширения C++, как стандарта 11, так и собственные. Некоторой частью эти расширения похожи на расширения managed C++, но не нужно их путать. WinRT не использует CLR, и несмотря на то, что синтаксис местами одинаковый (например, Search::QueryOptions^), в WinRT это означает совсем другое. Для начала, чтобы создать библиотеку WinRT, используется ключ компилятора /ZW (чтоб никто не догадался), в то время как для managed C++ нужно использовать ключ /clr.
Как же выглядит код на C++ для WinRT? Примерно так:

using namespace Windows::Storage;

Search::QueryOptions^ options = ref new Search::QueryOptions(Search::CommonFileQuery::DefaultQuery, nullptr);
options->FolderDepth = Search::FolderDepth::Deep;
auto query = KnownFolders::PicturesLibrary->CreateFileQueryWithOptions(options);


Первое, что тут бросается в глаза — это ref new. В документации написано, что таким образом мы получаем smart pointer, который автоматически уменьшает счетчик ссылок, когда объект выходит из области видимости. То есть, это тот же COM. Пока не ясно, предпринято ли что-нибудь для решения проблемы циклических ссылок, и что именно это за указатели (думаю, что std::shared_ptr). Сборщика мусора здесь, как такового, нет.

Ключевое слово auto как раз из нового стандарта С++ 11, это вывод типа, по смыслу аналогичный var в С#. Язык шагнул очень далеко вперед — появились такие вещи, как лямбды (с поддержкой замыканий, но их надо явно описывать) и туплы (видимо чтобы была хоть какая-то замена анонимным типам).

В WinRT есть хитрый маршаллинг, благодаря чему можно в C# итерироваться по вектору из C++ кода WinRT компоненты. Как я понимаю, это достигается тем, что на типы WinRT наложен ряд жестких ограничений. Подробно про это можно посмотреть здесь: http://msdn.microsoft.com/en-us/library/windows/apps/hh454062(v=VS.85).aspx. Если укладываться в рамки ограничений, то можно использовать любые нативные библиотеки для разработки своих компонентов WinRT, и это очень здорово.

Все типы WinRT наследуются от Platform::Object.Мне пока нигде не удалось найти, что этот тип содержит, но логика подсказывает, что он должен выполнять базовую поддержку <b>IInspectable</b> — нового фундаментального интерфейса, который отвечает за получение метаданных типа. На слайдах также было нарисовано, что все типы WinRT реализуют IUnknown (что, в общем-то, неудивительно). Метаданные WinRT типов лежат в некоторой системной директории Windows, и имеют расширение winmd. Эти метаданные можно открывать ildasm'ом, они имеют стандартный дотнетный формат.

На мой взгляд, это пока главное, что нужно понимать про WinRT. Конечно, там еще огромное количество всего — C++-ые свойства, делегаты, события. Специальная работа со строками — в WinRT для этого свой тип, и т.п., все это можно прочитать по ссылке выше (хотя информации пока немного, надеюсь будут обновлять оперативно). Но самое главное уже более-менее понятно. Перед нами новая версия COM.
Eugene Agafonov on the .NET

winrt
Re: [ANN] WinRT - новое компонентное API для Windows 8
От: Аноним  
Дата: 01.10.11 11:33
Оценка:
Еще по теме:
http://blogs.microsoft.co.il/blogs/sasha/archive/2011/09/17/under-the-covers-of-winrt-using-c.aspx
Re: [ANN] WinRT - новое компонентное API для Windows 8
От: Аноним  
Дата: 01.10.11 15:31
Оценка: 5 (2) +4 -1 :)))
Здравствуйте, Gollum, Вы писали:

G>Я тут попробовал описать свои впечатления от WinRT


Я в шоке. Нет слов. Это какое-то чудовищное г..но. Какой же это C++? Зачем они изменили синтаксис? Это не C++ и не дотнет. Какая-то технология-выродок с языком-мутантом.

Главные вопросы, которые у меня возникают: "WTF?" и "нафига?", а также "нафига?!", "нафига?!!" и "нафига?!!!".

Что ж это такое будет-то? Получается какая-то еще одна какая-то непонятная платформа со своим собственным довольно поганым языком (никакой это, конечно же, не C++).

Reference counting? Вы меня шутите? И для reference counting'а делать синтаксические расширения?

COM? В 2011 году? Они там совсем долбанулись?

Я бы понял, если бы они все перевели на дотнет, понял бы если бы они все сделали на C++, но эту хрень я не понимаю совершенно.

У меня нет больше никаких слов, кроме матных. Товарища Синофского надо подвесить за определенную часть тела и больше никогда не подпускать к компьютеру.
Re[2]: [ANN] WinRT - новое компонентное API для Windows 8
От: fddima  
Дата: 01.10.11 15:49
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Reference counting? Вы меня шутите? И для reference counting'а делать синтаксические расширения?

Я в общем-то такого же мнения обо всём, но чем не угодил то ref counting?
Re[3]: [ANN] WinRT - новое компонентное API для Windows 8
От: Аноним  
Дата: 01.10.11 20:56
Оценка: 13 (3) +1 -3 :)))
Здравствуйте, fddima, Вы писали:

А>>Reference counting? Вы меня шутите? И для reference counting'а делать синтаксические расширения?

F> Я в общем-то такого же мнения обо всём, но чем не угодил то ref counting?

Ну, вообще, это сложная и обширная тема, но коротко можно сказать, что, на мой взгляд, tracing garbage collection это более совершенная и эффективная техника (хотя ее эффективность сильно зависит от реализации), чем reference counting, особенно это касается многопроцессорных систем. И в дотнете выбрали tracing collection неспроста.

Хотя, если Микрософт использует эту свою наработку, то все еще не так плохо.

Но, учитывая, что там COM, возникают некоторые сомнения в том, что эффективность этого решения будет достойной и, тем более, сравнимой с эффективностью сборки мусора в дотнете.

Ну и очень не хотелось бы сталкиваться с дурацкой проблемой циклических ссылок. Хорошо, если они там ее решили.

Но главная причина для возмущения, конечно же, то, что Микрософт столько лет пилил свой дотнет с полноценной сборкой мусора и развитой компонентной моделью, а теперь вдруг выродил этого уродца. Какое-то непонятное дублирование технологий и шаг назад.

С ужасом вспоминаю COM — это, наверное, одна из самых говенных технологий программирования, с которой мне доводилось работать. Это был настоящий ад. По сравнению с ним дотнет и C# — как переход из тени в свет. И тут — на тебе! опять к старым баранам.

Кстати, я сейчас колупаюсь именно с reference counting'ом в C++, изучаю научные работы на эту тему, пытаясь в неравной битве побороть циклические ссылки, улучшить его производительность и подружить с многопоточностью. Скорее всего, ничего достойного не выйдет.
Re[4]: [ANN] WinRT - новое компонентное API для Windows 8
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 02.10.11 06:32
Оценка: 1 (1) +3 -3 :)
Здравствуйте, Аноним, Вы писали:

А>Кстати, я сейчас колупаюсь именно с reference counting'ом в C++, изучаю научные работы на эту тему, пытаясь в неравной битве побороть циклические ссылки, улучшить его производительность и подружить с многопоточностью. Скорее всего, ничего достойного не выйдет.


Не можешь — ну не колупайся.

Все там нормально. И все друг с другом дружит. В том числе — reference counting и многопоточность (по моему скромному мнению — второе без первого, это перевод денег времени). Справа от моего имени есть ссылочка на нефиговый по размерам проект, где все это (COM/MT/ref count) согласованно работает вместе без каких либо проблем.

Правда надо дружить с головой понимать с чем имеешь дело

PS. "Научные работы" — это ты наверное речь для детского сада неискушенного слушателя готовил?
PSS. У меня был еще более крупный проект чем провайдер (он был его мааааленькой частью), тоже C++/COM/ref count — но там (в плане сложности самой природы задачи) был полный мрак. Но все работало без AV/утечек/зависаний и прочих нелепых ужосов

----
Да. Я развлекаюсь с .NET потому что скучно.
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[5]: [ANN] WinRT - новое компонентное API для Windows 8
От: MxMsk Португалия  
Дата: 02.10.11 07:17
Оценка:
Здравствуйте, Коваленко Дмитрий, Вы писали:

КД>Не можешь — ну не колупайся.

КД>Все там нормально. И все друг с другом дружит. В том числе — reference counting и многопоточность (по моему скромному мнению — второе без первого, это перевод денег времени). Справа от моего имени есть ссылочка на нефиговый по размерам проект, где все это (COM/MT/ref count) согласованно работает вместе без каких либо проблем.
Вопрос в том, сколько потребовалось времени, чтобы оно начало согласовано и без проблем работать. Автор ведь имел ввиду сложность решения. Понятно, что и с reference counting можно жить. Но это очевидный шаг назад по-сравнению со сборщиком мусора в .Net. Не люблю кивать в сторону Apple, но у них наоборот появился сборщик мусора для Objective-C, который до этого жил только с reference counting на naming conventions.
Re[6]: [ANN] WinRT - новое компонентное API для Windows 8
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 02.10.11 08:14
Оценка: :)
Здравствуйте, MxMsk, Вы писали:

КД>>Не можешь — ну не колупайся.

КД>>Все там нормально. И все друг с другом дружит. В том числе — reference counting и многопоточность (по моему скромному мнению — второе без первого, это перевод денег времени). Справа от моего имени есть ссылочка на нефиговый по размерам проект, где все это (COM/MT/ref count) согласованно работает вместе без каких либо проблем.
MM>Вопрос в том, сколько потребовалось времени, чтобы оно начало согласовано и без проблем работать.

Скажу про то, что знаю — что бы заставить согласованно и без проблем работать (драйвер базы данных) требуется колоссальные усилия и затраты. Которые хрена лысого сократятся если задействовать супер-пупер технологии/ЯП.

Впрочем, если бы не компилятор C++ из VS2005 — проект бы помер

И оно везде так. Было и будет.

Чтобы они там не родили — этим можно будет пользоваться через 10 лет, когда у них все устаканится. К этому моменту, они (как обычно) объявят это устаревшим и начнут все сначала
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[2]: [ANN] WinRT - новое компонентное API для Windows 8
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 02.10.11 08:26
Оценка:
Здравствуйте, Аноним, Вы писали:

А>У меня нет больше никаких слов, кроме матных. Товарища Синофского надо подвесить за определенную часть тела и больше никогда не подпускать к компьютеру.


Не надо так явно завидовать товарищу, которому дали возможность определять направление развития программного обеспечения.

Я думаю он сам хорошо понимает — "если что, то лучше самому себе сделать харакири"
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[7]: [ANN] WinRT - новое компонентное API для Windows 8
От: MxMsk Португалия  
Дата: 02.10.11 08:37
Оценка:
Здравствуйте, Коваленко Дмитрий, Вы писали:

КД>Скажу про то, что знаю — что бы заставить согласованно и без проблем работать (драйвер базы данных) требуется колоссальные усилия и затраты. Которые хрена лысого сократятся если задействовать супер-пупер технологии/ЯП.

Непонятно, почему мы все должны возиться с подсчетом ссылок лишь потому, что это устраивает драйвер Interbase
Re[8]: [ANN] WinRT - новое компонентное API для Windows 8
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 02.10.11 09:36
Оценка: +1 -1
Здравствуйте, MxMsk, Вы писали:

КД>>Скажу про то, что знаю — что бы заставить согласованно и без проблем работать (драйвер базы данных) требуется колоссальные усилия и затраты. Которые хрена лысого сократятся если задействовать супер-пупер технологии/ЯП.

MM>Непонятно, почему мы все должны возиться с подсчетом ссылок лишь потому, что это устраивает драйвер Interbase

1. при нормальном подходе с ними никто не возится. как не возятся с голыми указателями на память, к примеру.
2. это всего лишь (реальный) пример того, где все эти "страшные" вещи без проблем работают.
3. да никто никого не заставляет. Чего нервничать то?
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[9]: [ANN] WinRT - новое компонентное API для Windows 8
От: MxMsk Португалия  
Дата: 02.10.11 10:29
Оценка:
Здравствуйте, Коваленко Дмитрий, Вы писали:

КД>1. при нормальном подходе с ними никто не возится. как не возятся с голыми указателями на память, к примеру.

Нормальный подход — это какой?

КД>2. это всего лишь (реальный) пример того, где все эти "страшные" вещи без проблем работают.

Ну, в этом мире вообще много чего работает. Хочется, чтобы платформы двигались вперед, а не назад.

КД>3. да никто никого не заставляет. Чего нервничать то?

Не, мои нервы сейчас целиком тратятся на Детройт Тайгерз в плэй-офф MLB
Re[2]: [ANN] WinRT - новое компонентное API для Windows 8
От: drol  
Дата: 02.10.11 11:58
Оценка: -2
Здравствуйте, Аноним, Вы писали:

А>Главные вопросы, которые у меня возникают: "WTF?" и "нафига?", а также "нафига?!", "нафига?!!" и "нафига?!!!".


Да прекрасно понятно. Планете давно нужен нормальный язык\платформа для натива. И если комитет забивает болт, то в игру приходится вступать Microsoft'у.

А>Что ж это такое будет-то? Получается какая-то еще одна какая-то непонятная платформа со своим собственным довольно поганым языком (никакой это, конечно же, не C++).


Конечно же это C++. В него просто добавлен нормальный синтаксис\система типов — вместо всяких макросно-шаблонных извращений предыдущей эпохи — для поддержки компонентных систем. Причём с практически полным сохранением совместимости с C++\CLI по "буковкам".

А>Я бы понял, если бы они все перевели на дотнет, понял бы если бы они все сделали на C++, но эту хрень я не понимаю совершенно.


Наоборот, нормально всё. "Чистый" C++ это очевидный капец и путь в никуда. Сделан же очередной шаг в правильном направлении, просто он сделан с другой\непривычной стороны — со стороны натива.
Re[10]: [ANN] WinRT - новое компонентное API для Windows 8
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 02.10.11 13:31
Оценка:
Здравствуйте, MxMsk, Вы писали:

КД>>1. при нормальном подходе с ними никто не возится. как не возятся с голыми указателями на память, к примеру.

MM>Нормальный подход — это какой?
1. смарт-указатели. с правильной реализацией. или это уже не актуально?
2. правильные принципы владения объектами. У COM они нормальные.

Но я тут вникал в одни доморощенные правила... все шиворот навыворот. И как-то реально стремно становится

КД>>2. это всего лишь (реальный) пример того, где все эти "страшные" вещи без проблем работают.

MM>Ну, в этом мире вообще много чего работает. Хочется, чтобы платформы двигались вперед, а не назад.

Можно оглянуться и достичь нужного эффекта

По-любому, назад движения нет. Достаточно сравнить уровни компиляторов C++ 199x (VC5/VC6/BCB3), 2000 (BCB5), 2003 (VC7 — не вставил), 2005 (VC8 — это был нереальный прорыв), 2008 (VC9), 2010 (VC10). Начиная с VC8 — можно писать на плюсах и получать от этого удовольствие. Это три версии компилятора — VC8/VC9/VC10.

А тот же компилятор C# — я (хотя и пишу меньше двух месяцев) уже натыкался на конструкции которые VS2010 может откомилировать, а 2008 тупит — надо подсказывать. Сам фреймворк, большой да. Но в основе своей, по-моему, туповатый. И это видно по допиливанию такой тривиальной вещи как IntPtr. Сложно было сразу его сделать полноценную реализацию что ли?

Впрочем меня оно не сильно напрягает. Так всего пару раз побесился . И порадовался что это не .NET v1. С которым, я так понимаю (если хочешь создать что-то отказоустойчивое), вообще ловить нечего.

Оно и на плюсах такое было, когда желания начали обгонять возможности компилятора/STL

Да. Я говорю про создании невизуальных вещей. С UI я завязал
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[2]: [ANN] WinRT - новое компонентное API для Windows 8
От: __lambda__ Россия http://zen-hacker.blogspot.com/
Дата: 02.10.11 14:55
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Я в шоке. Нет слов. Это какое-то чудовищное г..но. Какой же это C++? Зачем они изменили синтаксис? Это не C++ и не дотнет. Какая-то технология-выродок с языком-мутантом.


+100.

А>Что ж это такое будет-то? Получается какая-то еще одна какая-то непонятная платформа со своим собственным довольно поганым языком (никакой это, конечно же, не C++).


Там вроде можно использовать чистый С++, пользуясь WRL, но при этом получаем старый добрый COM, а эти уродские расширения мол нужны для того, чтобы не думать о COM.

А>Я бы понял, если бы они все перевели на дотнет, понял бы если бы они все сделали на C++, но эту хрень я не понимаю совершенно.


Я тут недавно копался в MSDN, WinRT в паре с C# (или VB) выглядит довольно органично. А вот код на C++

А>У меня нет больше никаких слов, кроме матных. Товарища Синофского надо подвесить за определенную часть тела и больше никогда не подпускать к компьютеру.


Да зачем так себе нервы трепать, проще будет тупо не программировать под Windows платформой больше, выбора выше крыши: Java/Web/Mac OS X/iOS/Android/...
Computer science is no more about computers than astronomy is about telescopes (c) Edsger Dijkstra
Re[11]: [ANN] WinRT - новое компонентное API для Windows 8
От: drol  
Дата: 02.10.11 14:56
Оценка:
Здравствуйте, Коваленко Дмитрий, Вы писали:

КД>1. смарт-указатели. с правильной реализацией.


Вы только что охарактеризовали систему управления памятью .Net

КД>2. правильные принципы владения объектами. У COM они нормальные.


Может быть они и нормальные, только вот в COM о них надо постоянно думать...

КД>Но в основе своей, по-моему, туповатый.


А по-моему — в сравнении с C++ — всё ровно наоборот. Один только System.String и его обвязка чего стоят.

КД>И это видно по допиливанию такой тривиальной вещи как IntPtr. Сложно было сразу его сделать полноценную реализацию что ли?


"Я плакаль" (c) не мой

Вы бы ещё пожаловались, что на .NET драйвера разрабатывать затруднительно

IntPtr это "наследие царского режима", вызванное к жизни исключительно необходимостью организации interop'а. И нормальные люди им пользуются от силы пару раз в год.
Re[12]: [ANN] WinRT - новое компонентное API для Windows 8
От: lazy_walrus  
Дата: 02.10.11 15:17
Оценка: +1
Здравствуйте, drol, Вы писали:

КД>>2. правильные принципы владения объектами. У COM они нормальные.


D>Может быть они и нормальные, только вот в COM о них надо постоянно думать...


Постоянно думать о подсчёте ссылок надо в C++. В языках с поддержкой IUnknown на уровне компилятора (напр. Delphi) это делается автоматически.
Re[13]: [ANN] WinRT - новое компонентное API для Windows 8
От: drol  
Дата: 02.10.11 15:51
Оценка: +4
Здравствуйте, lazy_walrus, Вы писали:

_>В языках с поддержкой IUnknown на уровне компилятора (напр. Delphi) это делается автоматически.


С интересом послушаю, как Delphi подсчитывает ссылки для произвольного графа COM-объектов с не менее произвольными манипуляциями над ним.
Re[11]: [ANN] WinRT - новое компонентное API для Windows 8
От: MxMsk Португалия  
Дата: 02.10.11 20:01
Оценка: +1
Здравствуйте, Коваленко Дмитрий, Вы писали:

КД>>>1. при нормальном подходе с ними никто не возится. как не возятся с голыми указателями на память, к примеру.

MM>>Нормальный подход — это какой?
КД>1. смарт-указатели. с правильной реализацией. или это уже не актуально?
КД>2. правильные принципы владения объектами. У COM они нормальные.
Правильное на правильном. Вот это и называется возиться. Всегда нужно применять только правильное и только с правильной реализацией. А мне нравится просто создавать объекты, без оберток, борющихся с языком.

КД>>>2. это всего лишь (реальный) пример того, где все эти "страшные" вещи без проблем работают.

MM>>Ну, в этом мире вообще много чего работает. Хочется, чтобы платформы двигались вперед, а не назад.
КД>Можно оглянуться и достичь нужного эффекта
КД>По-любому, назад движения нет. Достаточно сравнить уровни компиляторов C++ 199x (VC5/VC6/BCB3), 2000 (BCB5), 2003 (VC7 — не вставил), 2005 (VC8 — это был нереальный прорыв), 2008 (VC9), 2010 (VC10). Начиная с VC8 — можно писать на плюсах и получать от этого удовольствие. Это три версии компилятора — VC8/VC9/VC10.
Я не понял причем здесь компилятор. Мы вроде ведем речь, что есть концепции более удобные, гибкие и надежные, чем reference counting.
Re[13]: [ANN] WinRT - новое компонентное API для Windows 8
От: MxMsk Португалия  
Дата: 02.10.11 20:08
Оценка: +2
Здравствуйте, lazy_walrus, Вы писали:

D>>Может быть они и нормальные, только вот в COM о них надо постоянно думать...

_>Постоянно думать о подсчёте ссылок надо в C++. В языках с поддержкой IUnknown на уровне компилятора (напр. Delphi) это делается автоматически.
Проблемы не в том, чтобы автоматизировать вызовы AddRef и Release. Проблема в том, как быть уверенным, что всё это согласуется с внешним кодом, который не ты пишешь и не ты поддерживаешь.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.