Разработка модуля для отладки приложений на языке ActionScript 3 в среде Visual Studio 2010
1. OOO «Ричмедиа»
Шайхутдинов Ринат Гаптрафикович
Студент группы ПС-51
Руководитель: Малов Алексей Николаевич
ст. преподаватель кафедры ИиСП
2. CodeDrive – ActionScript 3 IDE
ООО «Ричмедиа» , iSpring Solutions, Inc. 2
Редактор
Кода
Управление
проектами
Управление
ресурсами
Отладчик
Система
сборки
…
3. Постановка задачи
Разработать модуль предоставляющий асинхронное API
для отладки приложений на языке ActionScript 3 и
интегрировать данный модуль с Microsoft Visual Studio
2010 в составе продукта Code Drive.
ООО «Ричмедиа» , iSpring Solutions, Inc. 3
Основные требования к системе:
• Тестируемость
• Гибкость
• Надежность
4. Инструменты разработки
.NET Framework 4.0
C# 4.0
LINQ
Code Contracts
Task Parallel Library (TPL)
Асинхронность
Reactive Framework (Rx)
Интеграция в Visual Studio 2010
Visual Studio 2010 SDK
COM Interop
Тестирование
Nunit
Moq
ActionScript 3
ООО «Ричмедиа» , iSpring Solutions, Inc. 4
5. Одна из проблем синхронных вычислений
You could get
stuck
C# 4.0 covariance
(В неблокирующем ожидании)
работает
6. Организация асинхронных вычислений
(Reactive Framework)
Менталитет Rx - Push-коллекции
Композиционный стиль + LINQ
Помогает в разработке асинхронных программ
Приложений становится “Реактивным”, само
отдает данные, но нужно подписаться на их
получение
7. ActionScript 3 - объектно-ориентированный язык
программирования, один из диалектов ECMAScript
ООО «Ричмедиа» , iSpring Solutions, Inc. 7
Компилятор
ActionScript 3
Flash Player
Виртуальная
машина
ActionScript 3
Flash-
приложение
Интерактивность
Обработка данных
…
Байт-код
Интерактивные
мультимедиа
приложения
Игры …
8. Основные функции отладчика
Управление потоком выполнения
Управление точками останова
Просмотр и навигация по стеку вызовов
Просмотр / изменение данных
Вычисление выражений
Обработка исключений
Вывод отладочных сообщений
ООО «Ричмедиа» , iSpring Solutions, Inc. 8
9. Debug Flash Player
Debug
Flash Player
Список
переменных
Вызов
функций
Вычисление
выражений
Установка/
Удаление
точек
останова
Конструирование
объектов
Получение
свойств
Стек вызовов
Управление
потоком
выполнения
10. Взаимодействие с Debug Flash Player
Очередь
задач
Поток
программы
Debug
Flash Player
Задача
Задача
Время
ожидания
истекло
Сообщить о
неудаче
Сокет-соединение.
Обмен сообщениями.
Работа в режиме запрос ответ
Недетерминированное время выполнения операций
Отсутствует кэширование
Возможен вариант удаленной отладки
Специфика протокола взаимодействия
Debugger API
11. Отладчик приложений на языке ActionScript 3
ООО «Ричмедиа» , iSpring Solutions, Inc. 11
Отладчик
ActionScript 3
Интерпретатор
выражений
Debug
Flash Player
Flash-
приложение
Visual Studio
Отладчик
ActionScript 3
API
Интерпретатора
API
Отладчика
Сокет-соединение.
Debug-Flash Player
API
Visual Studio API
Отладчика
Требуется интерпретация
выражений: watch
window, immediate
window, conditional
breakpoints
12. Примеры задач с вычислением выражений
ООО «Ричмедиа» , iSpring Solutions, Inc. 12
package
{
/**
* ...
* @author
*/
public class Airplanes
{
private var airplanes:Array = newArray();
public function Airplanes()
{
}
public function add(airplane:IAirplane)
{
airplanes.push(airplane);
}
public function remove(airplane:IAirplane)
{
airplanes.push(airplane);
}
}
}
Точка
останова
Посмотреть значение:
this.airplanes[0].toString()
Остановиться если:
airplanes.length == 4
13. Интерпретатор выражений ActionScript 3
Debug
Flash Player
ActionScript 3
Debugger
Interpreter
Flash-
приложение this.airplanes[0].toString() “[Airplane]”
Вычисление
выражений по
спецификации
ECMA-262
Таблица символов +
вызов функций
14. Интеграция отладчика с Visual Studio 2010
ООО «Ричмедиа» , iSpring Solutions, Inc. 14
VS Debug
Package
Session
Manager
Process
Debug
Manager
ActionScript 3
Debug Engine
C#
Debug
Engine
ActionScript 3
Expression
Evaluator
Expression
Evaluator
Symbol
Provider
Debug
Flash Player
Symbol
Provider
Модуль
расширения
Управляет
модулями отладки
Управляет
списком
отлаживаемых
программ
Предоставляет
возможности
отладки
Вычислитель
выражений
Для отладки
некоторых программ
требуется таблица
символов
Program
15. Заключение
Реализован модуль для отладки приложений на
ActionScript 3 в среде Visual Studio 2010 и произведена его
интеграция с продуктом CodeDrive.
Перспективы развития:
Автодополнение в окнах отладчика(Intellisense)
Одновременная отладка нескольких приложений (обход
ограничения Debug Flash Player)
Отладка динамических компонентов (Dynamic Shared
Library)
Полнофункциональный интерпретатор (ECMA-262 +
ECMA-357)
Дизассемблер
ООО «Ричмедиа» , iSpring Solutions, Inc. 15
28. COM Interop
COM Interop ("Взаимодействие с COM") - технология,
включённая в .NET CLR, позволяющий
объектам COM взаимодействовать с объектами .NET,
и наоборот.
Задачей COM Interop является обеспечение доступа к
существующим компонентам COM без
необходимости модификации оригинальных
компонентов. Даная технология пытается сделать
типы .NET эквивалентными типам COM. Кроме того,
COM Interop позволяет разработчикам COM получить
доступ к управляемым объектам так же просто, как и
доступ к другим объектам COM.
ООО «Ричмедиа» , iSpring Solutions, Inc. 28
29. Code Contracts Essential
Контракты для методов
Contract.Requires
Contract.Ensure
Инварианты для объектов
Contract.Invariant
Контракты для интерфейсов
Утилиты
Проверки времени выполнения
Статические проверки
Генерация unit тестов – Pex
Генерация документации
Msbuild Integration
Visual Studio Addin
ООО «Ричмедиа» , iSpring Solutions, Inc. 29
30. Пример
ООО «Ричмедиа» , iSpring Solutions, Inc. 30
public WebService(IWarehouse store) {
}
this.store = store;
Contract.Requires(store != null);
Contract.Ensures(this.store != null);
33. IEnumerable<T>
E.g. LINQ toObjects
IObservable<T>
E.g. LINQ to Events
IQueryable<T>
E.g. LINQ to SQL
Фиксированный
(MSIL)
Транслируемый
(Деревьявыражений)
ToQueryable
ToObservable
ToEnumerable
AsQueryable
AsEnumerable
AsQbservable
AsObservable
Pull
(интерактивный)
Push
(реактивный)
LINQ to *.*
Что?
Как?
Пулы потоков Циклы сообщенийПотоки Распределенные
вычисления
Двойственность
Homo-iconic
IQbservable<T>
E.g. LINQ to PowerShell
ToQbservable
34. Task Parallel library Essential
Предподчитетельный способ создания
многопоточного и параллельного кода
Набор API интерфейсов
Повышает прозиводительность труда
разработчиков
Упрощает процесс добавления параллелизма
Увеличивает степень параллелизма динамечески
ООО «Ричмедиа» , iSpring Solutions, Inc. 34
Здравствуйте, уважаемая дипломная комиссия, меня зовут Шайхутдинов Ринат, разрешите представить вашему вниманию дипломную работу, темой которой является разработка Модуля для отладки приложений на языке ActionScript 3 в среде Visual Studio 2010. Руководителем проекта является Малов Алексей Николаевич, работа выполнена по заказу компании ООО «Ричмедиа», в которой ятеперь работаю.
Одним из направлений деятельности организация ООО «Ричмедиа» является разработка программного продукта CodeDrive, выполненного в виде расширениядля среды разработки Microsoft Visual Studio 2010, позволяющего вести разработкуFlash-приложений на языке ActionScript 3.Модуль расширения реализует:Редактор кодаКомпиляторСредства автоматизации сборкиУправление проектамии т.дНо отсутствовал отладчик.
Постановка задачиРазработать модуль предоставляющий асинхронное API для отладки приложенийна языке ActionScript 3 и интегрировать данный модуль с Microsoft Visual Studio 2010 в составе продукта Code Drive.Тестируемость – модуль взаимодействия с Debug Flash Player (он же ActionScript 3 Debugger) должен быть спроектированс учетом возможности покрытия модульными тестами и интеграционными тестами, чтобы при дальнейших модификациях системы не повредить существующий функционал.Гибкость – зависимость между элементами системы должна быть минимальной, чтобы эффективнее вносить изменения в систему для дальнейшего ее развития.Надежность – модуль отладки являетсяодним из компонентов продукта CodeDrive и Visual Studio, и не должен нарушать работу множества других подсистем.
Для решения поставлены задачи были выбраны следующие инструменты.C# 4.0 + LINQ + .NET Framework 4.0 – мощные инструменты для создания современного ПОTaskParallelLibrary – библиотека параллельных задач, потребовалась для организации асинхронности с помощью RxReactiveFramework – библиотека для организации асинхронного кодаCodeContracts – библиотека развившая идею программирования по контрактуVisual Studio SDK – предназначенадля расширения Visual StudioCOM – лежит в основе модулей расширения для Visual StudioNunit + Moq + ActionScript использовалисьдля тестирования
Каждый из нас хотя бы раз сталкилвался с состоянием программыКак на данном экране (видим Режим ожидания)Это пример того как внутренняя логика приложения блокирует интерфейс пользователя (UI)Избежать окон подобного рода призвана асинхронность.
ReactiveExtensions или Rx (по аналигии с PFX) или “реактивные расширения” –это набор библиотек, которые позволяют работать с событиями и асинхронными вызовамив композиционном стиле, в т.ч. через Linq.Цель этого фреймворка – помочь разработчикам писать код в котором фигурирует асинхронное взаимодействие.
ActionScript — объектно-ориентированный язык программирования, один из диалектов ECMAScript, который добавляет интерактивность, обработку данных и многое другое в содержимое Flash-приложений. ActionScript исполняется виртуальной машиной (ActionScript VirtualMachine), которая является составной частью FlashPlayer. ActionScript компилируется в байткод, который включается в SWF-файл.SWF-файлы исполняются FlashPlayer-ом. FlashPlayer существует в виде плагина к веб-браузеру, а также как самостоятельное исполняемое приложение (standalone). Во втором случае возможно создание исполняемых exe-файлов (projector), когда swf-файл включается во FlashPlayer.
Отладчик должен обладать следующим минимальным функционалом:Управление потоком выполнения:Пошаговая трассировка:Шаги с заходом, обходом, выходом, запуск, остановка и т.дУправление точками останова: Установка и удаление контрольных точек или условий остановкиПросмотр / изменение данных:Отслеживание, установка и изменение значения переменных в процессе работы программыВычисление выражений – иногда пользователи нуждаются в вычислении каких либо выражений в каком либо контексте программыОбработка исключенийвозникающих в отлаживаемой программе
Debug Flash Player – специальная версия программы Adobe Flash Player,предоставляющая помимо проигрывания Flash-файлов возможностьдоступа к текущему состоянию виртуальной машины Flash-плеера.Debug Flash Player предоставляет набор операцийиспользуя которыеможно осуществлять отладку приложений на ActionScript 3.
Debug Flash Player не обладает достаточно развитым протоколом взаимодействияСледовательно требуется дополнительный модуль для управления Debug Flash Player, controllerDebug Flash Player и протокол общения с нимтребуют работы в режиме запрос ответDebug Flash Player не гарантирует завершения операции за какое либо время; некоторые операции иногда могут длиться несколько секундВозможен вариант удаленной отладкиНеобходим дополнительный модуль, скрывающий особенности работы Debug Flash Player призван решить данные проблемы.
Для решения поставленной задачи потребовалосьРазработать модуль осуществляющий взаимодействие с Debug Flash Playerпо специальному протоколу посредством сокетовА также интегрировать данный модуль с Visual Studio в составе продукта CodeDriveVisual Studio предоставляет API для интеграции отладчиков а взаимодействуя с модулемотладки через предоставляемое им асинхронное API можно осуществлять отладку приложений ActionScript 3Некоторые элементы пользовательского интерфейса Visual Studio требуют вычисления выраженийДля достижения этой цели нужно было разработать интерпретатор выражений.
Примеры задач для вычисления выражений:Срабатывание точки останова и последующее вычисление выраженияСоздание точек останова с условием
Выражения необходимо вычислять по спецификации ECMA-262 иECMA-357Выражения самая сложная часть данных спецификаций.В некоторых случаях для вычисления выраженийНеобходим Runtime контекст Debug Flash PlayerНа данный момент интерпретатор не реализует все выраженияИз всех выражений были выбраны наиболее востребованные:(бинарные операции, вызовы функций, обращение к интедку массива, кобочные выражения)
В основе модулей расширения Visual Studio 2010 лежит технология COM.COM -Технологический стандарт от компании Microsoft, предназначенный для создания программного обеспечения на основе взаимодействующих компонентов, каждый из которых может использоваться во многих программах одновременно. COM Interop ("Взаимодействие с COM") - технология, включённая в .NET CLR, позволяющий объектам COM взаимодействовать с объектами .NET, и наоборот.VSPackage – представляют собой программные модули c помощью которых можно расширить Visual Studio дополнительными функциональными возможностями: элементами пользовательского интерофейса, сервисами, новыми типами проектов, редакторами кода, дизайнерами.Session Debug Manager предназанчен для управления модулям отладки, реализуется Visual StudioProcess Debug Manager – управляет программами и процессами, и предоставляет возможность их отладки с помощью DebugEngine,Также реализуется Visual StudioDebugEngine – является компонентом реализуя который, можно осуществлять отладку новых типов программ.ExpressionEvaluatorпредназначен разбора и вычисления значений переменных и выраженийДля отображения их в соответсвующих окнах Visual StudioЭтапы интеграцииРегистрация Debug Engine вVisual Studio (Фабрика класса - COM)Реализация механизма загрузки Debug Engine и присоединения к программе для отладкиРеализация интерфейсов для управления потоком выполнения, просмотра данных, вычисления выраженийРеализация механизма событий для связи Debug Engine c отладчиком ActionScript 3Реализация интерфейсов для завершения отладки
Speaker tips:The essential difference is who controls how the data is received.Philosophically this is nothing but how the application and the environment work together.Looking from the application’s point of view:Does it ask the environment – interactively – for data? enumerableDoes it passively wait for the environment to send data and react to it? observableBoth are complementary models. One doesn’t (aim to) replace the other.Matter of which one aligns more closely to which model:SQL’ s TDS protocol is pull-based, hence IE<T> is the best fit.Stock broker services may be push-based, hence IO<T> is a better match.Will see how one can convert between those.
Практический эффектМенталитет Rx сводится к так называемым push-коллекциям. Разница следуюшщая: pull-коллекции предоставляют свое содержимое по запросу. Push-коллекции сами “толкают” элементы,нужно подписаться на выдачу элементов. При этом “элементами” являются не только элементы коллекций. Например, если происходит событие, то push-коллекция в контексте Rx может выдавать аргументы события. Или результат асинхронного вызова. Приложение становится “реактивным”, то есть учится реагировать на события и аггрегировать их для более удобного использования.1. Мы получили способ комбинирования событий. В реальных приложениях довольно частно нужно иметь обработчик на комбинацию событий, причем не просто на комбинацию, а на комбинацию со сложными условиями, например, когда одно событие возникает только после другого и если этому не предшествовало третье. С помощю Rx, такая задача решается одним запросом.2. Но самое крутое, что мы получили единый (!) механизм работы не только с событиями, но и со всеми асинхронными операциями. То есть, все события, асинхронные паттерны, TPL и любая другая параллельно-асинхронная конструкция – отлично покрываются этой моделью и все это тоже можно комбинировать между собой линковскими запросами посредством Rx.
Библиотека параллельных задач (TPL) представляет собой набор открытых типов и API-интерфейсов в пространствах имен System.Threading и System.Threading.Tasks в .NET Framework 4. TPL предназначен для того, чтобы повысить производительность труда разработчиков, упрощая процесс добавления параллелизма и одновременного доступа к приложениям. TPL увеличивает степень параллелизма динамически, чтобы наиболее эффективно использовать все процессоры, которые доступны. Кроме того, в библиотеке параллельных задач осуществляется секционирование работы, планирование потоков в пуле ThreadPool, поддержка отмены, управление состоянием и выполняются другие низкоуровневые задачи. Используя библиотеку параллельных задач, можно повысить производительность кода, сосредоточившись на работе, для которой предназначена программа.Начиная с .NET Framework 4 библиотека параллельных задач является предпочтительным способом создания многопоточного и параллельного кода.