Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Клуб программистов > Свободное общение
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.10.2013, 20:14   #11
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

короче это подпрограмма, работающая по принципам dataflow.
Статью на вики писал какой-то наркоман

Цитата:
Все равно это превращение кода в спаггети. Если счас контекст программы дерево, то предлагается граф в результате разрыв мозга при командной работе - та самая причина по которой материли goto.
Не, с goto это никак не связано. Суть этого беспридела в том, что код выполняется не в том порядке, в котором он записан, а в том, в котором он может выполнится (т.е. процедура А+В может начать выполняться когда инициализированны переменные А и В). И все это тесно связано с неразрушающим присваиванием, функциональщиной (ну и dataflow, безусловно). За счет того, что код вот так вот выполняется, функция может несколько раз вернуть результат (ну это от языка зависит).

А вот про несколько точек входа я ниче не понял, имеются ввиду несколько точек, а выбор между ними выполнится через охраняющие выражения? (ну или типа того) - если да - то это все равно одна точка входа.
rrrFer вне форума Ответить с цитированием
Старый 19.10.2013, 00:12   #12
still_alive
Great Code Monkey
Форумчанин
 
Аватар для still_alive
 
Регистрация: 09.08.2007
Сообщений: 533
По умолчанию

Цитата:
Бейсиковский Gosub/return на новый лад. Поскольку прямые переходы не тру теперь будут рожать костыли и говорить что это круто.
Родите уже желание разбираться в чем-то для вас новом, и "костыли" перестанут быть таковыми.

Цитата:
Похоже кто-то не осилил стуктурное погромирование. А вот если второй раз вызвать - не вернется?
Очевидно же, что речь идет об ОДНОМ вызове.

Цитата:
Похоже на вандализм в википедии
Суть понял так:
Написано в вики хреново для понимания, но в целом верно.

Цитата:
То есть это раскладывается на ядра процессора?
Все равно это превращение кода в спаггети. Если счас контекст программы дерево, то предлагается граф в результате разрыв мозга при командной работе - та самая причина по которой материли goto.
Ничего не раскладывается. И где вы там графы узрели? Никакого спаггети нет. Фича удобная и применяется в том числе и для повышения читабельности кода.

Цитата:
код выполняется не в том порядке, в котором он записан, а в том, в котором он может выполнится
Честно, я долго думал, что же эта фраза означает. Но успеха так и не добился)

PS например задача
есть два бинарных дерева. При их post-order обходе мы собираем значения в листах. Нужно определить, будут ли равны собранные векторы значений.
Мой псевдокод:
цикл пока есть листы
вызвать корутину1, передать ей дерево1 - вернет значение в листе
вызвать корутину2, передать ей дерево2 - вернет значение в листе
если значения не равны - выходим

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

А теперь прошу всех противников корутин привести более читабельный код без них.
still_alive вне форума Ответить с цитированием
Старый 19.10.2013, 00:23   #13
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Чёрт, от начала создания темы, уже больше "века" прошло. Пытался найти в своих загашниках код, не помню где лежит. Пока голословно.
В приведённом примере, это "минимальный супервизор". В отличии от "настоящего" в нём не имеется привелигированного процесса, который и определяет всю работу "многозадачной" системы. В данном случае, нет создания кванта, как и его контроля.
Собственно, процесс, получивший доступ к супервизору, автоматически становится привелегированным.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 19.10.2013, 05:57   #14
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

цикл пока есть листы
вызвать процедуру1, передать ей дерево1 - вернет значение в листе
вызвать процедуру1, передать ей дерево2 - вернет значение в листе
если значения не равны - выходим
Код намного читабельней и понятней. Но на самом деле я бы не заморачивался сбором значений в лист, если требуется исключительно сравнение.
И задача тоже не понятна . Речь идет о листах по отношению к дереву или о листах по отношению к какому-либо узлу?

Цитата:
Фишка корутины - при каждом следующем вызове она продолжает выполняться с места, где остановилась, а значит при каждом следующем вызове будет возвращать значение в следующем листе дерева.
Это фишка ? Смысл? Цикл-то все равно остался. Что я по индексу явно получил элемент, что через foreach, что через map - где здесь место корутинам?
Цитата:
Родите уже желание разбираться в чем-то для вас новом, и "костыли" перестанут быть таковыми.
Я как раз увидел старое и забытое. Алгоритм который Вы привели - костыль, есть более простое и всем понятное решение.
Цитата:
И где вы там графы узрели?
Я так понял, что Вы и деревьев не увидели...
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика

Последний раз редактировалось Utkin; 19.10.2013 в 06:10.
Utkin вне форума Ответить с цитированием
Старый 19.10.2013, 11:55   #15
still_alive
Great Code Monkey
Форумчанин
 
Аватар для still_alive
 
Регистрация: 09.08.2007
Сообщений: 533
По умолчанию

Цитата:
Сообщение от Utkin Посмотреть сообщение
Код намного читабельней и понятней. Но на самом деле я бы не заморачивался сбором значений в лист, если требуется исключительно сравнение.
И задача тоже не понятна . Речь идет о листах по отношению к дереву или о листах по отношению к какому-либо узлу?
Я сейчас быстро погуглил и вот нашел описание задачи и код на плюсах, использующий корутины - можете даже кол-во кода и читаемость оценить. http://aldrin.co/coroutine-basics.html - прочитайте с места Same Fringe.

Цитата:
Сообщение от Utkin Посмотреть сообщение
Это фишка ? Смысл? Цикл-то все равно остался. Что я по индексу явно получил элемент, что через foreach, что через map - где здесь место корутинам?
Смысл в том, что используя корутины, я могу прекратить сравнение, как только какие-то значения не совпали. Без корутин код будет куда более извращенный и непонятный.

Цитата:
Сообщение от Utkin Посмотреть сообщение
Я как раз увидел старое и забытое. Алгоритм который Вы привели - костыль, есть более простое и всем понятное решение.
Многим и сами плюсы не понятны, это же не причина от них отказываться, не так ли?) Так где оно - более простое? Попробуйте его написать и сюда выложить, хотя бы псевдокод.

Последний раз редактировалось still_alive; 19.10.2013 в 11:57.
still_alive вне форума Ответить с цитированием
Старый 19.10.2013, 16:11   #16
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
http://aldrin.co/coroutine-basics.html - прочитайте с места Same Fringe.
Ок, гляну. Я в английском не силен, а здесь важно именно понимание мелочей.
Цитата:
Смысл в том, что используя корутины, я могу прекратить сравнение, как только какие-то значения не совпали. Без корутин код будет куда более извращенный и непонятный.
Цитата:
если значения не равны - выходим
По-моему понятней некуда.
Цитата:
Попробуйте его написать и сюда выложить, хотя бы псевдокод.
Ну я как бы переиначил Ваш псевдокод. С использованием одной процедуры (вслучае если листы элементарный тип данных, а не какие-нибудь экземпляры класса).
Ну повторю еще раз:
Цитата:
цикл пока есть листы
вызвать процедуру1, передать ей дерево1 - вернет значение в листе
вызвать процедуру1, передать ей дерево2 - вернет значение в листе
если значения не равны - выходим
Цитата:
Многим и сами плюсы не понятны, это же не причина от них отказываться, не так ли?)
Именно, самая первая причина чтобы отказаться. Если хоты бы одному участнику проекта не ясно как это работает, то проект на 100 процентов выйдет за сроки (ну естественно чем важней разработчик, тем дольше времени будет затрачено сверхплана). Одним из пунктов при выборе инструмента является его понятность (его знание, умение им пользоваться). Если человек не разбирается в Делфи, но знает с++, то либо он должен выучить делфи до начала проекта либо писать на с++. Это же очевидно.


ЗЫ. По коду из примера там нет описания узла, вероятно оно берется из какой-то стандартной библиотеки. Я ведь не зря просил уточнить задачу. Почему, потому что работал над некоторыми вопросами связанными с деревьями. В своем проекте мои узлы хранятся в едином динамическом массиве и имеют сведения о родительском узле и корневом узле (родоначальнике дерева). И если задача стоит сравнить листы (а я ведь про это тоже спрашивал), то задача становится тривиальной с помощью цикла и условий.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика

Последний раз редактировалось Utkin; 19.10.2013 в 16:21.
Utkin вне форума Ответить с цитированием
Старый 19.10.2013, 17:21   #17
still_alive
Great Code Monkey
Форумчанин
 
Аватар для still_alive
 
Регистрация: 09.08.2007
Сообщений: 533
По умолчанию

Цитата:
Сообщение от Utkin Посмотреть сообщение
Именно, самая первая причина чтобы отказаться. Если хоты бы одному участнику проекта не ясно как это работает, то проект на 100 процентов выйдет за сроки (ну естественно чем важней разработчик, тем дольше времени будет затрачено сверхплана). Одним из пунктов при выборе инструмента является его понятность (его знание, умение им пользоваться). Если человек не разбирается в Делфи, но знает с++, то либо он должен выучить делфи до начала проекта либо писать на с++. Это же очевидно.
Так мы сейчас не говорим о конкретных людях и конкретных проектах, мы говорим о самой концепции корутин.

Цитата:
Сообщение от Utkin Посмотреть сообщение
ЗЫ. По коду из примера там нет описания узла, вероятно оно берется из какой-то стандартной библиотеки. Я ведь не зря просил уточнить задачу. Почему, потому что работал над некоторыми вопросами связанными с деревьями. В своем проекте мои узлы хранятся в едином динамическом массиве и имеют сведения о родительском узле и корневом узле (родоначальнике дерева). И если задача стоит сравнить листы (а я ведь про это тоже спрашивал), то задача становится тривиальной с помощью цикла и условий.
Не совсем понял, чем представление дерева в виде массива сильно помогает. У вас же в нем все равно листы не идут подряд так же, как в постфиксном порядке обхода? Нам нужно что-то типа лексикографического сравнения, а не простого сравнения множеств.
still_alive вне форума Ответить с цитированием
Старый 19.10.2013, 20:51   #18
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
мы говорим о самой концепции корутин.
Если концепция не прозрачна, то нет смысла её использовать. Это как Хаскел - круть неимоверная, но все пишут на каких-то отсталых делфях, с++, явах и сишарпах. И чего всем на Хаскеле не пишется ?
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 20.10.2013, 22:53   #19
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Непрозрачную концепцию можно один раз засунуть в библиотеки и потом использовать через пару слоёв абстракции, как это случилось с greenlet — на его основе написали gevent, который используется в gUnicorn (веб-сервер, умеющий в том числе работать асинхронно, у меня на нём сайт крутится )
пыщь
JTG вне форума Ответить с цитированием
Старый 21.10.2013, 07:54   #20
the_deer_one
Участник клуба
 
Аватар для the_deer_one
 
Регистрация: 04.04.2010
Сообщений: 1,554
По умолчанию

JTG ага, и в юнити эта штука используется.
http://www.altdevblogaday.com/2011/0...nes-in-detail/

Вообщем эмуляция многопоточности, без использования тяжеленных непредсказуемых тредов.
the_deer_one вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц