Опубликован: 15.05.2013 | Доступ: свободный | Студентов: 266 / 10 | Длительность: 24:25:00
Специальности: Системный архитектор
Лекция 13:

Компоненты WinRT: введение

< Лекция 12 || Лекция 13: 123 || Лекция 14 >
Аннотация: Создание собственных компонентов WinRT, а так же использование компонентов сторонних разработчиков расширяет возможности приложений, созданных с использованием JavaScript, CSS и HTML.

Введение

Материалы к лекциям 13, 14 Вы можете скачать здесь.

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

В то же время, мы иногда встречались с ситуациями, где применимо, а порой и необходимо применение нескольких языков. В Главе 1 курса "Введение в разработку приложений для Windows 8 с использованием HTML, CSS и JavaScript" я говорил о том, что приложение, на самом деле, может быть написано на нескольких языках. В Главе 2 курса "Пользовательский интерфейс приложений для Windows 8, созданных с использованием HTML, CSS и JavaScript" я упоминал о том, что получение доступа к API баз данных, помимо IndexedDB, может быть реализовано с использованием WinRT-компонента. В Главе 4 курса "Пользовательский интерфейс приложений для Windows 8, созданных с использованием HTML, CSS и JavaScript" мы видели, что JavaScript может быть не лучшим выбором, если нужна подпрограмма, которая обрабатывает пиксельные данные. И, в Главе 2 курса "Программная логика приложений для Windows 8, созданных с использованием HTML, CSS и JavaScript и их взаимодействие с системой", мы встретились с Notifications Extensions Library, с весьма полезным набором кода, написанном с использованием C#, упрощающим создание полезных данных XML из JavaScript. Знаем мы и о фоновых задачах, которые могут быть написаны на языках, отличающихся от языка основного приложения.

Учитывая основное ограничение, в соответствии с которым приложение, использующее для презентационного уровня HTML и CSS не может делить рабочую поверхность вывода данных с WinRT-компонентами, написанными на других языках, дизайн WinRT делает подход с использованием нескольких языков вполне реальным для использования. WinRT-компоненты, написанные на любом языке, доступны из других языков посредством уровня проекции, который транслирует интерфейс компонента в среду, соответствующую целевому языку. Вся WinRT написана так, и пользовательские WinRT-компоненты используют преимущества того же механизма (Скоро мы увидим основные характеристики проекции JavaScript).

Для вас это означает, что создавая приложения с помощью HTML, CSS, и JavaScript, вы можете реализовывать различные части приложения на языке, который лучше подходит для конкретной задачи или необходим технически. Как динамический язык, JavaScript показывает свою мощь в простом совмещении функциональности, предоставленной другими компонентами, которые выполняют различные специальные задачи (наподобие захвата данных с камеры, фоновой передачи данных и так далее). Подобные компоненты часто лучше писать на других языках, таких, как C++, где скомпилированный код исполняется непосредственно на центральном процессоре, вместо того, чтобы проходить сквозь уровни времени выполнения, как JavaScript.

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

В этой лекции мы рассмотрим различные причины, по которым вы можете использовать подход применения смешанных языков в приложении. Затем мы пройдёмся по паре кратких руководств по C# и C++, чтобы вы понимали структуру компонентов, написанных на них, как они выглядят в JavaScript, их ключевые концепции и терминологию. В лекции 14 мы рассмотрим примеры различных сценариев, не входя слишком глубоко в технические подробности. Я решил так поступить, потому что существует прекрасная документация, посвященная таким подробностям. В особенности это следующие материалы:

Не позволяйте словам "простой" и "основной" в названиях материалов удерживать вас от их прочтения: это всесторонние руководства, которые рассматривают множество мелких деталей работы с типами данных наподобие векторов, карт и наборов свойств. Они рассказывают об объявлении событий, создании асинхронных операций и о том, Как всё это выглядит в JavaScript. Кое-что из этого мы рассмотрим здесь, но имея такие замечательные руководства, мы займёмся здесь, в первую очередь, вопросами о том, почему нужны подобные компоненты, поговорим о проблемах, которые можно решить с их помощью. Кроме того, я хочу сохранить ваши силы для последней лекции курса, где мы поговорим о том, как представить ваше приложение миру после того, как вы решите все эти проблемы!

Примечание. По необходимости, в этой лекции я должен предположить, что у вас есть некоторое понимание языков C# и C++, так как здесь мы не будем рассматривать основы. Если эти языки полностью новы для вас, потратьте несколько часов на то, чтобы с ними познакомиться. Это значительно улучшит ваше продвижение по данной лекции.

Выбор подхода с использованием смешанных языков (и рабочих веб-процессов)

Выбор подхода с использованием смешанных языков (и рабочие веб-процессы)

Есть много причин для того, чтобы применить подход с использованием смешанных языков в вашем приложении. Этот подход подразумевает применение любого количества WinRT-компонентов, написанных на C#, VisualBasic (здесь и далее просто VB) и/или на C++:

  • Вы можете выполнить некоторые задачи быстрее с кодом, обладающим более высокой производительностью. Это может уменьшить использование памяти, а так же потребовать меньше процессорного времени и мощности, что важно для фоновых задач, для которых применяется квотирование процессорного времени. Вы можете сделать гораздо больше за 2 секунды на C++, чем на JavaScript, так как в этом случае не используются вспомогательные подсистемы.
  • C#, Visual Basic, и C++ имеют доступ к значительному набору дополнительных API, которые недоступны JavaScript. Они включают в себя API .NET, Win32, b COM (Component Object Model), включая не относящиеся к пользовательскому интерфейсу возможности DirectX, такие как XAudio и Xinput. Мы увидим ряд примеров в разделе этой лекции "Доступ к дополнительным API".
  • Доступ к другим API, кроме того, может понадобиться для использования библиотек .NET/Win32/COM сторонних разработчиков, и, кроме того, даёт вам возможность повторно использовать существующий код, который может у вас быть на языках C#, VB, или C++. В материале "Разработка Bing Maps Trip Optimizer — приложения для Магазина Windows — с помощью JavaScript и C++" (http://msdn.microsoft.com/library/windows/apps/hh699893.aspx) показан полный сценарий подобной работы, в частности, сценарии миграция элемента управления ActiveX в компонент WinRT, и, в итоге, возможность использования его в приложении, так как ActiveX напрямую не поддерживается. (Мы не будем возвращаться к данному сценарию в дальнейшем).
  • Может быть легче работать в процедурах, вовлекающих использование множества асинхронных операций с использованием ключевого слова await в C# и Visual Basic, так как подобный подход имеет более четкую структуру, нежели использование promise-объектов. Пример этого можно найти в Главе 6, в приложении "Here My Am!", где функция transcodeImage, написанная в Главе 2 на JavaScript переписана с использованием C# (смотрите Utilities.ImageConverter.TranscodeImageAsync в проекте Utilities).
  • WinRT-компоненты, написанные на C++ более эффективны при необходимости скрытия ценного кода приложения, чем JavaScript и .NET-языки. Хотя интерфейс компонента это не скроет, для того, чтобы понять его внутреннее устройство реверс-инженерам потребуется несравненно больше усилий.
  • Компоненты WinRT – это лучший способ создания библиотек, не имеющих отношения к пользовательскому интерфейсу, которые другие разработчики смогут использовать в избранной ими языковой среде, или вы сами сможете использовать во множестве других собственных проектов, как библиотеку Notifications Extensions, которую мы видели ранее. В этой связи, посмотрите материал "Практическое руководство. Создание пакета средств разработки программного обеспечения" (http://msdn.microsoft.com/library/windows/apps/hh768146.aspx), который включает в себя подробности о том, как нужно структурировать компоненты для того, чтобы интегрировать их с Visual Studio.
  • Хотя вы можете использовать в JavaScript рабочие веб-процессы (http://msdn.microsoft.com/library/windows/apps/hh767434.aspx) для того, чтобы исполнять код в различных потоках, компоненты WinRT могут быть гораздо более эффективными для пользовательских асинхронных API. Другие языки так же могут выполнять определенные задачи более продуктивно, как, например использование запросов, встроенных в язык (LINQ) из C#/VB, создание параллельных циклов в C#/C++, использование C++ Accelerated Massive Parallelism (AMP) (http://msdn.microsoft.com/library/hh265136.aspx) для использования возможностей графического процессора и так далее.

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

Вы можете использовать рабочие веб-процессы (или просто рабочие процессы) в приложениях для Магазина Windows. На самом деле, Visual Studio предоставляет шаблон элемента, предназначенный именно для этого: щёлкните правой кнопкой мыши по проекту в Обозревателе решений Visual Studio, выберите команду Добавить > Создать элемент (Add > New Item) и затем выберите Выделенный рабочий процесс (Dedicated Worker). Так же я покажу в этой лекции упражнение "JavaScript Workers" ("Рабочие процессы JavaScript"). Настоящий их недостаток, в сравнении с WinRT-компонентами, это то, что обмен данными между рабочим процессом и потоком основного приложения реализуется полностью с помощью дискретного механизма postMessage. Данные, передаваемые между приложением и рабочим процессом должны быть выражены в виде свойств сообщения. Другими словами, рабочий процесс построен с использованием клиент-серверной архитектуры, а не в виде объекта со свойствами, методами и событиями, хотя вы можете создавать структуры для подобных вещей с помощью сообщений.

Это означает то, что использование рабочих процессов с несколькими асинхронными операциями может вызвать путаницу. Для сравнения, методы, которые мы видели для работы с асинхронными операциями WinRT – promise-объекты WinJS, имеют больше возможностей, особенно тогда, когда вам нужно объединить асинхронные операции в цепочку или использовать вложенные асинхронные операции, вызывают исключения и сообщают о процессе выполнения операции. К счастью, есть возможность заключить рабочий процесс в оболочку promise-объекта, как мы увидим в разделе "Рабочие процессы JavaScript"

Еще интересно подумать о том, как вы можете использовать рабочие процессы, написанные на JavaScript для того, чтобы они работали в качестве агентов, делегируя задачи WinRT-компонентам. Рабочие процессы JavaScript, таким образом, служат в качестве связующего звена для сбора воедино результатов работы компонентов, возвращая общий результат основному приложению через postMessage.

В том же духе, если у вас есть некоторый опыт работы в .NET-языках наподобие C# и Visual Basic вместе с C++, вы узнаете, что соответствующие им модели программирования имеют собственные сильные и слабые стороны. Так же, как вы можете получить преимущества от динамической природы JavaScript в тех областях, для которых он подходит лучше всего, вы можете использовать управляемую природу .NET, которая избавит вас от различных проблем наподобие управления памятью и со ссылками, и, в свою очередь, использовать C++ там, где нужен наиболее производительный код.

Коротко говоря, поток пользовательского интерфейса приложения на JavaSctipt делегирует задачи рабочим процессам на JavaScript, которые затем делегируют некоторые задачи компонентам, написанным на C#, который затем могут передать наиболее интенсивные задачи другим компонентам, написанным на C++. На самом деле, комбинация рабочих процессов с компонентами WinRT даёт вам отличную гибкость в реализации приложений.

Примечание. Единственный потенциальный недостаток использования в приложениях компонентов WinRT, написанных на C++ заключается в том, что, в то время, как JavaScript и .NET-языки (C# и C++) архитектурно-нейтральны и могут исполняться на любом процессоре, компоненты на C++ должны быть отдельно скомпилированы для архитектур x86, x64 и ARM. Это подразумевает наличие у приложения в Магазине Windows трех различных пакетов. Однако, пакеты для архитектуры x86 будут так же работать и на процессорах с архитектурой x64, что устраняет необходимость в пакете для одной из целевых архитектур, если создание специального пакета для x64 не способно принести реального прироста в производительности.

< Лекция 12 || Лекция 13: 123 || Лекция 14 >