Здравствуйте, x-code, Вы писали:
XC>Есть две функции, которые могут где-то сохранять свое состояние и передавать друг другу управление напрямую, без вызова функции. Оператор yield делает нечто, что сохраняет состояние первой функции, переключается на вторую и восстанавливает состояние второй. Желательно, чтобы это нечто было достаточно низкоуровневым и эффективным, с тем чтобы данный оператор можно было применять где угодно, в том числе при программировании embedded софта и т.п. То есть никаких фреймворков нет, есть как-бы "голый си" (некий разрабатываемый си-подобный язык).
XC>Интересно, как можно такую фичу грамотно спроектировать при разработке собственного языка программирования?
XC>Какие требования, ограничения к сопрограммам должны предъявляться? Любые ли две функции можно сделать сопрограммами, или только удовлетворяющие какому-то общему требованию?
XC>В общем, любые мысли приветствуются.
Лучшая низкоуровневая реализация сопрограмм (правда, только для x86) которую я видел (libconcurrent), написана
каким-то японцем. В принципе, глядя на нее можно многое понять, тем более, что там нет завязок на setjump/longjump и setcontext/getcontext. Работает достаточно быстро.
Некоторые ограничения на сопрограммы довольно очевидны — например, не стоит включать в контекст указатели на переменные стека. Могут возникнуть какие-то сложности с многопоточными программами (т.е. надо не запутаться между стеком thread-а и стектом coroutine). Еще может возникнуть противоречие между механизмом исключений и сопрограммами, т.к. они используют похожие методы. В общем — проблем хватает.
Теоретический аспект Coroutine хорошо описан Роберто нашим, Иерусалимским вот в
этой статье.
Как-то так.