Должен признать, что в некоторые из предыдущих лет C++ мог ощущаться немного «скучным» и «стабильным». Новые фичи, новый стандарт каждые три года, встречи, конференции... обычная жизнь (не считая некоторых дополнительных событий в мире, экономике и эпидемиологической ситуации). Прошедший год отличается, потому что выглядит как «переломный» в истории C++... и кто знает, куда это заведёт нас.

Примечание переводчика. На оригинал статьи я наткнулся в чатике нашей конференции C++ Russia, и если вам интересен этот текст — подозреваю, что будет интересна и конференция (пройдёт в мае, в формате «Москва + онлайн».

Давайте вспомним некоторые вещи, случившиеся в этом году.

Отчёты за прошлые годы: 2021202020192018201720162015201420132012.

Важная оговорка: представленные взгляды здесь сугубо мои личные, они субъективные, и не представляют собой мнение комитета по стандартизации 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 в <chrono>

Вот видеорезюме этой таблицы:

Поддержка 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, семафоры, больше атомиков, барьеров, больше вещей по concurrency

  • consteval и constinit

  • constexpr-алгоритмы, векторы, строки, аллокация памяти

  • std::span

  • и другое!

А вот таблица поддержки компиляторами языковых фич:

компилятор

отсутствующие фичи

GCC 11

Модули в «частичном» состоянии

Clang 14/16

Модули и корутины частично, улучшения CTAD отсутствуют

MSVC 16.9

Полная поддержка!

Теперь про библиотечные фичи:

компилятор

пометки

GCC libstdc++, GCC 13

Почти полная поддержка!

Clang libc++, как в Clang 14

отсутствуют: jthread, header units стандартной библиотеки, make_unique_for_overwrite, некоторые атомики

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

if consteval

12.0

14.0

x

Deducing this

x

x

VS 2022 17.2 (partial)

Многомерный operator[]

12.0

x

x

#elifdef и #elifndef

12.0

13.0

x

static operator()

13.0

16.0

x

static operator[]

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<std::string> createStrings();
for (char c : createStrings().at(0)) // <<!
{
   // some code...
}

По состоянию на 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

<expected>

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

<flat_map>, <flat_set>

x

x

x

Formatted output library <print>

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 для <format>, <chrono> и <ranges>. После завершения работы над ними имплементация снова стала стабильной.

Некоторые другие новости и посты 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.

Название

Дата выхода

Beautiful C++: 30 Core Guidelines… (J. Guy Davidson, Kate Gregory)

декабрь 2021

Discovering Modern C++ 2nd Edition (Peter Gottschling)

декабрь 2021

Embracing Modern C++ Safely (J. Lakos, V. Romeo, R. Khlebnikov, A. Meredith)

декабрь 2021

Modern CMake for C++ (Rafal Swidzinski)

февраль

C++ Core Guidelines Explained (Rainer Grimm)

апрель

Template Metaprogramming with C++ (Marius Bancila)

август

Tour of C++, A (C++ In-Depth Series) 3rd Edition (Bjarne Stroustrup)

сентябрь

C++20 - The Complete Guide (Nicolai M. Josuttis)

октябрь

C++ Software Design: Design Principles and Patterns for High-Quality Software (Klaus Iglberger)

октябрь

Copy and Reference Puzzlers - Book 3 (Jason Turner)

декабрь

Object Lifetime Puzzlers - Book 3 (Jason Turner)

декабрь

C++ Programming Fundamentals (D. Malhotra and N. Malhotra)

декабрь

Можете прочитать мой обзор книги “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++

  • Обсуждения в сообществе и петля обратной связи