Coroutine を FSM コードへ変換したい

この辺ひどいよね!

id:melponコンパイルタイムCoroutineを作ったので近々公開予定だとか!

id:DigitalGhostさんがあらわれた - Faith and Brave - C++で遊ぼう

melponさんは、「俺、コンパイル時Coroutine書いたあるぜ」と豪語した

本の虫: 旅日記

めるぽんさんがmpl::stringで、Coroutineの機能を追加したコンパイルタイムC++コンパイラを一夜で作りあげた

ターヘル・アナトリア(東京見聞録)2 - デ-mk6


スタック切り替えの実装は、

  • ポータビリティが低い
    • 純粋に C++ だけで解決することができないため、環境毎にそれぞれの実装を書く必要がある
    • 自分の開発している環境用に実装を書こうとしても、その環境や職場ではアセンブラを使えない可能性がある
  • スタック領域がメモリを圧迫する
    • どれぐらい使うかは事前に分からないので比較的多めに取ったりとかするんだけど、そうすると1個の簡単な処理を行うコルーチンでもそれなりにメモリを消費するので、多く作るのを敬遠してしまう。もっと気軽にぽんぽんと作りたい。

といったことがあって Boost.Coroutine を使える機会が結構少ないので、まあコンパイルタイムなのはありえないとしても、プリプロセス段階で何かのツールに掛けて yield 使ったコードを C# みたいに FSM に変換して実装できたらなぁと考えています。


参考になりそうなのは

これかなぁ。
これを C++ で実装するだけでも難しそうだけど、C#Iterator Block が関数の中で yield しないといけないのに対して、C++ の Coroutine は self さえ渡せば関数を越えてどこでも yield できるというのが余計に難しそうな気がする。


まだまともに考えてないけど、これができれば少なくとも C++ が使える環境ならどこでも Coroutine が使えるようになるので、いつかやってみたいなー考えがあったり。というか誰か(id: さんとか id: さんとか)やってください。というかこんな需要があふれてそうな機能なんてもう誰か作ってるんじゃないの?という気も。