DRAKON.SU
https://forum.drakon.su/

Обсуждение раздела Сергея Ефанова из книги по языку ДРАКОН
https://forum.drakon.su/viewtopic.php?f=62&t=6097
Страница 3 из 4

Автор:  LKom [ Среда, 01 Ноябрь, 2017 11:23 ]
Заголовок сообщения:  Re: Обсуждение раздела Сергея Ефанова из книги по языку ДРАК

После отказа автономного генератора запускать его повторно нельзя. Неизвестно в каком состоянии он остался при отказе.

Автор:  LKom [ Среда, 01 Ноябрь, 2017 11:32 ]
Заголовок сообщения:  Re: Обсуждение раздела Сергея Ефанова из книги по языку ДРАК

Степан Митькин писал(а):
Если это событие выходит за пределы модели, пишем "Вывод" или применяем простую икону Вывод без полки.
Что, в нотации В.Д. Паронджанова есть простые и не простые иконы Вывод?

Предложение С. Митькина является проявлением хаоса.

Автор:  Владимир Паронджанов [ Среда, 01 Ноябрь, 2017 12:27 ]
Заголовок сообщения:  Re: Обсуждение раздела Сергея Ефанова из книги по языку ДРАК

LKom писал(а):
После отказа автономного генератора запускать его повторно нельзя. Неизвестно в каком состоянии он остался при отказе.
Возможен вариант, когда владелец, узнав о происшествии, привез канистру бензина и запустил генератор вручную.

Кончился бензин — это одна из причин отказа.

Это пример того, когда можно и нужно запускать автономный генератор после отказа

Автор:  Степан Митькин [ Среда, 01 Ноябрь, 2017 12:57 ]
Заголовок сообщения:  Re: Обсуждение раздела Сергея Ефанова из книги по языку ДРАК

И ещё: эта двойная стрелка убивает читаемость на корню.
Мне требуются немалые усилия, чтобы понять, что имеется в виду.
Это против Духа ДРАКОНа.

Автор:  Владимир Паронджанов [ Среда, 01 Ноябрь, 2017 13:27 ]
Заголовок сообщения:  Re: Обсуждение раздела Сергея Ефанова из книги по языку ДРАК

Степан Митькин писал(а):
И ещё: эта двойная стрелка убивает читаемость на корню.
Мне требуются немалые усилия, чтобы понять, что имеется в виду.
Это против Духа ДРАКОНа.
Почему убивает читаемость?

Вложение:
050. pimgpsh_fullsize_distr.png
050. pimgpsh_fullsize_distr.png [ 11.37 КБ | Просмотров: 13753 ]


Мне кажется, что в каждой ветке имеются вложенные циклы со стрелкой.
Внутренний цикл со стрелкой аккуратно вложен во внешний цикл со стрелкой.
Разве не так?

Степан, давайте сравним с этой схемой, где тоже имеются две стрелки. viewtopic.php?p=100662#p100662
Здесь две стрелки тоже "убивают читаемость"?
Если не убивают, то в чем разница?
В чем отличие этих двух дракон-схем, где каждая имеет две стрелки?


Степан, как, по вашему мнению, надо исправить?

Автор:  Степан Митькин [ Среда, 01 Ноябрь, 2017 13:53 ]
Заголовок сообщения:  Re: Обсуждение раздела Сергея Ефанова из книги по языку ДРАК

Владимир Паронджанов писал(а):
Мне кажется, что в каждой ветке имеются вложенные циклы со стрелкой.
Внутренний цикл со стрелкой аккуратно вложен во внешний цикл со стрелкой.
Разве не так?

Степан, как, по вашему мнению, надо исправить?

Есть две мысли.

1. Первая, она же главная — избавиться от скрытых состояний.
Здесь я непреклонен.
Всё должно быть на виду. Есть 4 состояния? Значит, нужны 4 ветки.
- Сеть есть.
- Возможно, сети нет.
- Сети нет.
- Возможно, сеть есть.
Очень важно вытащить из тени малозаметные сочетания факторов.
Я говорю это на основании опыта автоматного программирования реальных систем.
Громоздко? Да. Зато понятно.
Лень? Хочется срезать углы? Сделать покороче? Готовьтесь к сбоям и отказам в самый неподходящий момент. :(

2. Вторая мысль связана с идиомой цикла со стрелкой в качестве ожидания события. Здесь я не настаиваю, только предлагаю.
Если взять описание алгоритма для человека (не программирование), то, возможно, цикл — не очень хорошая вещь.
Можно перепутать с требованием выполнять что-то много раз. Хотелось бы в явном виде сказать:
- Мы на ходимся в состоянии M.
- Мы ожидаем события X, Y, Z.

Автор:  Владимир Ситников [ Среда, 01 Ноябрь, 2017 14:37 ]
Заголовок сообщения:  Re: Обсуждение раздела Сергея Ефанова из книги по языку ДРАК

Владимир Паронджанов писал(а):
Степан, как, по вашему мнению, надо исправить?

Очевидно, ветку после запуска таймера нужно не наверх вести, а просто дальше -- к развилке "A > 5мин".
Да, если есть сеть мы сбросим таймер и тут же проверим "а прошло ли 5 минут", но зато обратная стрелка будет одна.

Ну и запуск соответствующих таймеров нужно делать не в конце ветки, а в начале.
Сейчас в каждой ветке упоминаются и таймер A и таймер B (кстати, почему не Б?)

Лучше же будет, если в первой ветке будет только таймер A, а во второй только B.


И, да, сообщение "есть сеть 220" должно посылаться не постоянно, а только когда мы переходим в состояние "есть сеть".
Иными словами, развилка "прошло ли 5 минут?" должна возвращать не в самое начало ветки, а в место после отправки SMS. Ну, чтобы зря сообщения не слать.

Автор:  efanov [ Среда, 01 Ноябрь, 2017 15:49 ]
Заголовок сообщения:  Re: Обсуждение раздела Сергея Ефанова из книги по языку ДРАК

Степан Митькин писал(а):
1. Нет отправки сообщения "Нет сети 220в".
2. Видимо, имеется путаница. Как автоматы у нас взаимодействуют?
Есть два варианта:
- через отправку сообщений
- через запись значений в разделяемые переменные
Сергей, какого подхода вы придерживаетесь? Это не ясно из диаграмм.
Конечно, из представленной единственной иллюстрации непонятно, как что взаимодействует.
Автоматов много. Все они вызываются поочередно в главном цикле.
Для взаимодействия автоматов есть "служба сообщений". Сообщения очень простые, в них нет ни адреса отправителя, ни адреса получателя, ни параметров. По сути - это битовые флаги. Для работы с сообщениями есть 3 функции:

send_mess( enum mess );
bool get_mess( enum mess );
void process_mess(void);

Первая "посылает" сообщение, вторая - "принимает". Список сообщений (enum) доступен всем автоматам. Любой автомат может послать любое сообщение, не заботясь о том, кто его примет. И любой автомат может принять любое сообщение, не имея понятия, кто его послал. Функция "process_mess" вызывается в главном цикле, после всех автоматов. Она выполняет 2 задачи:

- все посланные в текущем цикле сообщения становятся доступны для чтения всем автоматам в следующем цикле
- в конце следующего цикла эти сообщения уничтожаются.

Таким образом, неважно в каком порядке вызываются автоматы - любой автомат может принять любое сообщение.
Поэтому автомат контроля сети, если есть сеть - посылает сообщение "Есть сеть" в каждом цикле своей работы. Или не посылает, если сети нет. А сообщения "Нет сети" нету. Отсутствие сообщения "Есть сеть" говорит о том, что сети нет. Впрочем, тут свобода полная, легко можно сделать и отдельные сообщения "Есть сеть", "Нет сети". Наверное, даже так и лучше сделать. Изменения потребуют следующих правок

- внести в список (enum) новое сообщение .
- добавить в нужное место икону отправки этого сообщения
- добавить в нужное место икону приёма этого сообщения

Теперь по представленным Дракон схемам. Тут есть такие неявные соглашения:

1. Одна ветка - это одно состояние автомата.
2. Переход на другую ветку происходит при следующем вызове автомата.
3. Переход в самое начало ветки так-же происходит при следующем вызове автомата.

Именно 2 и 3 пункты не позволяют выносить в начало ветки сброс таймера.
Тут может быть только такое действие, которое нужно выполнять при каждом вызове автомата.

С уважением, Ефанов Сергей.

Автор:  Владимир Ситников [ Среда, 01 Ноябрь, 2017 15:59 ]
Заголовок сообщения:  Re: Обсуждение раздела Сергея Ефанова из книги по языку ДРАК

efanov писал(а):
Теперь по представленным Дракон схемам. Тут есть такие неявные соглашения:

1. Одна ветка - это одно состояние автомата.
2. Переход на другую ветку происходит при следующем вызове автомата.
3. Переход в самое начало ветки так-же происходит при следующем вызове автомата.

Именно 2 и 3 пункты не позволяют выносить в начало ветки сброс таймера.
Тут может быть только такое действие, которое нужно выполнять при каждом вызове автомата.


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

Автор:  Степан Митькин [ Среда, 01 Ноябрь, 2017 17:14 ]
Заголовок сообщения:  Re: Обсуждение раздела Сергея Ефанова из книги по языку ДРАК

efanov писал(а):
Для взаимодействия автоматов есть "служба сообщений". Сообщения очень простые, в них нет ни адреса отправителя, ни адреса получателя, ни параметров. По сути - это битовые флаги. Для работы с сообщениями есть 3 функции:

send_mess( enum mess );
bool get_mess( enum mess );
void process_mess(void);

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

efanov писал(а):
1. Одна ветка - это одно состояние автомата.
2. Переход на другую ветку происходит при следующем вызове автомата.
3. Переход в самое начало ветки так-же происходит при следующем вызове автомата.

Вопрос по циклу со стрелкой в начале ветки.
Как вы избегаете того, что функция автомата уходит в вечный цикл?
Разве первый попавшийся автомат не будет крутиться в своей функции вечно, пока события нет?

Автор:  efanov [ Среда, 01 Ноябрь, 2017 17:47 ]
Заголовок сообщения:  Re: Обсуждение раздела Сергея Ефанова из книги по языку ДРАК

Степан Митькин писал(а):
Теперь я понял, спасибо. Было бы хорошо, если бы вы поместили это описание в книге.
Предполагается, что в книге будет подробно "разжёвано" абсолютно всё по этой программе.
Степан Митькин писал(а):
Насколько я могу судить, это очень эффективная реализация службы сообщений.
Я не берусь судить о степени эффективности, но я перепробовал много разных концепций связи между автоматами, и остановился (сейчас) вот на этой. Идея, конечно, не моя, взята вот отсюда:
http://www.kit-e.ru/articles/circuit/2006_12_118.php
Цитата:
Вопрос по циклу со стрелкой в начале ветки.
Как вы избегаете того, что функция автомата уходит в вечный цикл?
Разве первый попавшийся автомат не будет крутиться в своей функции вечно, пока события нет?
Редактор "ИС Дракон", которым я пользуюсь, имеет 3 режима генерации кода. В первом режиме генерируется "обычная" функция. В ней, если нарисовать цикл со стрелкой вначале ветки - то получим вечный цикл. А два других режима генерируют конечный автомат, в котором ЛЮБОЙ переход в НАЧАЛО ветки вызывает обновление переменной состояния и выход из функции. При следующем вызове функции мы можем оказаться в новом состоянии, или пройти по прежнему состоянию. Но "мёртвого цикла" не будет в любом случае.

Автор:  Владимир Паронджанов [ Четверг, 02 Ноябрь, 2017 12:29 ]
Заголовок сообщения:  Re: Обсуждение раздела Сергея Ефанова из книги по языку ДРАК

Владимир Ситников писал(а):
Владимир Паронджанов писал(а):
Степан, как, по вашему мнению, надо исправить?

Очевидно, ветку после запуска таймера нужно не наверх вести, а просто дальше -- к развилке "A > 5мин".
Да, если есть сеть мы сбросим таймер и тут же проверим "а прошло ли 5 минут", но зато обратная стрелка будет одна.


Убрал одну обратную стрелку:
Вложение:
050. pimgpsh_fullsize_distr — копия.png
050. pimgpsh_fullsize_distr — копия.png [ 16.88 КБ | Просмотров: 13685 ]


Вот для сравнения две обратные стрелки:
Вложение:
050. pimgpsh_fullsize_distr.png
050. pimgpsh_fullsize_distr.png [ 11.37 КБ | Просмотров: 13685 ]


Что мы выиграли, убрав одну обратную стрелку?

Две стрелки хороши тем, что каждый из двух вложенных циклов становится простым.

С одной стрелкой вместо двух ПРОСТЫХ вложенных циклов появился один цикл, имеющий более СЛОЖНУЮ структуру.

Автор:  Владимир Ситников [ Четверг, 02 Ноябрь, 2017 13:28 ]
Заголовок сообщения:  Re: Обсуждение раздела Сергея Ефанова из книги по языку ДРАК

Владимир Паронджанов писал(а):
Убрал одну обратную стрелку:
Вложение:
050. pimgpsh_fullsize_distr — копия.png

Вообще говоря, я думал не так, в сначала объединить сброс таймера и развилку 220, и потом уже развилка, проверяющая настало ли время таймера.

Лучше вот почему:
1) Когда две ветки идут из одного места в одно и то же, то интуитивно появляется вопрос "а одной стрелки разве мало было?" или такой: "а вдруг они различаются, давайте найдём отличия"
2) По сути, тут один цикл, который называется "если выключилось и N минут не включалось, то выходим".
Поэтому, логично и в схеме видеть одну развилку, решающую нужно ли выходить из цикла.
Если цикл всего один, то смотришь, и видно, что условием выхода является "прошло 5 минут".
3) Визуально, если линия из сброса таймера идёт вниз, то сброс таймера стоит устойчиво. Если же линия заворачивает наверх, то сброс таймера как бы висит, что гораздо менее устойчиво.

Автор:  Степан Митькин [ Четверг, 02 Ноябрь, 2017 14:44 ]
Заголовок сообщения:  Re: Обсуждение раздела Сергея Ефанова из книги по языку ДРАК

Владимир Паронджанов писал(а):
Что мы выиграли, убрав одну обратную стрелку?

Убрать одну из стрелок недостаточно.
Требуется выделить скрытые состояния и сделать их явными.
Вот так:
Вложение:
20171102124103.png
20171102124103.png [ 75.38 КБ | Просмотров: 13661 ]

Или так. Вообще без стрелок:
Вложение:
20171102124108.png
20171102124108.png [ 85.74 КБ | Просмотров: 13661 ]

Автор:  Игорь Мазница [ Четверг, 02 Ноябрь, 2017 15:08 ]
Заголовок сообщения:  Re: Обсуждение раздела Сергея Ефанова из книги по языку ДРАК

а не напомнит ктонить, почему в ДРАКОНе нельзя "шинировать" переходы идущие в одну точку? как в электронных схемах скажем

Автор:  Степан Митькин [ Четверг, 02 Ноябрь, 2017 16:53 ]
Заголовок сообщения:  Re: Обсуждение раздела Сергея Ефанова из книги по языку ДРАК

Игорь Мазница писал(а):
а не напомнит ктонить, почему в ДРАКОНе нельзя "шинировать" переходы идущие в одну точку? как в электронных схемах скажем

Нарисуйте, что имеете в виду.

Автор:  Игорь Мазница [ Четверг, 02 Ноябрь, 2017 17:32 ]
Заголовок сообщения:  Re: Обсуждение раздела Сергея Ефанова из книги по языку ДРАК

Цитата:
Нарисуйте, что имеете в виду.

слева две стрелки, справа шина как на советских электронных схемах

Вложения:
Комментарий к файлу: шинирование нескольких переходов в одну точку
shinirovanie.png
shinirovanie.png [ 11.92 КБ | Просмотров: 13646 ]

Автор:  Степан Митькин [ Пятница, 03 Ноябрь, 2017 09:20 ]
Заголовок сообщения:  Re: Обсуждение раздела Сергея Ефанова из книги по языку ДРАК

Игорь Мазница писал(а):
слева две стрелки, справа шина как на советских электронных схемах

Так можно. Я такое видел в книгах В.Д. Паронджанова.

Автор:  Владимир Паронджанов [ Пятница, 03 Ноябрь, 2017 09:28 ]
Заголовок сообщения:  Re: Обсуждение раздела Сергея Ефанова из книги по языку ДРАК

Игорь Мазница писал(а):
Цитата:
Нарисуйте, что имеете в виду.

слева две стрелки, справа шина как на советских электронных схемах
Игорь, у вас есть лишний излом линии.

Этот излом исчезнет, если отросток вести не вправо, а вниз.
Имеется в виду отросток под правой иконой В = 0

Ну и конечно, "шину" не надо выделять жирным. Потому что она начинает конкурировать с шампуром.

Автор:  Владимир Паронджанов [ Пятница, 03 Ноябрь, 2017 09:43 ]
Заголовок сообщения:  Re: Обсуждение раздела Сергея Ефанова из книги по языку ДРАК

По поводу двух обратных стрелок

Рассмотрим схему, содержащую две обратных стрелки, КОНЦЫ КОТОРЫХ ИДУТ В ОДНУ ТОЧКУ (т.е. ОБЪЕДИНЕНЫ):

Вложение:
050. pimgpsh_fullsize_distr.png
050. pimgpsh_fullsize_distr.png [ 11.37 КБ | Просмотров: 13724 ]


Против двух обратных стрелок в этой схеме высказались все участники дискуссии:
LKom
Степан Митькин
Владимир Ситников
Игорь Мазница.
Я присоединился к мнению уважаемых участников.

Вывод

Нужно отказаться от двух обратных стрелок, объединить две линии и соединить их с одной обратной стрелкой (как показано ниже).

Вложение:
050. pimgpsh_fullsize_distr — копия.png
050. pimgpsh_fullsize_distr — копия.png [ 16.88 КБ | Просмотров: 13724 ]


==================================

Этот вывод не относится к другим случаям, где КОНЦЫ ОБРАТНЫХ СТРЕЛОК указывают на РАЗНЫЕ точки.
Например, две обратные стрелки в нижней схеме являются правильными и разрешенными:

Вложение:
Insertion sort variant 3.png
Insertion sort variant 3.png [ 120.26 КБ | Просмотров: 13723 ]

Страница 3 из 4 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/