библиотека автоматов состояний Nemerle.Statechart
От: CodingUnit Россия  
Дата: 20.07.11 10:34
Оценка: 98 (7)
Идея написания библиотеки работы с конечными автоматами на Nemerle пришла давно, вот здесь началась развиваться тема на форуме:
http://rsdn.ru/forum/nemerle/3716028.aspx
Автор: CodingUnit
Дата: 24.02.10


Все это время я потихоньку развивал проект, сейчас библиотека вошла в рабочую фазу, реализованы основные функции семантики автоматов UML. С выходом Nemerle.Peg добавились новые возможности создания языка DSL. Подобные библиотеки есть во всех языках, например boost::statechart в C++, Sanford.StateMachineToolkit, SimpleStateMachine — C# State Machine Library — Boo and Rhino DSL, StaMa, Stateless. Хотелось бы иметь и такую же в Nemerle, плюсы от использования Nemerle очевидны, это удобный разбор dsl языка описания автомата (в аналогичных библиотеках как правило неудобно создавать сами диаграммы), анализ на этапе компиляции, генерация высокоэффективного кода, практически полное отсутствие динамических конструкций ускоряющие код. Идея хорошо себя оправдала, я тестировал аналогичные автоматы Sanford.StateMachineToolkit и моей библиотеки, разница в скорости в плюс библиотеки на Nemerle была в десятки раз. Все это говорит о том что аналогов подобной библиотеки в мире нет, остальные библиотеки проигрывают в скорости и удобстве описания автомата, все это дает причину опубликовать библиотеку для широкого использования. Хотел спросить есть ли у сообщества согласие на хостинг библиотеки в snippets, я хотел назвать Nemerle.Statechart.
Текущие возможности библиотеки таковы:
— язык описания диаграммы состояний представляет собой текстовый dsl вида
state Parked
{
  EngineStarted => IdleInNeutral;
}

state IdleInNeutral
{
  EngineKilled => Parked;
  GearEngaged  => IdleInGear;       
}

state IdleInGear
{
  GearDisengaged => IdleInNeutral;
  GasApplied     => RacingAlong;
}

state RacingAlong
{
   BrakeApplied       => IdleInGear;
   CarCrashedIntoTree => CarDestroyed;
}

state CarDestroyed
{
}


Здесь изображен плоский автомат, библиотека включает большинство из возможностей uml автоматов, например такой автомат:


можно дополнить сторожевыми условиями, входными выходными действиями и получить в конечном счете что то типа:
[statechart(<#
  
  flags : auto_initial, transition_completed_events debug;
  
  state A  
  {
      (H) => D;
      
      $>;
      $<;
      
      b => E;
      f => D; // cross
      
      state B
      {
          0 / init_action => C;
          (H*) => E;
          $>;
          $<;

          b => D; // cross
          
          d => D;
          f [test_guard1] / f_action =>@;
          k => A;
          c => E;
          _ => D;
          
          state C
          {
              $>;
              a / A;
              $<;
              
              b [test_guard2] => E; 
              m =>@;
          }
          
          state E
          {
              $>;
              $<;
              i => D;
              j => A;
              o /final_action1 => final;
          }
          
      }
            
      state D
      {
          $>;  
          $<;
          e => B;
          n => B.H;
      }
      
      g => H;
  }
  #>
  )]
  class PathCoverFsm
  {
      
      //[GuardFor(test_guard1)]
    test_guard1() : bool// {get;set;}
    {
      true
    }
      
    test_guard2 : bool// {get;set;}
    {
      get
      {
        true
      }
    }
      
    test_guard3 : bool// {get;set;}
    {
      get
      {
        true
      }
    }      
  }
}


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

весь список возможностей на текущий день:

— парсинг метаттрибута текстового описания автомата
— анализ путей переходов
— генерация представления автомата в класс
— анализ и генерация истории shallow и deep history
— переходы по умолчанию из исторических состояний
— сторожевые условия
— встраиваемые члены сторожевых условий
— конечные состояния (final)
— начальные состояния (initial)
— действия при входе и выходе
— сброс истории при переходе в конечное состояние (check spec)
— приоритет переходов вложенных классов
— внутренние переходы

еще не достает до полноты:
-terminal pseudostate
-do activity
-choice
-junction
-fork and join pseudostates
-orthogonal regions
-local and external transitions
-deffered events

Что скажет сообщество на сей творческий порыв




от макросов до вариантов
и массой всяких преимуществ
благодаря nemerle-братству
программеров жизнь стала лучше
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.