yohhoyの日記(別館)

もうちょい長めの技術的メモをしていきたい日記

C++ MIX #5に参加しました

2019/9/4に開催されたイベント C++ MIX #5 にて、“20分くらいでわかった気分になれるC++20コルーチン” というタイトルで20分ほど話す機会をいただきました。(Boost.勉強会を含めると5年6ヶ月(!)ぶり3回目

感想とか

C++20導入予定のコルーチン機能について、C++プログラマの期待値とは異なるであろう実態説明を主題としました。C++標準仕様へのコルーチン導入議論は、古くは2012年*1~2013年*2頃から長い歴史が積み重ねられており、さまざまな議論があったうえでC++20では現行仕様におちつきました。C++プログラマが広くコルーチンを活用できるのは未来のお話(早くとも2023年以降)になりますが、まずはC++標準ライブラリのコルーチン対応を検討するための基礎固めを優先したのだと思われます。

C++20コルーチン対応は、仕様書の文面からのみではその全体像や利用方法を理解しづらい機能の部類と思います。また議論の歴史が長いぶん関連する提案文書が大量に残っており、最終的には採用されなかった対抗仕様や改善提案も多岐にわたるため、どれを追えばよいかも判別しづらくなっています。C++20コルーチンを使ってみようと思い立ったときに、本資料が最初の取っ掛かりとなるようであれば幸いです。

Twitter上での皆さんのコメントをみるに、スタックレス(Stackless)/スタックフル(Stackful)への関心が高かったように思います。C++20コルーチンは軽量だがユーザの自由度は低い “スタックレスコルーチン” であり、より使いやすい “スタックフルコルーチン” いわゆるファイバー(Fiber)はまだ検討段階*3にあります。現時点でスタックフルコルーチンを必要とするときは、Boost.Coroutine2Boost.Fiberなどの外部ライブラリ*4が候補となります。

提案文書

コルーチンに関連する提案文書を列挙してみました。あまりの数の多さに作業途中で後悔した('A`)

2012年

2013年

2014年

2015年

2016年

2017年

2018年

2019年

凡例:*印はPDF形式、★印は採択(Adopted)を表す

*1:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3328.pdf

*2:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3708.pdf

*3:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p0876r8.pdf

*4:両BoostライブラリのメンテナOliver Kowalke氏が、C++標準へのスタックフルコルーチン提案を行っています。