[Перевод] C++ по итогам 2022-го
Должен признать, что в некоторые из предыдущих лет C++ мог ощущаться немного «скучным» и «стабильным». Новые фичи, новый стандарт каждые три года, встречи, конференции… обычная жизнь (не считая некоторых дополнительных событий с в мире, экономике и эпидемиологической ситуации). Прошедший год отличается, потому что выглядит как «переломный» в истории C++… и кто знает, куда это заведёт нас.
Примечание переводчика. На оригинал статьи я наткнулся в чатике нашей конференции C++ Russia, и если вам интересен этот текст — подозреваю, что будет интересна и конференция (пройдёт в мае, в формате «Москва + онлайн».
Давайте вспомним некоторые вещи, случившиеся в этом году.
Отчёты за прошлые годы: 2021, 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012.
Важная оговорка: представленные взгляды здесь сугубо мои личные, они субъективные, и не представляют собой мнение комитета по стандартизации C++ или компании, на которые я работаю.
Оглавление
Краткое вступление
В 2022-м мир пытался вернуться к «норме», и в отношении C++ это было заметно по нескольким «реальным»/офлайновым конференциям и встречам комитета ISO. Вендоры компиляторов были заняты поддержкой C++20 и даже некоторых элементов C++23. А комитет работал над завершающими частями C++23 и некоторыми фичами C++26.
Однако примерно в середине года мы начали видеть некоторые «переломные моменты», когда несколько влиятельных групп анонсировали новые языки программирования. Сначала пришёл Val (возглавляемый Дэвидом Абрахамсом), затем Carbon (поддерживаемый Google), а затем CppFront (возглавляемый Хербом Саттером).
Следующая любопытная вещь — улучшения и обратная связь со стороны сообщества. Например, Витторио Ромео обратился к старой проблеме производительности отладки для std: move, std: forward, другим мелким задачам. Хорошая новость в том, что вендоры довольно быстро реализовали эти предложения.
В целом я вижу такие главные тренды и темы 2022-го:
C++23 в стадии feature freeze
Популяризация C++20
Новые языки
Обратная связь и улучшение инструментов
А кроме того, можно добавить ещё один пункт: анонс ChatGPT. Хотя он и не относится напрямую к C++, он может очень сильно сказаться на том, как мы пишем программы, учимся и даже преподаём. Вкратце, ChatGPT показал себя полезным помощником для различных задач, так что посмотрим.
Читайте дальше для полной картины.
Таймлайн
Давайте посмотрим на главные события:
Дата | Событие |
---|---|
7 февраля | Пленарное заседание комитета ISO C++ в Zoom |
15 февраля | Visual Studio 2022 17.1 |
25 марта | Clang14.0 |
6 апреля | Конференция ACCU (до 9 апреля) |
13 апреля | Boost 1.79: релиз мажорной версии |
2 мая | Val анонсирован на Cpp Now |
6 мая | GCC 12.1 |
10 мая | В MSVC STL завершена работа над /std: c++20 (во второй раз :)) |
22 июля | анонс Carbon на C++North |
25 июля | Пленарное заседание комитета ISO C++ в Zoom, С++23 в freeze-фазе |
9 августа | Visual Studio 2022 17.3 |
19 августа | GCC 12.2 |
6 сентября | Clang 15.0 |
11 сентября | Конференция CppCon (до 16 сентября) |
16 сентября | CppFront анонсирован на CppCon |
7 ноября | Гибридная встреча комитета ISO C++ на Кона (до 12 ноября) |
8 ноября | Visual Studio 2022 17.4 |
16 ноября | Встреча C++ (до 19 ноября) |
30 ноября | Анонс ChatGPT |
14 декабря | Boost 1.81: релиз мажорной версии |
22 декабря | libstdc++: имплементация поддержки таймзон C++20 в |
Вот видеорезюме этой таблицы:
Поддержка C++ 17 в компиляторах
Не хочу в этот раз быть скучным. Все главные компиляторы поддерживают C++17… за небольшими исключениями, вроде отсутствия поддержки плавающей точки в from_chars и to_chars или проблем с параллельными алгоритмами.
Если хотите изучить все фичи C++17, вот мой обзор:
Поддержка C++ 20 в компиляторах
По состоянию на конец 2022 года только MSVC (VS 2022 17.0) полностью поддерживает стандарт. GCC 13.0 (почти что выпущенный) содержит поддержку большинства фич, а Clang (16.0) немного отстаёт. Главные фичи, которых пока не хватает или с которыми не всё просто — модули, std: format, дополнения std: chrono и корутины. Но процесс идёт.
Вот некоторые из лучших фич, добавленных в стандарт:
модули
корутины
концепты и концепты в стандартной библиотеке
ranges
operator
<=>
и его использование в стандартной библиотеке, упрощение правил operator rewritingФорматирование текста:
std::format
Календарь и таймзоны
jthread
, семафоры, больше атомиков, барьеров, больше вещей по concurrencyconsteval
иconstinit
constexpr
-алгоритмы, векторы, строки, аллокация памятиstd::span
и другое!
А вот таблица поддержки компиляторами языковых фич:
компилятор | отсутствующие фичи |
---|---|
GCC 11 | Модули в «частичном» состоянии |
Clang 14/16 | Модули и корутины частично, улучшения CTAD отсутствуют |
MSVC 16.9 | Полная поддержка! |
Теперь про библиотечные фичи:
компилятор | пометки |
---|---|
GCC libstdc++, GCC 13 | Почти полная поддержка! |
Clang libc++, как в Clang 14 | отсутствуют: jthread, header units стандартной библиотеки, |
MSVC STL | Полная поддержка в версиях MSVC 16.9, 17.0! |
Можете отслеживать статус на этой странице.
Если хотите изучить все фичи, можете прочитать этот отличный и суперпопулярный пост Олександра Коваля:
All C++20 core language features with examples
В этом году в рубрике C++ Stories я также описал многие фичи нового стандарта:
Статус C++23
Этот год был значим тем, что новый стандарт перешёл в стадию «feature freeze». Комитет анонсировал это в середине года после июньской встречи.
Некоторые языковые фичи и их текущая поддержка в компиляторах:
Фича | GCC | Clang | MSVC |
---|---|---|---|
Сделать () опциональнее для лямбд | 11.0 | 13.0 | x |
| 12.0 | 14.0 | x |
Deducing | x | x | VS 2022 17.2 (partial) |
Многомерный operator[] | 12.0 | x | x |
#elifdef и #elifndef | 12.0 | 13.0 | x |
| 13.0 | 16.0 | x |
| 13.0 | 16.0 | x |
Поддержка UTF-8 в качестве кодировки portable source file | 13.0 | 15.0 | VS 2015 |
И одна из самых впечатляющих добавленных вещей, новость о которой разлетелась в сообществе — добавление P2718R0 , которое совершенствует P2012 «Fix the range‐based for loop».
Если вкратце, то можно станет писать:
std::vector createStrings();
for (char c : createStrings().at(0)) // <
По состоянию на C++20 у этого for-loop выражения было неопределённое поведение, потому что мы обращаемся к временному объекту, чьё время жизни уже вышло. В C++23 все временные объекты в этом выражении продлят своё время жизни, не только первый.
И библиотека:
Фича | GCC | Clang | MSVC |
---|---|---|---|
Stacktrace-библиотека | x | x | x |
std: is_scoped_enum | 11.0 | 12.0 | VS 2022 17.0 |
contains () для strings и string views | 11.0 | 12.0 | VS 2022 17.0 |
constexpr для std: optional и std: variant | 12.0 | 13.0 | VS 2022 17.1 |
std: out_ptr (), std: inout_ptr () | x | x | VS 2022 17.0 |
ranges: starts_with () и ranges: ends_with () | x | x | VS 2022 17.1 |
DR: std: format () improvements | 13.0 | 16.0 | VS 2022 17.2 |
ranges zip | 13.0 | 15.0 | VS 2022 17.3 |
Монадические операции для std: optional | 12.0 | 14.0 | VS 2022 17.2 |
12.0 | 16.0 | VS 2022 17.3 | |
ranges: to | x | x | VS 2022 17.4 |
Pipe support for user-defined range adaptors | x | x | VS 2022 17.4 |
ranges: iota (), ranges: shift_() | x | x | VS 2022 17.4 |
views: join_with | 13.0 | x | VS 2022 17.4 |
views: chunk_* и views: slide | 13.0 | x | VS 2022 17.3 |
views: chunk_by | 13.0 | x | VS 2022 17.3 |
x | x | x | |
Formatted output library | x | x | x |
Formatting ranges | x | x | x |
constexpr for integral overloads of std: to_chars () and std: from_chars () | 13.0 | 16.0 | VS 2022 17.4 |
Модули стандартной библиотеки | x | x | VS 2022 17.5* |
Монадические операции для std: expected | x | x | x |
Встречи ISO C++
В этом году было три встречи ISO:
два виртуальных однодневных пленарных голосования: в феврале и июне
одна гибридная в городе Кона (Гавайи)! Возвращение нормальной жизни :)
План состоит в том, чтобы завершить драфт C++23, разобраться с проблемами, которые отметили в National Bodies, и затем отправить на публикацию весной следующего года. Мы можем ожидать, что C++23 будет официально анонсирован осенью 2023-го.
Вот некоторые заметки со встреч:
Следующая встреча пройдёт в городе Иссакуа (США), начиная с 6 февраля.
Посмотреть полный список встреч: Upcoming Meetings, Past Meetings: Standard C++
Компиляторы
Чтобы поспевать за стандартами C++, создателям компиляторов и командам библиотек нужно проделывать немало работы.
Посмотрим на три популярных компилятора: MSVC, GCC и Clang.
Visual Studio
Команда MSVC переписала свою компиляторную инфраструктуру и может относительно быстро выпускать новые фичи. Они даже объявили о поддержке C++ 20 целых два раза!
Этот анонс в основном был связан с дополнительными изменениями и фиксами DR Standard для
Некоторые другие новости и посты MSVC:
И есть страница документации о соответствии стандартам C++ (включая C++20): Microsoft C++ language conformance table
Также вы можете отслеживать прогресс имплементации стандартной библиотеки на GitHub: Changelog · Microsoft/STL Wiki.
GCC
Текущая стабильная версия — GCC 12.2 из августовской 12 Release Series.
Также можно посмотреть на готовящийся GCC 13: GCC 13 Release Series — Changes, New Features, and Fixes — GNU Project.
Информация о поддержке языка и библиотеки:
И некоторые новости про GCC:
Clang
Текущая стабильная версия: 15.0.6 (выпущена в конце ноября), Welcome to Clang«s documentation! — Clang 15.0.0 documentation.
А также можно предварительно посмотреть на Clang 16.0: Clang 16.0.0git (In-Progress) Release Notes — Clang 16.0.0git documentation.
Производительность отладки
Давайте разберём тему производительности и обратной связи от сообщества:
Вот статья Витторио Ромео: the sad state of debug performance in c++ — и исправление, описанное в Improving the State of Debug Performance in C++ — C++ Team Blog
Если вкратце, то благодаря атрибуту msvc::intrinsic
команда смогла аннотировать пару функций, связанных с move, и в некоторых случаях кодогенерация в MSVC 17.4 выдавала 226 инструкций, а в 17.5 стала выдавать всего лишь 106! Как сообщается в release notes, std::move
, std::forward
, std::move_ifnoexpect
и std::forward_like
теперь не производят вызовов функции в сгенерированном коде, даже в режиме отладки. Это для того, чтобы избежать ненужного оверхеда от named casts в отладочных сборках. Необходим /permissive-
или подразумевающий его флаг (вроде std:c++20
или std:c++latest
).
Также есть ещё два бага, описанных Витторио: 104719 — Use of std::move
in libstdc++ leads to worsened debug performance и Use of std::move
in libc++ leads to worsened debug performance · Issue #53689 · llvm/llvm-project — похоже, что их пофиксили в GCC и Clang, и они теперь могут сворачивать простые инструкции.
В целом с точки зрения отладки в C++ ещё много работы, но как можно видеть, сообщество работает хорошо, пытается прислушиваться к своим потребностям, а вендоры улучшают свои имплементации.
Языки-наследники C++ и безопасность
Процесс ISO C++ в некоторых случаях может быть медленным и неэффективным. А ещё в комитете есть много «холиваров», особенно о вещах вроде «не ломать ABI». В некоторых случаях мы знаем о проблемах в стандарте и знаем, как их исправить…, но поскольку мы не можем сломать ABI, с этим ничего не поделать (кроме как добавить хак-костыль). Некоторые группы, например, из Google, были несколько разочарованы этим фактом и создали новые подходы к C++.
Есть отличная статья: The Year of C++ Successor Languages от Люциана Раду Теодореску, где вы можете прочитать об этих подходах и краткие описания для каждого языка.
В этой статье мы можем прочитать, что несмотря на критику (обильную!), C++ непрерывно остаётся в числе топ-4 языков программирования на протяжении последних 30 лет. Критики заявляют, что язык слишком большой и сложный, что некоторые фичи следует удалить, что фич одновременно слишком много и недостаточно. Эта критика привела к возникновению нескольких языков программирования, которые ставят целью сменить C++ как доминирующий язык системного программирования. В 2022-м три разных языка были представлены на крупных конференциях по C++: Val, Carbon и CppFront. Эта статья содержит критический разбор этих языков и их потенциал в качестве замены C++.
Val
Анонсировали и возглавляют его Дейв Абрахамс и Димитрий Ракордон. Сильно вдохновлён Swift, выглядит последовательным и лёгким в использовании.
Подробнее: https://www.val-lang.dev/
Carbon
Поддерживается Google (и, по словам Чендлера, также Adobe), «ощущается как проект по генеральной уборке в C++».
Подробнее: carbon-language @Github
и ещё ссылка:
CppFront/Cpp2
Возглавляет Герб Саттер. Это попытка улучшить синтаксис и «дефолты»…, но продолжать компилироваться в C++.
Мой взгляд
Всегда хорошо, когда есть конкуренция. C++ может выиграть от существования других языков и обмениваться фичами с Carbon или Rust.
А ещё в этом году заметна тематика безопасности языков, и мы видим такие тексты:
ChatGPT
Я спросил бота, но он не рассказал мне, написан ли он на C++. Думаю, некоторые компоненты могут быть на C++, но поскольку это громадная система, там может быть использовано множество технологий.
В видеоролике C++ Weekly — Ep 354 — Can AI And ChatGPT Replace C++ Programmers? — YouTube Джейсон Тёрнер экспериментирует с ботом. Порой он выдаёт вполне валидные ответы, но по-прежнему надо быть внимательным к деталям. Этот чатбот может быть очень полезным помощником в кодинге.
Я также прочитал прекрасное письмо от основателя Educative:
AI вроде ChatGPT изменит ландшафт разработки программного обеспечения —, но не так, как многие опасаются. Как разработчик и сторонник обучения разработке, я верю, что ChatGPT способен помочь нам лучше писать софт, но не лишит разработчиков работы.
Он также предполагает следующее:
ChatGPT сделает кодинг продуктивнее и безбажнее. По мере того, как он будет понимать более сложные требования, мы можем ожидать, что он вытеснит механическую работу, улучшив продуктивность и тестирование.
По мере развития помощников вроде ChatGPT многие из скучных задач, которые занимали разработчиков, могут уйти в следующее десятилетие, включая автоматические юнит-тесты, генерацию тест-кейсов на основании параметров, анализ кода для предложения практик безопасности, автоматизацию QA.
И это не считая способностей в обучении,. Представьте дружелюбного «бота-тьютора для C++». Вы можете учить язык программирования или спросить о любой языковой фиче так же, как вы спросили бы коллегу-эксперта на работе.
Думаю, мы увидим много выдохновляющих инструментов в следующем году… Возможно, даже что-то именно для C++, кто знает :)
Конференции и онлайн-мероприятия
Вот ссылка на страницу ISO C++ со всеми зарегистрированными конференциями в мире: Conferences Worldwide, C++FAQ.
Отдельные яркие моменты, ресурсы, видеозаписи кейноутов:
Онлайн-встречи по C++
Я впечатлён Йенсом Уэллером, создавшим глобальный онлайн-митап:
Meeting C++ online (Düsseldorf, Deutschland) | Meetup
Например, посмотрите на некоторые недавние AMA (Ask Me Anything):
Книги
Некоторые избранные книги, вышедшие в 2022-м (или в конце 2021-го):
Дисклеймер: ссылки в этой таблице — аффилированные ссылки на Amazon.
Можете прочитать мой обзор книги «Embracing Modern C++»: Embracing Modern C++ Safely, Book Review — C++ Stories
А ещё вышла моя собственная книга «C++ Initialization Story», выпущенная в середине 2022 и завершённая в декабре:
C++ Initialization Story @Leanpub
Популярность
Похоже, что у C++ стабильно рос в различных чартах популярности языков. Посмотрите:
Картинка основана на данных опроса Stack Overflow and Tiobe Index.
По данным GitHub, Octoverse C++ находится на 6-м месте (в прошлом году был на 7-м), это можно увидеть здесь.
Более того, в раннем ноябре также была интересная статья: The pool of talented C++ developers is running dry
Из статьи:
Энтони Пикок, бывший квант в Citi и Citadel, сказал «невозможно найти людей с по-настоящему высоким уровнем скиллов в C++, а именно этого хочет любая трейдинговая компания.
Даже если Carbon, Rust или CppFront уже за углом… (или нет?)… всё равно необходимо будет мейнтейнить прорву кода на C++. Более того, многие индустрии вроде финансовой по-прежнему используют C++ для низкоуровневой инфраструктуры.
Вот соответствующая дискуссия на Reddit: The pool of talented C++ developers is running dry: cpp с более чем 350 комментариями!
Ваш фидбек и опрос
12 декабря я начал мой ежегодный опрос об использовании C++. В этом году я получил 649 откликов. Спасибо за них!
Просуммируем ваши ответы :)
Использование стандартов C++
Какой стандарт вы используете постоянно?
Answer | 2022 | 2021 | 2020 | 2019 | 2018 |
---|---|---|---|---|---|
Pre C++11 | 10.8% | 7.5% | 8.4% | 10.3% | 20% |
C++11 | 27.6% | 25.6% | 25.5% | 30.3% | 41% |
C++14 | 28.7% | 28% | 28.6% | 35% | 42% |
C++17 | 61.8% | 66.1% | 64.4% | 62.4% | 44% |
C++20 | 42.2% | 28.8% | 20.4% | 9.2% | n/a |
(сумма чисел не равна 100%)
C++20 получает больше использования, в то время как C++11/14 стабилизируется в районе 28%.
Опыт с C++17
Насколько вы знакомы с C++ 17?
Answer | 2022 | 2021 | 2020 | 2019 |
---|---|---|---|---|
experimenting with C++17 | 29.7% | 28.9% | 34.9% | 39.4% |
only read basic information | 10.2% | 11.4% | 9.4% | 13.4% |
already using in production | 57.6% | 56.6% | 52.2% | 41.6% |
don«t know any of its feature | 1.8% | <1% | 1.6% | 2.6% |
Опыт с C++20
Насколько вы знакомы с C++ 20?
Answer | 2022 | 2021 | 2020 | 2019 |
---|---|---|---|---|
experimenting with C++20 | 37.8% | 35.7% | 35.6% | 29.3% |
only read basic information | 36.2% | 44.1% | 50.8% | 59.8% |
already using in production | 17.6% | 12.8% | 6.8% | n/a |
don«t know any of its feature | 7.7% | 6% | 5.2% | 9.1% |
Используемые компиляторы
Answer | 2022 | 2021 | 2020 | 2019 |
---|---|---|---|---|
GCC | 70.9% | 76% | 70.3% | 75.6% |
Clang | 46.1% | 51.8% | 49.6% | 58.7% |
MSVC | 54.7% | 54.1% | 58.5% | 56.3% |
Intel Compiler | 2.5% | 2.3% | 2.8% | 3.1% |
C++ Builder | 1.1% | 2.2% | 3% | 1.2% |
(сумма чисел не равна 100%)
Какие IDE вы используете для своих проектов на C++
Answer | 2022 | 2021 |
---|---|---|
Visual Studio | 48.2% | 48.8% |
Visual Studio Code | 49.3% | 47.1% |
CLion | 19.3% | 18.5% |
C++ Builder IDE | 1.5% | 2% |
Eclipse | 6.2% | 5.8% |
Vim/Emacs | 24% | 26.9% |
QT Creator | 14.6% | 15.7% |
Notepad++ | 9.1% | 7.4% |
XCode | 6.8% | 6.1% |
(сумма чисел не равна 100%)
Какие дополнительные инструменты вы используете?
Answer | 2022 | 2021 | 2020 | 2019 |
---|---|---|---|---|
Debugger | 74.3% | 80.8% | 77% | 83.6% |
Sanitizers | 36.8% | 38.9% | 31.9% | 40.4% |
Static Code Analysis | 57.2% | 58.7% | 60.9% | 55.7% |
Profilers | 43% | 49.1% | 53.4% | 56.8% |
Clang Format | 45% | 49.4% | 43.3% | 49.3% |
CMake | 64.9% | 67.3% | 62.3% | 66% |
Package Managers | 25.3% | 26.2% | 23.2% | 21.4% |
(сумма чисел не равна 100%)
Лучшее, что случилось в 2022:
Ответы на этот открытый вопрос, основанные на популярности (я попытался сгруппировать похожие вещи), без какого-либо конкретного порядка:
Языковые обновления и стандарты: вы упомянули вещи вроде релиза C++20 и C++23, а также популяризацию новых фич и пропоузалов.
Новые языки: Carbon / Cpp2 / Val, и возникновение дискуссии о следующих шагах в сообществе.
Конференции и события: как обычно, конференции вроде CppCon и Meeting C++ набрали много голосов.
Книги и ресурсы: популярными ответами были «A Tour of C++», «Embracing Modern C++ Safely,» и «Klaus Iglberger«s book on Software Design».
YouTube-каналы: особенно Jason«s Turner, Cppcon Channel и Meeting C++ Youtube
Личные проекты и образование: многие из вас упоминали работу над личными проектами или улучшение своего владения C++ и понимание языка.
Поддержка компиляторов: доступность поддержки новых стандартов как необходимое развитие для сообщества.
Популярность C++: отклики упоминали TIOBE и другие рейтинги.
Также здорово было слышать новости вроде
«Переход моей компании на C++20»
«Личный апгрейд с C++14 до C++20»
«Я только что снова получил работу в C++ и довольно счастлив этому»
Или «Мы всё ещё живы ;-)» :)
Также было много позитивных откликов о моём блоге, моих книгах и рассылке! Спасибо!
«Мне нравится ваша книга «C++ Initialization»
«Нашёл ваш блог C++ Stories, было довольно полезно в подготовке к собеседованиям»
Другие опросы:
Мой опрос не самый главный :) Посмотрите на другие большие от таких компаний:
Заключение
Спасибо, что дочитали досюда :)
C++ сейчас на развилке. С одной стороны, он в хорошей форме, с кучей новых фич, поддержкой компиляторов, и отличных инструментов (и с даже улучшившейся производительностью отладки!) Но в то же время у многих экспертов есть сложность с тем, чтобы сделать язык безопаснее и починить некоторые старые проблемы (дискуссия о сломанном ABI). Вот почему некоторые эксперты пытаются начать с чего-то свежего и улучшить C++ с помощью создания новых конкурентов. Эти новые языки либо напрямую компилируются в C++ (как CppFront), либо позволяют активное взаимодействие с C++ (как Carbon). Так что, возможно, в будущем вы будете писать на супер-надёжном языке C++2 и по-прежнему держать некоторые легаси-файлы на старом добром современном C++ в одних и тех же проектах. Я надеюсь, что «дружеская соревновательность» продвинет C++ дальше и позволят нам получить лучшие фичи и более надёжный код.
А с ChatGTP кто знает, будем ли мы вообще кодить в следующем году :)
В целом большие вещи в 2022-м вижу так:
Популяризация C++20
Работа над C++23
Новые языки и новые возможности для улучшения C++
Обсуждения в сообществе и петля обратной связи