вышла библиотека Nemerle.Statechart версия 1.1
От: CodingUnit Россия  
Дата: 25.10.13 23:54
Оценка: 258 (9)
Вышла новая версия библиотеки Nemerle.Statechart, залита в репозитарии Н, должна со следующей сборкой идти вместе с инсталлятором Н, расскажу об изменениях которые произошли. Была проделана большая работа по переписке движка, прочел кучу литературы по автоматам и диаграммам состояний UML, включая стандарт, все функции которые были исправлены или добавлены, привести не удастся, работа за два года, коммитов больше 500, скажу только об основных изменениях. Также для тех кто новичок и ничего не слышал о библиотеке или не знаком с областью конечных автоматов и диаграмм состояний UML я расскажу на примерах в нескольких постах о диаграммах состояний и их представлении в библиотеке и для чего она служит. Если что то упущу или не вспомню, в следующих примерах, и документации опишу последовательно все элементы и конструкции и их использование.

Помимо функций которые уже были и работали, появились новые:



На данный момент реализованы практически все функции из стандарта UML касательно автоматов состояний, остались некоторые редко используемые, но в будущем планируется полностью покрыть стандарт UML. Язык описания DSL и трансформация на этапе компиляции и генерация кода, позволяют сделать на основе описания поддержку любой сложной конструкции и сгенерировать эффективный код, выдавать сообщения об ошибках в случае ошибок в описании языка или семантике анализируемого автомата, такое на данный момент сложно реализуемо на других языках, сравнения по скорости с аналогичными автоматами сделанными на обычных библиотеках, которые строят автомат в рантайме, библиотека по скорости кода обходит как минимум в 7 раз, анализ и выдача ошибок тоже помогают качественному коду автомата. Сам язык автомата, декларативен, содержит лишь информацию касательно описания состояний, переходов событий, действий то есть того как описывается автомат из оригинальной диаграммы и легко перекладывается из диаграммы в код, не требуя усилий в виде сложных описаний в духе метапрограммирования шаблонов C++, или вызова методов для добавления переходов в других языках, с нулевой возможностью выдачи ошибок и очень низкой анализа. Текстовое описание возможно и без диаграммы, при этом создание не сложней чем рисовать диаграмму, никаких дополнительных конструкций кроме необходимой информации не нужно. На данный момент мало или практически нет нормальных генераторов кода для автоматов, поддерживающих все функции UML, потребность в них и заставила заняться этой задачей.

Автоматами по стандарту UML могут снабжаться любые сущности, типа классов, описывая их поведение в четком детерминированном виде, когда все состояния объекта известны и скрыты внутри автомата, внутри каждого состояния объект выполняет какую то задачу (активность), переходы из состояния в другое состояние, наборы и последовательность эффектов при изменениях состояний определяются автоматом или диаграммой, по определенным событиям, при этом класс имеет свой поток управления, реагирует на внешние и внутренние события асинхронно, в каждом состоянии по разному, при этом каждое событие обрабатывается по одному в так называемом шаге до завершения (run-to-completion step) между двумя шагами автомат обрабатывает только одно событие, а после пребывает в стабильном состоянии, исключая порчу или рассинхронизацию своего внутреннего состояния, при работе из нескольких потоков. Все это есть реактивное программирование, когда программа не просто обрабатывает и трансформирует данные, но пребывает в нескольких состояниях, в течении разного времени, могут появляться различные события в любой момент времени, как то нажатие кнопок, временные интервалы, другие сигналы и обстоятельства которые случаются во времени и могут рассматриваться как события, на которые обьект должен реагировать, выполнять последовательность эффектов, изменять свое состояние управляемым способом и реагировать в каждом состоянии на разный набор событий, в таких случаях и стоит применять автоматы состояний и диаграммы, упрощающие их описание, надежность такого приложения возрастает, а отладка упрощается. Все описание поведения приложения, обьекта или какого то процесса может быть описано через состояния, набор эффектов при входах, выходах из состояний и при переходах. Примерами приложений в которых было бы полезно автоматное программирование можно назвать графический интерфейс, где он может пребывать в разных состояниях или режимах и по разному реагировать на действия пользователя, view-model в паттерне MVVM может описываться автоматом. Сама технология WPF может легко использоваться с автоматами, достаточно будет только послать события в автомат, подписаться на какие то действия, и автомат сам будет вызывать действия и эффекты в верной последовательности, все описание поведения может быть сконценрировано в автомате, чтобы изменить поведение приложения достаточно изменить описание или переосмыслить диаграмму. Также автоматы могут применяться в играх, где у обьектов мира бывает множество состояний, неожиданных событий в мире, которые могут появляться когда угодно, на которые они по разному реагируют и должны менять свое состояние, программирование таких сложных процессов через стандартную модель, даже если возможна событийность, без реактивного программирования, четкого описания в диаграммах может привести к трудности при отладке, куче багов и спагетти-кода. Также автоматы могут применяться в workflow процессах, робототехнике, других описаниях автоматных систем, типа разных приборов, имеющих взаимодействие с пользователем типа часов, телефонов, фотоаппаратов, автоматов выдачи валюты и тп. Моделирования обьектов реального мира, которые все изменяют свое состояние, описание протоколов связи и систем реального времени.
Автоматы из библиотеки поддерживают работу со временными интервалами, через временные события, достаточно описать переход из одного состояния в другое через событие after (), можно использовать любые интервалы в секундах, миллисекундах, минутах, часах, днях, автомат сам будет следить за созданием, запуском таймеров, их распределением и оптимизировать чтобы таймеров использовалось по минимуму.

В будущем я думаю сделать генератор не только для Немерле, но и для других языков, включая C/C++ это позволит использовать библиотеку для описания автоматов для систем реального времени и микроконтроллеров, всяких других устройств типа телефонов, планшетов и тп. Также хотелось сделать генератор в диаграммы и наоборот, простой рисовальщик диаграмм, который мог бы генерить код с помощью библиотеки. Также Найтра в будущем будет использоваться как основной генератор парсера, что улучшит текстовый парсинг и обработку ошибок синтаксиса.
В следующих постах опишу на примерах работу с библиотекой, также вы можете сами посмотреть примеры которые есть в папке snippets\Nemerle.Statechart\Tests чтобы начать программировать с помощью библиотеки. Конечно хотелось бы чтобы появились люди которые могли бы потестить библиотеку в своих проектах и приложениях, дать комментарии, предложения и ошибки которые найдут. На английском форуме я также буду вести описание и составлять документацию, если кто то может помочь с переводом на английский тоже бы было неплохо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.