Блог Сергея Байдачного

Мой блог о технологиях

Выбираем язык программирования: Windows 8 vs Windows Phone 8

6 комментариев

 

Изучая вопросы создания приложений для Windows Phone 8 Вы будете натыкаться на некоторые странности, которые тяжело будет понять, если четко не понимать архитектуру платформы, причем как текущую, так и предыдущую. Поэтому, дальше, мы посмотрим на программную архитектуру платформы, но посмотрим со стороны разработчика, который хочет определиться с тем, на чем же ему разрабатывать приложения с современным интерфейсом в самое ближайшее время. В других темах я просто буду ссылаться на этот раздел. Кроме того, поскольку многие считают, что разработка на платформах Windows 8 и Windows Phone 8 ничем не отличается, я начну свой обзор именно с Windows 8 и объясню все отличия.

Итак, все Вы знаете, что Windows 8 представляет собой абсолютно новую операционную систему, ориентированную на пользователей, которые работают как с обычными компьютерами, так и с планшетами или лэптопами с Touch экраном. Это достигается за счет нового интерфейса, возможности работы на ARM процессорах и реализации абсолютно нового программного интерфейса, который получил название Windows Runtime. Именно Windows Runtime является набором тех строительных блоков, которые предоставляют множество элементов управления нового типа, компонентов по работе с данными, сетью и др. То есть, в Windows Runtime есть все то, что необходимо для построения типичного бизнес-приложения. При этом в Windows Runtime практически не используется старый программный интерфейс Win 32 API. Вместо этого Windows Runtime базируется непосредственно на ядре операционной системы (Kernel), а для прорисовки элементов управления использует DirectX.

Обычно Windows Runtime преподносится как новый, объектно-ориентированный, нативный программный интерфейс. По факту, это набор COM объектов. Технология COM отнюдь не нова для платформы Windows и лежит в основе работы этой операционной системы. Естественно, предоставляемый набор COM объектов является абсолютно новым и несет в себе некоторые расширения, хотя и сделанные не очень нативно. Ключевых изменений несколько:

1). Работа с COM объектами в предыдущих версиях Windows выглядела не очень привлекательно со стороны объектно-ориентированного разработчика. Вытянуть информацию о структуре объекта было затруднительно и основные ошибки можно было отловить только на этапе выполнения, а программирование требовало механизмов динамического создания объектов и большого количества проверок. По этой причине, весь набор COM, входящих в состав Windows Runtime, включают дополнительные файлы, содержащие метаданные. Формат метаданных был заимствован из .NET Framework, но, в .NET Framework они находились внутри сборки, а при работе с COM речь идет и стандартных динамических библиотеках. Поэтому ничего не остается, как хранить метаданные в отдельных файлах. Их можно найти в папке C:\Windows\System32\WinMetadata. Причем, если Вы используете утилиту ildasm из .NET Framework 4.5, то эти метаданные можно легко посмотреть и исследовать всю структуру Windows Runtime.

2). Поскольку работа с COM из языков С# или C++ не выглядит «натуральной», то компиляторы и средства разработки были модифицированы таким образом, что весь набор COM из Windows Runtime разработчику представляется как набор классов. Тут разработчик не думает об интерфейсе IUnknown, не обрабатывает HRESULT, а работает с исключениями и др. Все это стало возможно благодаря метаданным и специальным расширениям, преобразующим конструкции, понятные ООП программисту в вызовы COM. Причем в зависимости от языка эти расширения разные и работают по разному. Так, приложения на С++ компилируются в нативный код. То есть все расширения представляют собой синтаксических сахар, а вот приложения на C# продолжают использовать .NET Framework (.NET Core, включающей основные службы и множество утилитных класов) для своей работы. Естественно, создавая свои собственные компоненты для Windows Runtime Вы будете на выходе получать тот же самый COM и файл с метаданными.

3). Поскольку COM является нативной для Windows, а Win 32 API еще активно используется как старыми приложениями, так и некоторыми системными утилитами, то для того, чтобы обязать приложения (разработчика) использовать «правильный» программный интерфейс, в операционной системе появляется отдельный компонент Broker, который контролирует обращение к различным API из приложения, загруженного из Windows Store. Ведь на том же С++ можно попытаться вызвать как Win 32 API, так и Windows Runtime. Тут есть два варианта: если приложение обращается к небезопасному API, например, требующему дополнительного подтверждения пользователя, то Broker перехватывает такую ситуацию и инициирует вызов только в том случае, если пользователь дал подтверждение. Если приложение пытается вызвать API, который не разрешен при публикации приложений в Store, то тут все гораздо проще — Ваше приложение просто не пройдет сертификациюJ Хотя, на своей девелоперской машине Вы можете обращаться к любым методам того же Win 32 API. Следует отдельно отметить, что существует небольшое количество методов из Win 32 API, к которым все еще можно обращаться из современных Windows 8 приложений. Но их очень мало и все они описаны в документации.

Теперь, когда все стало ясно о Windows Runtime, прейдем к вопросу написания игр. И вот тут нас ждет сюрприз. Так, в Windows 8 в этом плане практически не изменилась. Для написания игр используется старый добрый DirectX (версия 11.1). Тут разработчик может использовать либо какие-то фреймворки, либо использовать DirectX напрямую. О сторонних фреймворках мы говорить не будем, их сейчас появляется большое количество. А вот если говорить о фреймворках, предоставляемых Microsoft, то их просто нет. Старый добрый XNA больше не поддерживается, как и управляемый DirectX. Поэтому единственный язык, который тут можно использовать, это С++.

Исходя из всего вышесказанного, я попытаюсь нарисовать архитектуру программной платформы. Сразу скажу, что она отличается от официальной, но я ее вижу именно так:

 

image

 

К картинки можно придираться, но она отражает то, о чем я писал выше. Тут С++ можно использовать для разработки современных приложений с использование Windows Runtime, утилизировать часть разрешенных методов из Win 32 API и создавать игры с использованием DirectX. Обратите внимание, что небольшую часть DirectX использовать нельзя даже в C++. Это касается динамической компиляции шейдеров и еще пары механизмов (поэтому прямоугольник я не дотянул).

Если говорить о С#, то тут картина несколько другая:

 

image

 

Тут C# работает на основе .NET Framework, последние предоставляет не только свои возможности по работе с коллекциями, сериализацией и др., но и обвертки для Windows Runtime (хотя их можно отнести скорее к возможностям компилятора). Ни о каким DirectX речи и не идет. Нет, Вы можете написать свои обертки для DirectX и нечто подобное уже есть (SharpDX), но для этого Вам потребуется С++J Почему? Ответ тут очень простой и состоит в том, чтобы заставить разработчика создавать приложения с максимальной производительностью. Именно большое количество качественных приложений позволит сдвинуть ARM устройства в сторону потребителя. Напоминаю, что на ARM, в отличии от Intel архитектуры пользователь не сможет поставить старые приложения в режиме десктопа. Ведь на ARM всех старых приложений просто не существовало. Видимо это подход правильный и он сработает.

Если говорить об HTML 5, то тут идея похожа на C#, но вместо .NET Framework идет двигатель, заложенный в основе IE 10, а также библиотека Win JS, которая предоставляет обертки для Windows Runtime в JavaSсript.

А вот теперь переходим к вопросу о том, какой же язык лучше выбрать и как это все может развиваться.

Еще раз отмечу, что мое мнение не отражает официальную позицию, а скорее мое внутреннее ощущение.

Начну с возможных вариантов развития в будущей операционной системе. Если бы я когда-то построил архитектуру системы таким образом, то в следующей версии сконцентрировался бы на двух вещах:

1). Перебросил бы всю утилитную составляющую .NET Core в Windows Runtime и превратил бы язык C# в нативный, избавившись от дополнительной прослойки;

2). Заменил бы DirectX новым API для создания высокопроизводительных графических приложений, сделав бы его в стиле Windows Runtime (частью), что автоматически бы сравняло возможности C# и С++.

Но это все мои фантазии. Реальные же действия по улучшению платформы будут базироваться на отзывах разработчиков. Поэтому все в наших руках.

Перейдем к вопросу выбора языка. Как видите, тут все просто. Если такие технологии как Silverlight и WPF для Вас являются новыми, то однозначно выбирайте С++. Если уж учить новые подходы, то лучше и язык выбирать универсальный. Аналогично стоит поступить, если Вы только начинаете программировать. Но, если Вам нужно написать приложение, а Вы уже имеете знания Silverlight, WPF или JavaScript, то используйте эти языки. Это позволит Вам сразу включится в работу. Правда к большинству игр это не относится, хотя существующие внешние фреймворки могут решить и эту задачу.

В моей практике было несколько случаев, когда компании, пытавшиеся программировать на JavaScript (до этого программируя на C#), не создавали конечный продукт, а также компании, которые вопреки моим советам садились за JavaScript и очень оперативно создавали продукт. Все зависит от уровня и Ваших знаний и тех разработчиков, которые с Вами работают.

И еще одна сноска о JavaScript. Помните, что JavaScript является объектно-ориентированным языком программирования, не уступающим по сложности С++. Поэтому, если Вы садитесь за создание Windows 8 приложения на этом языке, то обязательно проверьте свои знания. К сожалению, большинство современных JavaScript разработчиков с этим языком «дружат» не всегда (как ни странно), а все их программирование сводится к созданию небольших методов и утилизации существующих фреймворков.

Вот и все, что я хотел написать о выборе языка для создания Windows 8 приложений. К сожалению, чтобы сделать правильный выбор, нужно понимать архитектуру программной платформы. Поэтому к последним абзацам мы шли очень долгоJ

Теперь перейдем к Windows Phone 8. Во многих презентациях рассказывается, что Windows 8 и Windows Phone 8 обладают общей платформой и имеют одинаковое ядро. Вероятнее всего, так оно и есть, но нам, как разработчикам от этого не жарко и не холодно. Дело ведь не в ядре, а в том программном интерфейсе, который находится над ядром и разрешается разработчику к использованию. Вот сейчас об этом и поговорим.

Сразу хочу отметить, что я не верю в единый пакет для установки на Windows и Windows Phone (пусть даже в будущих версиях). Ведь размеры устройств и назначение достаточно разные для них. Возьмите хотя бы стандартную панель в Windows 8 или аппаратные кнопки в Windows Phone (в Windows 8 их всего одна, а в телефоне – три). Поэтому отвечая на вопрос о необходимости переписывать код с Windows Phone на Windows 8 и наоборот, я всегда отвечаю – да. Понятно, что бизнес-логику нужно сохранить, но интерфейс даже при одинаковых разрешениях экрана…. В общем, к этому вопросу больше не возвращаемся.

Итак, что представляет собой программный интерфейс Windows Phone 8. Первый и самый важный компонент, это SilverLight. Да, тот самый Silverlight, который присутствовал и в Windows Phone 7.x. И сразу же хочу обратить внимание, что в новой версии Windows Phone мы имеет дело не с Silverlight Core или чем-то подобным, а с полноценным Silverlight, который несет в себе не только полезные классы .NET Framework, но и все элементы управления по построению интерфейса. А что же Windows Runtime. Несомненно, Windows Runtime присутствует, но только на самом начальном уровне. Ведь действительно, ядро в Windows Phone 8 и Windows 8 одно и то же. Отсюда появляются дополнительные возможности, например использовать язык программирования С++, который в отличии от Silverlight позволяет создавать нативные приложения. Но, по каким-то загадочным причинам, Windows Runtime значительно урезан по сравнению с большим братом. Можно догадываться об этих причинах – необходимость работы старых приложений и совместимости. Но догадки не отвечают на вопрос о том, что будет дальше и как это будет развиваться. Поэтому я не буду ничего предполагать, а скажу лишь то, что Windows Runtime не содержит ни одного элемента управления! Это означает, что создавать приложения на С++ можно, но только в том случае, если они не имеют интерфейса или для его построения используют DirectX. Попробую зарисовать программную архитектуру:

 

image

 

На картинке C++ и Silverlight никак не пересекаются, просто я решил не рисовать две отдельные картинки. Тут на С++ можно создавать все то, что и в Windows 8, но его возможности ограничены возможностями Windows Runtime и DirectX. А вот Silverlight не только предоставляет окружение для управляемого кода и несет утилитные классы из .NET Core, но и предоставляет весь спектр элементов управления.

Таким образом, выбор языка программирования на Windows Phone 8 не совсем очевиден. Универсального средства в виде С++ тут не, так как интерфейсная часть все еще за пределами Windows Runtime. Таким образом, C# придется использовать и дальше, даже при очень большом желании полностью перейти на С++. Также хочу обратить ваше внимание на то, что Windows Phone продолжает поддерживать и XNA, что диктуется тем же вопросом совместимости. Кстати, из этой картинки становится ясно, почему в Windows Phone 8 присутствует два Location API. Опять же вопрос совместимости. Так, старое API было частью Silverlight, а новое — часть Windows Runtime.

Итак, чтобы выбрать язык(и) программирования для Вашего проекта, обязательно проанализируйте для какой из двух платформ Вы будете создавать приложение. Если Вы планируете покрыть обе платформы, то дальше выбирайте язык исходя из типа приложения и знаний Ваших разработчиков. Для игр выбор не особо велик, а вот с бизнес-приложениями можно экспериментировать достаточно долго. Например, можно писать все на C# или бизнес-логику выносить в отдельную библиотеку на С++ или … В общем, все зависит от ситуации. Надеюсь, что информация выше поможет сделать правильный выбор.

Реклама

Written by Sergiy Baydachnyy

08.12.2012 в 15:10

Опубликовано в Windows 8, Windows Phone

Tagged with ,

комментариев 6

Subscribe to comments with RSS.

  1. Если говорить об HTML 5, то тут идея похожа на C#, но вместо .NET Framework идет двигатель, заложенный в основе IE 10

    Это engine так перевелся? 🙂

    Illia

    10.12.2012 at 14:56

    • Илья, извини, но я это не переводил. Я вообще переводить не люблю. Вот чего думаю, то и пишу:)

      Sergiy Baydachnyy

      10.12.2012 at 16:09

    • Кстати, я тоже так подумал

      TwinCat

      14.05.2013 at 19:52

  2. Где обычно вы храните свои сбережения? В рублях или нет?
    Стоит ли продавать квартиру именно сейчас? Или подождать

    HadLET

    12.02.2016 at 14:26

  3. Сколько будет стоить оформить свое жилье или это можно сделать бесплатно?

    HadLET

    17.02.2016 at 09:51

  4. Спасибо вам большое

    HadLET

    18.02.2016 at 09:20


Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

%d такие блоггеры, как: