Forth
http://www.fforum.winglion.ru/

Автоматы (FSM)
http://www.fforum.winglion.ru/viewtopic.php?f=25&t=3157
Страница 1 из 2

Автор:  mOleg [ Ср фев 14, 2018 16:42 ]
Заголовок сообщения:  Автоматы (FSM)

Вот такая библиотека для реализации автоматов разродилась.
Пример в конце текста.

source file: fsm_.fts
\ 2018.01.27 ~mOleg
\ автоматы состояний (однопоточная реализация)

VOCABULARY FSM
ALSO HIDDEN
ALSO FSM DEFINITIONS

\ вызов ошибки, если не задано состояние после сброса автомата
: (nostate) ERROR" Начальное состояние не задано" ;

\ завершение создания определения
: S; ( --> )
SMUDGE controls @ 1 - ABORT" Несоответствие управляющих структур"
EXIT-ERROR controls OFF
;CREATE [COMPILE] [ ;

\ создать словарь-контейнер с указанным именем, сделать его текущим
: container ( asc # --> )
<| [CHAR] ( KEEP KEEPS [CHAR] ) KEEP |> SVOCAB DROP
ALSO LATEST LINK>C EXECUTE ;

\ методы работы с автоматом
: (perform) ( --> ) R> [ TOKEN 2 * LIT, ] + PERFORM ; \ выполнение
: (init) ( adr --> ) R> TOKEN + DUP A@ SWAP ADDR + A! ; \ инициализация
: (reset) ( --> ) R@ ADDR + A@ R> A! ; \ сброс в начальное состояние

\ создать имя автомата, вернуть адрес к смещению указателя в пользовательскую область
: (automat) ( asc # --> adr )
S:
COMPILE
(perform) \ вызов текущего состояния автомат
COMPILE (init) \ ( state --> ) переключение автомата в указанное состояние
COMPILE (reset) \ сброс автомата в начальное состояние
HERE ['] (nostate) A, \ текущее состояние
['] (nostate) A, \ сброс состояния
S; ;

\ переключить автомат в заданное состояние
: (SW) ( --> ) R@ A@ A@ R> ADDR + A@ A! ;

\ начать описание поведения в заданном состоянии
: (SM) ( r: adr --> adr ) R> A>L s" " S: HERE A>L NOTICE" Контроль баланса" ;

\ создать имя состояния, описатель
: (newstate) ( / name --> )
NEXT-WORD
DDUP <| [CHAR] : KEEP KEEPS |>
S:
COMPILE
(SM) HERE >L ['] (nostate) A,
S;
S:
COMPILE
(SW) L> A, R> A@ A,
S; ;

\ имя, создающее описатели состояний
: (dostate) ( asc # adr --> )
A>L <| KEEPS [CHAR] : KEEP |>
S:
COMPILE
(newstate) AL> A,
S; ;

UNDER PREVIOUS
UNDER DEFINITIONS

\ Создание автомата с именем name
: FSM: ( / name --> )
NEXT-WORD DDUP (automat) A>L
DDUP container DEFINITIONS
AL> (dostate) ;

\ завершение описания состояния
: ;ST [COMPILE] ; ?PAIRS" Контроль баланса" AL> AL> A! ; IMMEDIATE

\ завершение описания состояний автомата
: ;FSM ( / name --> )
' DUP EXECUTE \ тут можно проверить правильность имения (должно быть состояние, а ни что-то другое)
[ TOKEN ADDR + LIT, ] + A@ [ TOKEN 2 * LIT, ] - EXECUTE \ задать начальное состояние автомата
RECENT ;

ALIAS FROM RESET \ сбросить автомат в начальное состояние

UNDER RECENT


\ EOF -- тестовая секция --

FSM: DNA \ создать имя автомата состояний,
\ которое надо будет потом вызывать в рабочем цикле.
\ автоматически создается словарь (DNA),
\ куда пойдут все имена состояний автомата

DNA: ONE \ перечислить все возможные состояния автомата (последовательность не важна)
DNA: TWO \ можно перемешивать с описанием состояний но нельзя ссылаться ранее объявления состояния
DNA: TRE \ автомат можно переводить в произвольное состояние используя имя состояния
DNA: FOU \

\ описать поведение в каждом состоянии и задать возможные переходы между ними
\ в случае упоминания имени состояния (без двоеточия) происходит переключение автомата в новое (заданное) состояние
:ONE ." А" IF ONE ELSE TWO ;THEN 2 OVER = IF CR THEN ;ST
:TWO ." Г" IF FOU ELSE ONE THEN ;ST
:TRE ." Ц" IF ONE ELSE TRE THEN ;ST
:FOU ." Т" IF FOU ELSE TWO THEN ;ST

;FSM ONE \ завершить описание автомата, и задать начальное состояние автомата


math/ mersenne.fts \ ГСЧ

0 SPACE
RESET DNA \ сброс автомата в начальное состояние
BEGIN KEY? WHILENOT \ пока не нажата кнопка

RANDOM 1 AND DNA \ случайное число на вход автомата

1 + 3 MOD *IF ELSE SPACE THEN \ каждый триплет отделять пробелом
50 PAUSE
REPEAT KEY DDROP

Автор:  Hishnik [ Чт фев 15, 2018 11:47 ]
Заголовок сообщения:  Re: Автоматы (FSM)

Пытаюсь понять, что тут нового по сравнению с описанием через обычное CASE.

Автор:  gudleifr [ Чт фев 15, 2018 12:20 ]
Заголовок сообщения:  Re: Автоматы (FSM)

Hishnik писал(а):
что тут нового по сравнению с описанием через обычное CASE.

ИзображениеТЕМА #74Изображение По большей части, это восстановленная тема этого форума, начавшая с того, что mOleg предложил "именно CASE".

Автор:  mOleg [ Чт фев 15, 2018 16:16 ]
Заголовок сообщения:  Re: Автоматы (FSM)

Hishnik писал(а):
Пытаюсь понять, что тут нового по сравнению с описанием через обычное CASE.

А с этого я как раз начинал 8)

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

Кроме того, в тех же сях я автоматы реализую аналогично:
Код:
void (*being)(void); \ объявление автомата

void workloop(void)
                   {  ...
                       being = stPowerOn;
                       ...
                       while(!restart)
                              {  ...
                                  being();
                                  ...
                              }
                     }

void stPowerOn(void);
...
void stPowerOff(void);


void stPowerOn(void)
                     { ....     
                        being= newState;
                     }


аналогично тут:
Код:
  FSM: being

being: stPowerOn
..
being: stPowerOff

:stPowerOn   ... newState ;

FSM; stPowerOn

: workloop  ...
                 RESET being
                 BEGIN ?Restart WHILENOT
                     
                    being
               
                 REPEAT
                ;


Автор:  mOleg [ Чт фев 15, 2018 16:32 ]
Заголовок сообщения:  Re: Автоматы (FSM)

да, а еще интересно то, что FSM: Name
создает сразу три определения:
Name - сам автомат вызываемый
(Name) - словарь, куда определяются все состояния
Name: - метод позволяющий создавать новые состояния

В свою очередь Name: State
создает сразу два определения
State - переключатель в новое состояние
:State - описатель состояния

Автор:  gudleifr [ Пн фев 19, 2018 12:42 ]
Заголовок сообщения:  Re: Автоматы (FSM)

Кстати, вот реальная задача: пара автоматов, вложенных друг в друга - ИзображениеТЕМА #70, примерно АБЗАЦ #762Изображение.
Сможет ли кто-нибудь написать на FORTH красивее убогого GW-BASIC? Тем более, избежать этапа программирования на бумажке? Или, как обычно, строим "елочки" и "матрешки" на C++, а потом эмулируем на "FORTH со структурами, исключениями и локальными переменными"?

Автор:  mOleg [ Пн фев 19, 2018 19:45 ]
Заголовок сообщения:  Re: Автоматы (FSM)

gudleifr писал(а):
Кстати, вот реальная задача:

и вспомнились мне строчки:
"так мелко и так много, что прочитал чуть-чуть -
не пишут так коряво, когда на веки рвут"
Мне лень читать ваши простыни на стороннем ресурсе.
Пишите вменяемо здесь.

Автор:  gudleifr [ Пн фев 19, 2018 20:07 ]
Заголовок сообщения:  Re: Автоматы (FSM)

mOleg писал(а):
простыни на стороннем ресурсе.
А что Вы хотели от реальной задачи? Это же не школьный пример, который кто-то будет для Вас специально причесывать.
Кстати "вменяемо" и "здесь" одновременно - это ненаучная фантастика.

Автор:  _Harry [ Ср авг 14, 2019 12:21 ]
Заголовок сообщения:  Re: Автоматы (FSM)

Цитата:
Кроме того, в тех же сях я автоматы реализую аналогично:

Я тоже последнее время этот способ активно использую.
Кстати считал себя "изобретателем" :) нигде не встречал описания такого способа реализации автоматов.
Но для малого количества состояний использую swith() case: классический способ он как то нагляднее особенно если на одну страницу все помещается.

Автор:  Wlad [ Чт сен 12, 2019 12:05 ]
Заголовок сообщения:  Re: Автоматы (FSM)

У Миро Самека (который https://www.state-machine.com ) состояния это - функции/статические методы классов/структур.
Правда у него - идеология "активных объектов".
Не встречал кто-то такого же в реализациях КА на Форте?

Автор:  _Harry [ Пт сен 20, 2019 11:12 ]
Заголовок сообщения:  Re: Автоматы (FSM)

Wlad писал(а):
состояния это - функции/статические методы классов/структур.

Так вроде и тема про это. только класcов нет но это же Forth, зачем они нужны?
(Мне вот даже жалко стало что воспользоваться кодом не могу на работе только Си.)

Автор:  Hishnik [ Пт сен 20, 2019 14:44 ]
Заголовок сообщения:  Re: Автоматы (FSM)

Эээ... "состояния - это функции"??? Это как минимум требует пояснения. Это предложение узнавать состояние КА вызовами функций? КА - это, к примеру, настольная лампа с сенсорной кнопкой. У нее два состояния - "включено" и "выключено". Но это не функции.

Автор:  Wlad [ Пт сен 20, 2019 19:29 ]
Заголовок сообщения:  Re: Автоматы (FSM)

Hishnik писал(а):
Эээ... "состояния - это функции"??? Это как минимум требует пояснения. Это предложение узнавать состояние КА вызовами функций? КА - это, к примеру, настольная лампа с сенсорной кнопкой. У нее два состояния - "включено" и "выключено". Но это не функции.

Поясню: переменная состояния представляет собой указатель на функцию.
Эта функция - сосредоточие логики обработки входящих событий (через аргумент функции), на основании которых (+ учёта ряда условий) предпринимается решение о (возможной) смене состояния (назначение "хранителю текущего состояния"-указателю на функцию адреса другой функции).
В этой же функции есть участки кода для обеспечения вызова кода при "входе" и "выходе" из состояния и вызов "функций-менеджеров" возможных вложенных состояний.
Для справки: https://www.state-machine.com/psicc2

Автор:  mOleg [ Пт сен 20, 2019 20:31 ]
Заголовок сообщения:  Re: Автоматы (FSM)

Wlad писал(а):
Поясню: переменная состояния представляет собой указатель на функцию.

То есть просто нет переменной, хранящей текущее состояние?
Понимаю, как должно работать для одного единственного автомата, а если их пучок?

Автор:  mOleg [ Пт сен 20, 2019 20:35 ]
Заголовок сообщения:  Re: Автоматы (FSM)

_Harry писал(а):
Я тоже последнее время этот способ активно использую.
Кстати считал себя "изобретателем" :) нигде не встречал описания такого способа реализации автоматов.

ну, я тоже не встречал, прижало - пораскинул мыслями 8)
(хотя очень подозреваю, что все же кто-то уже давно придумал раньше)

Так однозначно удобнее, чем:
_Harry писал(а):
Но для малого количества состояний использую swith() case: классический способ он как то нагляднее особенно если на одну страницу все помещается.

тем более, чем более сложные переходы между состояниями и чем больше их приходится править (расширять).

_Harry писал(а):
(Мне вот даже жалко стало что воспользоваться кодом не могу на работе только Си.)

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

Страница 1 из 2 Часовой пояс: UTC + 3 часа [ Летнее время ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/