Re: Сопрограммы
От: a_jelly Россия  
Дата: 04.06.12 13:43
Оценка: 2 (1)
Здравствуйте, x-code, Вы писали:

XC>Есть две функции, которые могут где-то сохранять свое состояние и передавать друг другу управление напрямую, без вызова функции. Оператор yield делает нечто, что сохраняет состояние первой функции, переключается на вторую и восстанавливает состояние второй. Желательно, чтобы это нечто было достаточно низкоуровневым и эффективным, с тем чтобы данный оператор можно было применять где угодно, в том числе при программировании embedded софта и т.п. То есть никаких фреймворков нет, есть как-бы "голый си" (некий разрабатываемый си-подобный язык).


XC>Интересно, как можно такую фичу грамотно спроектировать при разработке собственного языка программирования?

XC>Какие требования, ограничения к сопрограммам должны предъявляться? Любые ли две функции можно сделать сопрограммами, или только удовлетворяющие какому-то общему требованию?

XC>В общем, любые мысли приветствуются.


Лучшая низкоуровневая реализация сопрограмм (правда, только для x86) которую я видел (libconcurrent), написана каким-то японцем. В принципе, глядя на нее можно многое понять, тем более, что там нет завязок на setjump/longjump и setcontext/getcontext. Работает достаточно быстро.

Некоторые ограничения на сопрограммы довольно очевидны — например, не стоит включать в контекст указатели на переменные стека. Могут возникнуть какие-то сложности с многопоточными программами (т.е. надо не запутаться между стеком thread-а и стектом coroutine). Еще может возникнуть противоречие между механизмом исключений и сопрограммами, т.к. они используют похожие методы. В общем — проблем хватает.

Теоретический аспект Coroutine хорошо описан Роберто нашим, Иерусалимским вот в этой статье.

Как-то так.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.