2016-01-31 13 views
6

コルーチン(C++ 1zの最新のドラフト)は、なぜライブラリ拡張ではなく、コア言語機能(ファンシーなキーワードなど)として実装されるのでしょうか?C++ 1z言語機能にコルーチンを使用していますか?

すでにいくつかの実装(Boost.Coroutineなど)がありますが、そのうちのいくつかはプラットフォームから独立している可能性があります。なぜ委員会はそれをコア言語そのものに焼き付けることにしたのですか?

Bjarne Stroustrup氏自身が、コア言語に触れるのではなく、できる限りライブラリーで新しい機能を実装する必要があると話しました(これ以上は分かりません)。

そうするべき十分な理由はありますか?メリットは何ですか?

+3

コルーチンがどのように機能し、同じセマンティクスを提供しているかは分かりませんが、コルーチンはライブラリ機能よりもはるかに効率的に言語機能として実装できると私は推測しています。また、コルーチンが実際には標準のC++だけを使って実際に実装できるかどうかはわかりません。 – MikeMB

+0

@MikeMB:すべてのアカウントを修正します。 – ildjarn

+1

別の理由は、それが言語の一部としてより良い方法である可能性があります(特殊なヘッダーを含めるか、特殊な型を関数のパラメータとして渡す必要はありません)。 – CoffeeandCode

答えて

7

コルーチンのライブラリ実装がありますが、これらには特定の制限があります。例えば、ライブラリ実装は、コルーチンが中断されたときにどの変数を維持する必要があるかを検出することはできません。例えば、使用された変数を何らかの形で明示的にすることによって、この必要性を回避することが可能である。しかし、コルーチンが通常の関数のようにできるだけ振る舞うべきである場合、ローカル変数を定義することが可能でなければなりません。

ブーストコルーチンの実装者のいずれも、それぞれのライブラリインターフェイスが理想的だとは思っていません。現在の言語で達成できるのが最良ですが、全体の使用を改善することができます。

+2

ブーストコルーチンは別のライブラリに基づいています:ブーストコンテキストは、コンテキスト切り替えのプラットフォーム特質を提供します。私が理解していることから、これを実現させるために組み立てられたハッキン​​グがあります。しかし、私はローカル変数に問題があるとは思わない。コンテキストスイッチの後でスタックに残ります。 – Lazarus535

+2

@ Lazarus535:このアプローチはスタックコルーチンに有効です。また、スタックレスコルーチンは、使用された変数を他の場所に格納する必要があります。 Boostのスタックレスコルーチンは、マクロハック(本質的に[Duff's Device](https://en.wikipedia.org/wiki/Duff%27s_device)のバリエーション)と、関連する状態の必須の基本クラスを使用します。スタックレスコルーチンは、特定の制約の代わりにスタックコルーチンよりもはるかに効率的です。 –

4

CppCon 2015で、MicrosoftのGor Nishanovは、C++ Coroutinesがa negative overhead abstractionである可能性があるという主張をしました。彼の話からの論文はhereです。

コルーチンを使用すると、ネットワークコードの制御フローが簡素化され、コンパイラレベルで実装すると、オリジナルの2倍のスループットを持つ小さなコードが得られます。彼は実際に産出する能力はC++の機能でなければならないという主張をしている。

これらはVisual Studio 2015で初期実装されているため、ユースケースに合わせて試してみてください。 Async/Yieldのキーワードを使用する場合、彼らはまだハッシュアウトしようとしているように見えるので、標準がどこに行くかを見守ってください。

C++の再開可能な機能の提案は、hereと更新hereです。残念ながら、それはC++ 17にはなりませんでしたが、現在は技術仕様p0057r2です。また、-fcoroutines_tsフラグとVisual Studio 2015 Update 2のclangでサポートされているように見えます。キーワードにもco_が付いています。 co_await、co_yieldなど

コルーチンはgolang、D、python、C#の組み込み機能で、新しいJavascript標準(ECMA6)になります。 C++に実装がより効率的になると、golangの採用を置き換えるのだろうかと思います。

2

C++ 1zの再開可能な関数はスタックレスコンテキストスイッチングをサポートしていますが、boost.coroutine(2)はスタックフルコンテキストスイッチングを提供しています。

違いは、スタック・コンテキスト・スイッチングでは、コルーチン内で呼び出される関数のスタック・フレームは、コンテキストを一時停止するときにそのまま残っていますが、サブ・ライセンスのスタック・フレームは再開可能な機能(C++ 1z)を一時停止すると削除されます。

関連する問題