- PVSM.RU - https://www.pvsm.ru -
Сегодня завершилась летняя встреча комитета ISO WG21 C++, проходившая в Торонто с 10 по 15 июля. Вскоре нас наверняка ждёт подробный отчёт от РГ21 [1], а сегодня уважаемой публике предлагается пост-«разогрев» с обсуждением самого интересного.
Итоги встречи следующие: стандарт С++17 завершен и будет опубликован на следующем собрании в ноябре этого года; стандарт С++20 уже обзавелся первыми серьезными фичами — концептами (concepts), явными обобщёнными лямбда-функциями (explicit generic lambdas) — и это только начало.
Возможности нового стандарта С++17 обсуждались уже не раз, про нововведения писали на Хабре [2], проводили доклады на конференциях [3], поэтому снова их приводить здесь я не буду. Не секрет, что ключевой особенностью этого выпуска С++ стал перенос самых «вкусных» возможностей [4] в неопределенное будущее. Что ж, теперь можно с уверенностью сказать, что многие долгожданные «фичи» переехали именно в С++20. Взятый курс на расширение stdlib никуда не делся, поэтому от C++20 можно ожидать гораздо большего и богатого набора функций.
Многострадальные Concepts, когда-то не вошедшие в C++11, потом переделанные в виде нового предложения Concepts-Lite, наконец-то становятся частью стандарта.
По поводу краткого синтаксиса для концептов (terse syntax) комитету договориться пока не удалось; однако, обсуждение будет продолжаться в рамках С++20.
#define LOG(msg, ...) printf(msg __VA_OPT__(,) __VA_ARGS__)
LOG("hello world") // => printf("hello world")
LOG("hello world", ) // => printf("hello world")
LOG("hello %d", n) // => printf("hello %d", n)
[] <typename T> (T t) { /* ... */ }
Лямбда-функции были добавлены в язык в стандарте C++11, требовавшие указания конкретного типа; стандарт C++14 в свою очередь позволил объявлять параметры лямбда-функций со спецификатором типа auto:
[](auto x) { /* ... */ }
Теперь взаимодействовать с типами параметра (или параметров) станет проще — при определении лямбда-функций можно будет использовать привычный синтаксис шаблона функций:
[]<typename T>(T x) { /* ... */ }
[]<typename T>(T* p) { /* ... */ }
[]<typename T, int N>(T (&a)[N]) { /* ... */ }
shared_ptr<double[]> p = make_shared<double[]>(1024);
Тема поднималась неоднократно — например, здесь1 [7].
Больше нет нужды прибегать к хитрым приёмам [8] — на самом деле, компилятор и так всегда знал ответ, просто теперь он им сможет поделиться:
enum class endian
{
little = __ORDER_LITTLE_ENDIAN__,
big = __ORDER_BIG_ENDIAN__,
native = __BYTE_ORDER__
};
struct A { int x; int y; int z; }; A b{.x = 1, .z = 2};
vector v{vector{1, 2}};
// Выведет vector<int> вместо vector<vector<int>>
Перечисленные ниже TS отныне являются частью С++17 (уже обсуждались в прошлые разы):
Помимо этого, комитет опубликовал следующие технические спецификации, для которых компиляторы уже могут делать экспериментальные реализации (и они наверняка здесь обсуждались ранее):
Далее рассматриваются TS, работа над которыми все ещё продолжается.
Некоторые из них — но, определенно, не все — войдут в состав С++20.
Модули по-прежнему находятся в разработке, однако, в их жизни случилось серьезное событие — стал доступен ранний черновик TS Модулей [17]. В его публичной версии за прошедшее время ничего не изменилось (не считая пары мелких деталей) — т.е. модули по-прежнему основываются на дизайне Microsoft и не экспортируют макросы. По этому вопросу хотелось бы услышать мнение членов комитета, поскольку есть подозрения, что это не окончательное решение.
Опубликован, собирались принимать на этой встрече, однако фичи на разной стадии готовности — так что уже на следующей встрече данный TS будет частично принят в С++20. Содержит улучшения, которые сделают futures неблокирующими (в отличие от std::async), а также latches, барьеры и atomic smart pointers atomic_shared_ptr. Не вошел в С++17 по причине того, что был поздно опубликован и не получилось собрать достаточно практического опыта.
Непосредственно имплементация была вдохновлена MS Visual Studio, HPX и just::thread. Перед встречей были опасения, что новые предложения P0676 [19] и P0701 [20] могут отодвинуть принятие TS на неопределенный срок.
Опубликован, однако по этому TS еще совсем недавно у его же авторов оставались вопросы по части того, насколько быстрыми могут быть атомики и shared_ptr вне транзакций, если они должны с транзакцией взаимодействовать. Остается ждать разъяснений по поводу того, изменилось ли что-либо с прошлого раза.
Опубликован. Нечто вспомогательное, потребуется для С++20.
В разработке. Должен войти в С++20, т.к. на него завязаны несколько других TS библиотек, связанных с гетерогенными вычислениями.
В разработке. Есть все шансы попадания в С++20, ибо ему будет посвящена одна из грядущих встреч.
В основе TS лежат интроспекция кода и (с недавних пор) материализация (reification). По мнению комитета, TS пригодится в метапрограммировании, ставшему популярным благодаря Boost::Hana и аналогичных библиотек — а также для гетерогенных контейнеров [24].
В разработке на ранней стадии. Библиотека concurrent data structures, сoncurrent queues, lock-free алгоритмов и структур данных; включает в себя Hazard pointers (указатели опасности), RCU (безопасное освобождение памяти для lock-free контейнеров), atomic views. Вероятность попадания в С++20 крайне мала, т.к. находится еще на ранней стадии — при этом комитет осознает востребованность этого функционала и он, по словам автора, в самой активной разработке.
В разработке. Оказывается, за время разработки Parallelism v1 сделали не только Parallel STL для CPU, но и для GPU. Parallelism v2 —
В разработке.
В разработке. Будет либо TS, либо включение в стандарт С++20. Вкратце: улучшенная версия assert, которая позволяет проводить проверку пре- и пост- условий (т.е. инварианты). По мнению комитета, библиотека поможет С++ стать более безопасным языком, чтобы разработчики ПО для медицины, автомобилей, авиации и кибер-безопасности спали спокойней.
В разработке на ранней стадии. Кое-что из продвинутой арифметики наверняка войдет в С++20: decimal floating point, bounded types (например, fixed point types), unbounded types, multiprecision arithmetic. Должно пригодиться в работе в работе игровым разработчикам (которые, впрочем, привыкли сами писать то, что им требуется).
На ранней стадии.
Идёт работа над добавлением новых функций к std::string — starts_with, ends_with.
Стоит заметить, что причиной появления сразу нескольких будущих TS стали распределенные и гетерогенные вычисления. Участники комитета понимают, что вот уже долгое время CUDA/OpenMP/OpenCL обгоняет нативный C++. В данный момент, все функции вроде std::invoke, std::async, параллельные алгоритмы и пр. предполагают, что std::thread используется исключительно на CPU; и даже несмотря на то, что черновик Executors TS содержит подвижки на этом фронте в виде включения в него новых фич, этого будет недостаточно, и работы предстоит еще очень много.
Уже продолжительное время эксперты из Google, NVidia, Codeplay и NASDAQ принимают участие в работе над черновиками грядущих TS, чтобы определить направление развития С++, и приоритеты будущего языка вам известны: Concurrency, Parallelism, Transactional Memory, и Networking.
Время покажет, что из обещанного действительно войдет в C++20, и насколько оправдаются наши надежды.
Как обычно, прошу прощения за любые допущенные неточности.
Michael Wong — What's in C++20 and the C++17 final score card [26]
Обсуждение [27]
2017 Toronto ISO C++ Committee Discussion Thread (Concepts in C++20; Coroutines, Ranges and Networking TSes published) [28]
C++17: The Language Features — Nicolai Josuttis [3]
Trip report: Summer ISO C++ standards meeting (Toronto) [29]
Автор: Владимир Маслов
Источник [30]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/programmirovanie/260510
Ссылки в тексте:
[1] подробный отчёт от РГ21: https://stdcpp.ru/blog/20-iyulya-vstrecha-rg21-s-v-sankt-peterburge
[2] писали на Хабре: https://habrahabr.ru/company/yandex/blog/323972/
[3] доклады на конференциях: https://www.youtube.com/watch?v=pEzV32yRu4U
[4] перенос самых «вкусных» возможностей: https://habrahabr.ru/company/infopulse/blog/279927/
[5] [pdf]: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0428r1.pdf
[6] [pdf]: https://wg21.link/p0674r0
[7] 1: https://rsdn.org/forum/cpp/4790880.all
[8] к хитрым приёмам: https://stackoverflow.com/questions/1001307/detecting-endianness-programmatically-in-a-c-program
[9] [pdf]: https://wg21.link/p0329
[10] [pdf]: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4100.pdf
[11] [pdf]: https://wg21.link/n4507
[12] [pdf]: https://wg21.link/n4480
[13] Coroutines v1: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4663.pdf
[14] обсуждений: https://habrahabr.ru/post/278267/
[15] Ranges v1: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4671.pdf
[16] Networking v1: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4656.pdf
[17] [pdf]: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4667.pdf
[18] [pdf]: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4399.html
[19] P0676: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0676r0.pdf
[20] P0701: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0701r0.html
[21] pdf: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4514.pdf
[22] [pdf]: https://wg21.link/p0443r1
[23] pdf: https://wg21.link/p0194r4
[24] гетерогенных контейнеров: https://habrahabr.ru/post/332084/
[25] pdf: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0101r0.html
[26] Michael Wong — What's in C++20 and the C++17 final score card: https://www.codeplay.com/portal/10-06-17-whats-in-cpp-20-and-cpp17-final-score-card
[27] Обсуждение: https://www.reddit.com/r/cpp/comments/6n9t5v/codeplay_whats_in_c20_and_the_c17_final_score/
[28] 2017 Toronto ISO C++ Committee Discussion Thread (Concepts in C++20; Coroutines, Ranges and Networking TSes published): https://www.reddit.com/r/cpp/comments/6ngkgc/2017_toronto_iso_c_committee_discussion_thread/
[29] Trip report: Summer ISO C++ standards meeting (Toronto): https://herbsutter.com/2017/07/15/trip-report-summer-iso-c-standards-meeting-toronto/
[30] Источник: https://habrahabr.ru/post/333414/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best
Нажмите здесь для печати.