|
|
|
Тяпничная со-программа
|
|||
|---|---|---|---|
|
#18+
Добрый день коллеги. С пятницей. Я долго думал куда поместить этот сабж. В С++, Java или программинг. И решил все таки здесь т.к. тема достаточно общая и о ней стоит говорить сразу в контексте многих языков. Тема - со-программами или co-routines Я квотирую определение с вики чтоб было понятно wikiСопрограмма (англ. coroutine) — компонент программы, обобщающий понятие подпрограммы, который дополнительно поддерживает множество входных точек (а не одну как подпрограмма), остановку и продолжение выполнения с сохранением определённого положения. Сопрограммы являются более гибкими и обобщёнными, чем подпрограммы, но реже используются на практике. Применение сопрограмм являлось методикой ещё ассемблера, практиковалось лишь в некоторых высокоуровневых языках (Simula, Modula-2). Сопрограммы хорошо пригодны для реализации многих похожих компонентов программ (итераторов, бесконечных списков, каналов, совместных задач). Под катом - мотивация сабжа для меня. Год назад я пытался нарисовать картинку Тяпничная география - распределение Ipv4 адресов по странам и отображение этого на диаграмме в виде цветных квадратов. Это была не бизнес разработка и чуть позже она мне надоела и я ее отложил. Для рисования квадратов я кодил заполняющую кривую Гилберта. И резальтатом разработок была экспериментальная консольная тулза https://sourceforge.net/p/countryipdiagram/code/HEAD/tree/trunk/utils/src/gilbertroute.c которая должна быть генератором координат Гилберта. Сами коды выводились в stdout для передачи в другую утилиту. Но работать с pipeline-ом процессов неудобно. Мне нужна была генерализация алгоритма в виде шаблона алгорима чтоб я мог его подставлять в любой код. В чем была сложность? В рекурсивности самого алгоритма. Как вы знаете, писать рекурсивный итератор - довольно неудобно. Нужно либо создать конечный автомат со стеком и работать с ним. (Это нетривиально и чревато ошибками). Кроме того большинство стандартных алгоритмов доступных в сорцах уже изначально написаны под рекурсию и их удобно заимствовать в том виде как есть без всяких приседаний и переписываний. Второй вариант - использовать механизмы очередей (на базе BlockingQueue в Java к примеру) для того чтобы иммитировать поведение итератора с рекурсией. Способ оригинальный. Но есть недостаток. Мы вводим еще один вычислительный поток в задачу которая по сути является однопоточной. Отсюда автоматом - структуры данных которым нужна синхронизация (BlockingQueue) и накладные. Вобщем нужен гладкий и удобный механизм разворачивания рекурсивных функций в генераторы. Вобщем как обстоят дела с со-программами (co-routines) в С/С++/C#/Java/Groovy/Scala/JavaScript/Delphi. Прошу прощения если я не упомянул ваш любимый язык X. Я просто не успел просмотреть обзоры фичей всех ваших языков. Я вот сделал некоторую табличку в которой попробовал обрисовать положение вещей на текущий момент Поддержка со-программ в ЯП LanguageCo-routines supportCno supportС++Возможно с поддержкой boost::coroutinesC#with yield returnJavano suportGroovy?Scalawith yieldDelphino supportJava Script Since ECMA6 В многочисленных статьях также упоминается что для поддежки co-routines язык или среда должен поддерживать continuations. Вот такая ситуация. У кого какие были практики с coroutines? Поделитесь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2016, 15:17 |
|
||
|
Тяпничная со-программа
|
|||
|---|---|---|---|
|
#18+
Было бы круто, если бы был полностью рабочий локализованный пример, который использует сопрограммы или который не использует, но при их наличии был бы намного понятнее/быстрее, на любом из упомянутых языков на онлайн компиляторе: http://ideone.com/ Так было бы намного наглядней. Пока что ни разу не встречал такого примера. Либо примеры все усложняют, либо упрощают, но используют какие-то гипотетические сторонние функции, которые почему-то не могут сохранить свое текущее состояние: ни в передаваемую структуру, ни в объект членом которого они являются, ни в стороннюю структуру куда можно обратиться по хэндлеру. Нафига выходить по yield, выходи по return, а текущее состояние всех итераторов храни как члены класса, сохранятся в объекте. Если просто хочется распараллеливания, то используй потоки, выходи по yield(), и используй потокобезопасный обмен - ровно теже сопрограммы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2016, 16:46 |
|
||
|
Тяпничная со-программа
|
|||
|---|---|---|---|
|
#18+
maytonУ кого какие были практики с coroutines? Поделитесь. Используем в продакшене Boost.Coroutine (для асинхронных операций). Код на порядок проще и понятнее, чем с колбэками. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2016, 17:01 |
|
||
|
Тяпничная со-программа
|
|||
|---|---|---|---|
|
#18+
mayton, а goto отменили что ли уже? как то давно, когда студентом был, делал нитевую многопоточность на TurboPascal-е, в общем-то такую вещь там можно было реализовать. каналы как абстракция делаются в любом из языков поддерживающих генерики или метапрограммирование, зачем для этого делать языковые конструкции? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2016, 17:04 |
|
||
|
Тяпничная со-программа
|
|||
|---|---|---|---|
|
#18+
Вася УткинНафига выходить по yield, выходи по return, а текущее состояние всех итераторов храни как члены класса, сохранятся в объекте. Так написал же человек - не хочет он явно хранить состояние, когда алгоритмически никакого состояния нет. Т.е. то что вы предлагаете, это усложнение алгоритма. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2016, 17:04 |
|
||
|
Тяпничная со-программа
|
|||
|---|---|---|---|
|
#18+
Я щас сходу не готов дать охватывающий пример. У меня щас нет такого под рукой. Но я могу привести контр-пример. Возьмите любую древовидную структуру данных. Или графовую. И сделайте по ней алгоритм итератора. Обеспечте интерфейс который обходит все узлы: Код: plaintext 1. 2. 3. 4. Это и есть контр пример. Тоесть пример того как кодить неудобно. Без использования уступчивого return, мультипоточности и contnuations. Это моё ИМХО. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2016, 17:04 |
|
||
|
Тяпничная со-программа
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)mayton, а goto отменили что ли уже? как то давно, когда студентом был, делал нитевую многопоточность на TurboPascal-е, в общем-то такую вещь там можно было реализовать. каналы как абстракция делаются в любом из языков поддерживающих генерики или метапрограммирование, зачем для этого делать языковые конструкции? Ну... я готов покорректировать табличку. Наверное в Турбо-Паскале есть языковый API для работы с каналами. Я этого не знал. Приведите пример плиз. Буду признателен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2016, 17:12 |
|
||
|
Тяпничная со-программа
|
|||
|---|---|---|---|
|
#18+
maytonНу... я готов покорректировать табличку. Наверное в Турбо-Паскале есть языковый API для работы с каналами. Я этого не знал. языковых конструкций нету, я же говорю делал нитевидную многозадачность под досом выделялась память под стэк и проца yield, которая меняла регистр SP на доступные стэки. Сомневаюсь что так можно под виндой сделать, хотя попробовать не мешает ... а каналы генериками в Delphi, fpc делаются довольно легко ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2016, 17:45 |
|
||
|
Тяпничная со-программа
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)а каналы генериками в Delphi, fpc делаются довольно легко Но это language features? Или нет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2016, 17:48 |
|
||
|
Тяпничная со-программа
|
|||
|---|---|---|---|
|
#18+
maytonЯ щас сходу не готов дать охватывающий пример. У меня щас нет такого под рукой. Но я могу привести контр-пример. Возьмите любую древовидную структуру данных. Или графовую. И сделайте по ней алгоритм итератора. Обеспечте интерфейс который обходит все узлы: Код: plaintext 1. 2. 3. 4. Это и есть контр пример. Тоесть пример того как кодить неудобно. Без использования уступчивого return, мультипоточности и contnuations. Это моё ИМХО. а в чем проблема указатели в стэке сохранить? Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2016, 17:51 |
|
||
|
Тяпничная со-программа
|
|||
|---|---|---|---|
|
#18+
maytonkealon(Ruslan)а каналы генериками в Delphi, fpc делаются довольно легко Но это language features? Или нет? это скорее language-oldest, зачем это делать если либами можно сделать? да и с ОС проблемы, она просто так стэковые регистры менять не даёт ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2016, 17:55 |
|
||
|
Тяпничная со-программа
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan) Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Эээ... надо подумать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2016, 18:09 |
|
||
|
Тяпничная со-программа
|
|||
|---|---|---|---|
|
#18+
yield в C# это тема, правда я в нее еще не вникал глубоко. Тут фундаментально меняется подход, ты получаешь на вход интерфейс, который будет (будет в будущем) возвращать тебе последовательность, дальше можно его передать на вход следующей функции и т.д. Это и есть основа LINQ. И в итоге это выглядит так, например найти первое число в массиве между 1-10 Код: c# 1. и тут перебор будет именно до первого удовлетворяющего условию. Синтаксический сахар конечно, но сахар он на то и нужен чтобы сладко было. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2016, 20:14 |
|
||
|
Тяпничная со-программа
|
|||
|---|---|---|---|
|
#18+
Dima T, это пример вырожденный. Его легко итерациями сделать. А вот задачка обхода деревьев как функция которая возвращает узлы - это красиво. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2016, 20:38 |
|
||
|
Тяпничная со-программа
|
|||
|---|---|---|---|
|
#18+
maytonDima T, это пример вырожденный. Его легко итерациями сделать. Я не спорю, я же написал что это синтаксический сахар, но я не люблю С/С++ именно за то что обязательно надо это делать, т.е. писать кучу букав, потом отлаживать, а тут написал одну строчку и получил что хотел. Мне не нравится С именно поэтому, т.к. для элементарного действия надо написать портянку на два экрана, когда в высокоуровневом ЯП это одна строка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2016, 20:52 |
|
||
|
Тяпничная со-программа
|
|||
|---|---|---|---|
|
#18+
Дима. 1) Я понял. Я думаю что ближайшие лет 10 основной темой споров будут доводы за и против лямбд и Stram-операций в обычных ЯП. У меня отношения к лямбдам весьма сдержанное. Тоесть я сперва хочу понять pitfalls в части их практического использования (Java) как то отладка, области видимости (лямбда не видит не статичные переменные класса), и обработка исключений внутри лямбд (куда мы вываливаемся?) и конечно-же перформанс. Но эта тема другого топика. 2) Я вернусь к своим баранам. А именно к coroutine. Разворачивая рекурсию в С-программе которую я привел выше я пришел к следующему итератору. В нем полезным по сути является копи-паста С-программы а именно рекурсивная процедура обхода квадрата по Гилберту. Остальное - шлак. Все эти обвязки, потоки и Блокирующая очередь - просто служебные тулзы которые я притянул за уши только чтобы достать координаты пикселов. Есть также странные хардкоденные константы типа Position.Dummy смысл которых - уведомить итератор о том что очередь завершена и больше данных ждать не стоит. Вобщем много всякой фигни. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. Меня это обескураживает и я ищу простые лаконичные механизмы не жрущие списки памяти и в то-же время выдающие сиквенс значений из рекурсии. Напомню о проблеме. Мне надо было заполнить пикселами картинку в порядке кривой Гилберта. Но я не хотел хардкорное решение. Мне нужны были компоненты которые "чертят" спирали, Z-кривые, змейки и кривые Гилберта и Пеано. И пока у меня не было такой компоненты сам кодинг плаката с IP-диаграммой мне был не интересен. И мне нужен был механизм переключений между этими "чертилками". 3) По поводу Streams (Java8). Я надеюсь они мне позволят заменить со-программы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2016, 21:17 |
|
||
|
Тяпничная со-программа
|
|||
|---|---|---|---|
|
#18+
maytonМеня это обескураживает и я ищу простые лаконичные механизмы не жрущие списки памяти и в то-же время выдающие сиквенс значений из рекурсии. рекурсия это и есть список памяти, ты просто фактически не хочешь о нём заботиться сам Рекурсия кстати процентов на 20-30 медленнее (за счёт сохранения всех данных). Чем стэковый автомат в уже выделенном блоке. За простоту кода приходится платить ресурсами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2016, 23:08 |
|
||
|
Тяпничная со-программа
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)рекурсия это и есть список памяти, ты просто фактически не хочешь о нём заботиться сам Рекурсия кстати процентов на 20-30 медленнее (за счёт сохранения всех данных). Чем стэковый автомат в уже выделенном блоке. За простоту кода приходится платить ресурсами. Очень часто мы (разработчики) согласны платить 20-30% (здесь я сомневаюсь надо пересчитать) но при этом иметь простой концептуальный код. Если yield return несет в себе нулевые накладные расходы (синхронизации нет, нет потоков, IPC, и очередей) то я согласен и я хочу использовать этот return в противоположность разворачиванию рекусии в конечный автомат. Заметьте что мы с вами еще не рассматривали оценку сложности этого процесса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2016, 23:20 |
|
||
|
Тяпничная со-программа
|
|||
|---|---|---|---|
|
#18+
Я имею в виду оценку сложности процесса переписывания рекурсии в автомат со стеком. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2016, 23:22 |
|
||
|
Тяпничная со-программа
|
|||
|---|---|---|---|
|
#18+
maytonЕсли yield return несет в себе нулевые накладные расходы (синхронизации нет, нет потоков, IPC, и очередей) то я согласен и я хочу использовать этот return в противоположность разворачиванию рекусии в конечный автомат. несёт, для них нужен отдельный блок стэка, сколько его выделить 100кб, 1Мб или больше? траты на yield в общем случае : все регистры, связка pushad-popad довольно быстрая, но не бесплатная операция. это мы ещё не вспоминаем про регистры fpu maytonЗаметтье что мы с вами еще не рассматривали оценку сложности этого процесса. есть ещё вариант: если в функциональном стиле написать алгоритм, то его можно довольно просто механически разложить через комбинаторы в "автомат со стэковой памятью" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2016, 23:39 |
|
||
|
Тяпничная со-программа
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan), спасибо. Но я не специалист в FreePascal. Вряд-ли я могу собрать это. А вот по поводу комбинаторов и автоматов со стеком - подкинь материала. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2016, 15:09 |
|
||
|
Тяпничная со-программа
|
|||
|---|---|---|---|
|
#18+
maytonkealon(Ruslan), спасибо. Но я не специалист в FreePascal. Вряд-ли я могу собрать это. А вот по поводу комбинаторов и автоматов со стеком - подкинь материала. тут надо подумать, знаю что можно, но вот где и когда читал - подзабыл ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2016, 15:32 |
|
||
|
Тяпничная со-программа
|
|||
|---|---|---|---|
|
#18+
авторподдерживает множество входных точек (а не одну как подпрограмма), остановку и продолжение выполнения с сохранением определённого положения. ... Применение сопрограмм .....практиковалось лишь в некоторых высокоуровневых языках (Simula, Modula-2) по моему брехня. точки входа в подпрограмму были чуть ли не везде (пл-1 и алгол), а продолжать выполнение с сохранением определенного положения -- можно благодаря static ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2016, 08:14 |
|
||
|
Тяпничная со-программа
|
|||
|---|---|---|---|
|
#18+
tchingizточки входа в подпрограмму были чуть ли не везде (пл-1 и алгол), а продолжать выполнение с сохранением определенного положения -- можно благодаря static Fullstack CoRoutines на основе одной переменной в общем виде повторить не получится смотри пример с обходом бинарного дерева рекурсию всё равно с помощью стэка придётся делать в том или ином виде ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2016, 11:59 |
|
||
|
Тяпничная со-программа
|
|||
|---|---|---|---|
|
#18+
а с двумя переменными? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2016, 12:34 |
|
||
|
Тяпничная со-программа
|
|||
|---|---|---|---|
|
#18+
tchingizа с двумя переменными? с конечным числом переменных в общем виде - никак ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2016, 14:14 |
|
||
|
Тяпничная со-программа
|
|||
|---|---|---|---|
|
#18+
Видел поддержку сопрограмм в спецификации на С-- (которая в виде pdf). Я так понял, что вся эта чехарда была только для того, чтобы Глазго Хаскель компилятор мог эффективно реализовать ФП. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2016, 18:35 |
|
||
|
Тяпничная со-программа
|
|||
|---|---|---|---|
|
#18+
Ну и вроде бы потом GHC перешел на LLVM, значит и там подобное есть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2016, 18:37 |
|
||
|
Тяпничная со-программа
|
|||
|---|---|---|---|
|
#18+
Siemargl, не, хаскелю вообще по барабану, в LLVM для них уже добавили какую-то свою модель вызова им и так хватает http://www.gamedev.ru/flame/forum/?id=184103 Скорее всего для того, что-бы вручную не писать конечные автоматы, ибо низкоуровневая конструкция или возможно за go гонятся, для эффективной реализации. геморно как-то на ассемблере переключатель писать, почти под каждую систему свой ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2016, 19:07 |
|
||
|
Тяпничная со-программа
|
|||
|---|---|---|---|
|
#18+
Экспромтом. Если бы C++ поддерживал goto c динамической меткой, то со-программа с множественным входами могла бы выглядеть так: DemoFunc( params ..., Метка ) { goto Метка; Start1: ... ... Start2: ... ... StartXX: ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2016, 19:37 |
|
||
|
Тяпничная со-программа
|
|||
|---|---|---|---|
|
#18+
Владимир2012Экспромтом. Если бы C++ поддерживал goto c динамической меткой, то со-программа с множественным входами могла бы выглядеть так: DemoFunc( params ..., Метка ) { goto Метка; Start1: ... ... Start2: ... ... StartXX:о боже Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2016, 22:23 |
|
||
|
Тяпничная со-программа
|
|||
|---|---|---|---|
|
#18+
egorychо боже Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. Ужас! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2016, 22:38 |
|
||
|
Тяпничная со-программа
|
|||
|---|---|---|---|
|
#18+
Владимир2012Ужас!ты ведь сам этого хотел, товарищ )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2016, 00:00 |
|
||
|
Тяпничная со-программа
|
|||
|---|---|---|---|
|
#18+
Пора реализовывать рекурсивный итератор. Пробую на Scala... под катом - эксперименты. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2016, 00:52 |
|
||
|
Тяпничная со-программа
|
|||
|---|---|---|---|
|
#18+
КМК это не совсем то что я хотел. Код: java 1. 2. 3. 4. 5. 6. 7. Настораживает наличие вызова .sort(). Если это генерация списка с сортировкой то я это и так могу сделать в С++/Java но весь цимес в том что я не хочу нигде хранить никаких списков. Мне нужен генератор который выдает самый первый элемент настолько быстро, насколько это возможно. Без промежуточных переливаний в массивы или списки. Мне нужен Stream. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2016, 09:45 |
|
||
|
Тяпничная со-программа
|
|||
|---|---|---|---|
|
#18+
egorychты ведь сам этого хотел, товарищ )) ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2016, 12:32 |
|
||
|
Тяпничная со-программа
|
|||
|---|---|---|---|
|
#18+
Зачем тебе для этой задачи сопрограммы, если достаточно ленивых списков? Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2016, 14:53 |
|
||
|
Тяпничная со-программа
|
|||
|---|---|---|---|
|
#18+
fixxer, жесть, а в какой последовательности всё это вычисляется? точно "лениво"? проще CreateFiber и SwitchToFiber использовать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2016, 16:27 |
|
||
|
Тяпничная со-программа
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)fixxer, жесть, а в какой последовательности всё это вычисляется? точно "лениво"? В той последовательности как написано, да, точно лениво. #::: оператор конкатенации ленивых списков, #:: оператор присоединения головы к списку. Оба оператора правоассоциативны. То есть читать так: Код: sql 1. Правая часть не вычислится пока не попросишь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2016, 17:53 |
|
||
|
Тяпничная со-программа
|
|||
|---|---|---|---|
|
#18+
fixxer, ну ... я-бы не стал противопоставлять один термин другому. Если вы хотите называть это ленивым списком - я не против. Я просто начал свои копания с уступчивого return и пришел к постановке вопроса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2016, 18:29 |
|
||
|
Тяпничная со-программа
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)fixxer, жесть, а в какой последовательности всё это вычисляется? точно "лениво"? проще CreateFiber и SwitchToFiber использовать Я-бы не хотел не акцентировать внимание на Windows API. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2016, 18:33 |
|
||
|
Тяпничная со-программа
|
|||
|---|---|---|---|
|
#18+
maytonЯ-бы не хотел не акцентировать внимание на Windows API. ну тогда для С++ только буст, собственно он под виндой, наверное, и использует fiber-ы на асемблере писать под все архитектуры и ОС тоже не очень ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2016, 18:39 |
|
||
|
Тяпничная со-программа
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)maytonЯ-бы не хотел не акцентировать внимание на Windows API. ну тогда для С++ только буст, собственно он под виндой, наверное, и использует fiber-ы на асемблере писать под все архитектуры и ОС тоже не очень Было-бы неплохо чтобы господин СтраусТруп подумал в этом направлении. Если такое реализовать невозможно в рамках language (вовлечение сущностей уровня kernel API в язык) то хотелось-бы видеть Note #... где такой вопрос хотя-бы рассматривался. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2016, 18:44 |
|
||
|
Тяпничная со-программа
|
|||
|---|---|---|---|
|
#18+
fixxerПравая часть не вычислится пока не попросишь. Спасибо. Я попробую ваш пример сегодня. Может это и будет мое решение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2016, 18:45 |
|
||
|
Тяпничная со-программа
|
|||
|---|---|---|---|
|
#18+
mayton, ну собственно как-то как показал fixxer и разлагается любая рекурсия 1. нанизывается последовательность действий https://habrahabr.ru/post/153383/ 2. в компиляторе разлагается на комбинаторы, тут прямых линков дать не могу собственно в данном случае используются комбинатор пары \x.y.f = f x y и Y-комбинатор (комбинатор неподвижной точки) http://ru.wikibooks.nym.su/wiki/Комбинаторы_—_это_просто! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2016, 18:53 |
|
||
|
Тяпничная со-программа
|
|||
|---|---|---|---|
|
#18+
maytonБыло-бы неплохо чтобы господин СтраусТруп подумал в этом направлении. Если такое реализовать невозможно в рамках language (вовлечение сущностей уровня kernel API в язык) то хотелось-бы видеть Note #... где такой вопрос хотя-бы рассматривался. Ну почему, с определёнными ограничениями можно, я же написал без прямой поддержки ОС (в Win64 только с исключениями глючит, но это просто я плохо знаю Win64 на уровне асма и материалов толковых нет как по Win32). Мне fiber не нравится тем, что он сам память выделяет и swich у него замудрёный - MS, как всегда, простую вещь сделала через одно место. PS: try-finally-except тоже в каждой ОС по разному реализуется, ничего - сделали же ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2016, 19:05 |
|
||
|
Тяпничная со-программа
|
|||
|---|---|---|---|
|
#18+
maytonkealon(Ruslan)пропущено... ну тогда для С++ только буст, собственно он под виндой, наверное, и использует fiber-ы на асемблере писать под все архитектуры и ОС тоже не очень Было-бы неплохо чтобы господин СтраусТруп подумал в этом направлении. Если такое реализовать невозможно в рамках language (вовлечение сущностей уровня kernel API в язык) то хотелось-бы видеть Note #... где такой вопрос хотя-бы рассматривался. Да полно: v1 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3650.pdf v1+ https://isocpp.org/files/papers/N3722.pdf v2 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4134.pdf v4 https://isocpp.org/files/papers/N4402.pdf Эксперементальная реализация в MSVS 2015 - кстати, с короткими понятными примерами: https://blogs.msdn.microsoft.com/vcblog/2014/11/12/resumable-functions-in-c/ #include <experimental/resumable> ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2016, 21:00 |
|
||
|
Тяпничная со-программа
|
|||
|---|---|---|---|
|
#18+
Вася Уткин, спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2016, 21:05 |
|
||
|
Тяпничная со-программа
|
|||
|---|---|---|---|
|
#18+
С примером fixxer сегодня не успвеваю. Но вот пока есть порт с С на Scala. Здесь yield return был-бы удобен тем что ничего кардинально переписывать не нужно. Почти любой алгоритм существует в классическом императивном (а не списковом) виде и мне как человеку достаточно ленивому можно было-бы в идеале сделать косметический реплейсмент. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2016, 21:12 |
|
||
|
Тяпничная со-программа
|
|||
|---|---|---|---|
|
#18+
maytonПоддержка со-программ в ЯП LanguageCo-routines supportCno support Для C есть Portable Coroutine Library (PCL) А ещё в C возможен такой трюк (для меня это было открытием). kealon(Ruslan)языковых конструкций нету, я же говорю делал нитевидную многозадачность под досом выделялась память под стэк и проца yield, которая меняла регистр SP на доступные стэки. Сомневаюсь что так можно под виндой сделать, хотя попробовать не мешает ...Только что проверил под Linux (gcc x86). Внутри функции ассемблерной вставкой можно запросто поменять значение esp, поставив его на буфер, выделенный malloc'ом. Причём, функция после этого продолжает видеть свои параметры, и нормально завершается по return. Теперь добавить куда-нибудь в начало longjmp, в точках yield return вставить setjmp, и задача почти решена... кажется, так оно и сделано в PCL. Только там ассемблерных вставок нет, но есть хакерские манипуляции с jmp_buf. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.08.2016, 13:53 |
|
||
|
Тяпничная со-программа
|
|||
|---|---|---|---|
|
#18+
Serg_77m, это мегакруто. PCL. Но КМК это левел библиотеки а не языка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.08.2016, 17:23 |
|
||
|
Тяпничная со-программа
|
|||
|---|---|---|---|
|
#18+
Serg_77mТолько что проверил под Linux (gcc x86). Внутри функции ассемблерной вставкой можно запросто поменять значение esp, поставив его на буфер, выделенный malloc'ом. Причём, функция после этого продолжает видеть свои параметры, и нормально завершается по return. Теперь добавить куда-нибудь в начало longjmp, в точках yield return вставить setjmp, и задача почти решена... кажется, так оно и сделано в PCL. Только там ассемблерных вставок нет, но есть хакерские манипуляции с jmp_buf. Оптимизацию включи. Оптимизм то и выключится ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.08.2016, 23:17 |
|
||
|
|

start [/forum/topic.php?all=1&fid=16&tid=1340627]: |
0ms |
get settings: |
6ms |
get forum list: |
16ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
122ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
63ms |
get tp. blocked users: |
1ms |
| others: | 248ms |
| total: | 469ms |

| 0 / 0 |
