Почему сопрограммы (на данный момент в новейших черновиках для C ++ 1z) будут реализованы как функция основного языка (причудливые ключевые слова и все), а не как расширение библиотеки?
Для них уже существует пара реализаций (Boost.Coroutine и т. Д.), Некоторые из которых можно сделать независимыми от платформы, из того, что я прочитал. Почему комитет решил включить его в основной язык?
Я не говорю, что они не должны, но сам Бьярн Страуструп в своем выступлении упомянул (не знаю, какой из них больше), что новые функции должны быть реализованы в библиотеках, насколько это возможно, вместо того, чтобы касаться основного языка.
Так есть ли веская причина для этого? Каковы преимущества?
Хотя есть сопрограммная реализация библиотек, они, как правило, имеют определенные ограничения. Например, реализация библиотеки не может определить, какие переменные необходимо поддерживать, когда сопрограмма приостановлена. Это можно обойти, например, сделав используемые переменные явными в некоторой форме. Однако, когда сопрограммы должны вести себя как обычные функции настолько, насколько это возможно, должна быть возможность определять локальные переменные.
Я не думаю, что кто-либо из разработчиков сопрограмм Boost считает, что их соответствующий интерфейс библиотеки идеален. Хотя это лучшее, что может быть достигнуто на текущем языке, общее использование может быть улучшено.
На CppCon 2015 Гор Нишанов из Microsoft выдвинул аргумент, что сопрограммы C ++ могут быть отрицательная верхняя абстракция. Бумага из его выступления Вот.
Если вы посмотрите на его пример, возможность использовать сопрограмму упростила поток управления сетевым кодом, а при реализации на уровне компилятора дает меньший код, который имеет вдвое большую пропускную способность по сравнению с оригиналом. Он выдвигает аргумент, что способность давать результаты должна быть функцией функции C ++.
Они имеют начальную реализацию в Visual Studio 2015, так что вы можете попробовать ее для своего варианта использования и посмотреть, как она сравнивается с расширенной реализацией. Похоже, что они все еще пытаются разобраться, будут ли они использовать ключевые слова Async / Yield, поэтому следите за тем, куда идет стандарт.
Предложение по возобновляемым функциям для C ++ можно найти Вот и обновление Вот. К сожалению, он не попал в c ++ 17, но теперь является технической спецификацией. p0057r2. С другой стороны, похоже, что они поддерживаются в clang с флагом -fcoroutines_ts и в Visual Studio 2015 Update 2. К ключевым словам также добавляется co_. Так что co_await, co_yield и т. Д.
Сопрограммы являются встроенной функцией в golang, D, python, C # и будут в новом стандарте Javascript (ECMA6). Если C ++ предложит более эффективную реализацию, мне интересно, заменит ли это принятие Голанга.
возобновляемые функции из C ++ 1z поддерживают стек-переключение контекста, в то время как boost.coroutine (2) обеспечивает стек-переключение контекста.
Разница заключается в том, что при переключении стека по контексту стековые фреймы функций, вызываемые внутри сопрограммы, остаются неизменными при приостановке контекста, в то время как стековые фреймы субрутиев удаляются при приостановке возобновляемой функции (C ++ 1z).