2016-01-31 4 views
6

Почему сопрограммы (на данный момент в новейших черновиках для C++ 1z) будут реализованы как функция основного языка (причудливые ключевые слова и все), а не расширение библиотеки?C++ 1z Coroutines - функция языка?

Существует уже несколько реализаций для них (Boost.Coroutine и т. Д.), Некоторые из которых могут быть сделаны независимыми от платформы, из того, что я прочитал. Почему комитет решил испечь его на основной язык?

Я не говорю, что они не должны, но сам Бьярне Страуструп упоминал в некоторых разговорах (не знаю, какой из них больше), что новые функции должны быть реализованы в библиотеках, насколько это возможно, а не касаться основного языка.

Так есть ли веская причина для этого? Каковы преимущества?

+3

Я не знаю, как boost: сопрограммы работают, и если они предлагают одну и ту же семантику, но я предполагаю, что сопрограммы могут быть реализованы гораздо эффективнее, чем функция языка, чем функция библиотеки. Кроме того, я не совсем уверен, действительно ли сопрограммы могут быть реализованы с использованием только стандартного C++. – MikeMB

+0

@MikeMB: Исправьте все учетные записи. – ildjarn

+1

Еще одна причина может заключаться в том, что это всего лишь способ лучше, чем часть языка (например, не нужно включать специальные заголовки или передавать специальные типы в качестве параметров для функций) – CoffeeandCode

ответ

7

Несмотря на то, что в библиотеке реализованы сопрограммы, они имеют определенные ограничения. Например, реализация библиотеки не может определить, какие переменные необходимо поддерживать при приостановке сопрограммы. Можно обойти эту потребность, например, сделав используемые переменные явными в той или иной форме. Однако, когда сопрограммы должны вести себя как обычные функции как можно больше, необходимо определить локальные переменные.

Я не думаю, что любой из разработчиков Boost coroutines считает, что их соответствующий интерфейс библиотеки идеален. Хотя это лучшее, что может быть достигнуто на современном языке, общее использование может быть улучшено.

+2

Boost coroutines основаны на другой библиотеке: Boost Context, которая предлагает специфику платформы переключения контекста. Из того, что я понял, есть некоторые взломы сборки, связанные с тем, чтобы это произошло. Но я не думаю, что есть проблема с локальными переменными. Они просто остаются в стеке после переключения контекста. – Lazarus535

+2

@ Lazarus535: этот подход работает для штабельных сопрограмм. Существуют также стекированные сопрограммы, которые должны хранить используемые переменные в другом месте. Сочетания стеков в Boost используют макросовку (по существу это вариант [Duff's Device] (https://en.wikipedia.org/wiki/Duff%27s_device)) вместе с обязательным базовым классом для соответствующего состояния. Стекированные сопрограммы намного эффективнее, чем стекированные сопрограммы - в обмен на определенные ограничения. –

4

На CppCon 2015 г. Гор Нишанов из Microsoft сделал аргумент, что C++ Coroutines может быть a negative overhead abstraction. Статья из его речи here.

Если вы посмотрите на его пример, то возможность использования сопрограммы упростит поток управления сетевым кодом, а при внедрении на уровне компилятора вы получите меньший код, который имеет в два раза большую пропускную способность оригинала. Он делает аргумент, что на самом деле способность к уступке должна быть функцией C++.

У них есть первоначальная реализация в Visual Studio 2015, поэтому вы можете попробовать его использовать для своего прецедента и посмотреть, как он сравнивается с реализацией boost. Похоже, что они все еще пытаются хэшировать, если они будут использовать ключевые слова Async/Yield, поэтому следите за тем, где идет стандарт.

Предложение возобновляемых функций для C++ можно найти here и обновление here. К сожалению, он не попал в C++ 17, но теперь это техническая спецификация p0057r2. С другой стороны, похоже, что их поддержка связана с флагом -fcoroutines_ts и обновлением Visual Studio 2015 Update 2. Ключевыми словами также являются co_, добавленные к ним. So co_await, co_yield и т. Д.

Coroutines - это встроенная функция в golang, D, python, C# и будет в новом стандарте Javascript (ECMA6). Если C++ предлагает более эффективную реализацию, мне интересно, будет ли это смещение принятия golang.

2

возобновляемые функции из C++ 1z поддерживают переключение контекстного контекста, в то время как boost.coroutine (2) обеспечивает переключение контекста в стеке.

Разница заключается в том, что при стекировании контекста переключение стековых фреймов функции, вызываемых внутри сопрограммы, остается неизменным при приостановке контекста, в то время как фреймы стека подпрограмм исключаются при приостановке возобновляемого fucntion (C++ 1z).

Смежные вопросы