Що нового у С++20: можливості та перспективи

Стаття написана у співавторстві з Андрієм Приступою та Віктором Дикуном — GlobalLogic Technology Management.

Мене звати Олександр Гайсін, я Senior Manager, Engineering GlobalLogic Lviv та працюю над проєктами, що пов’язані з мовою програмування С++. Разом з Андрієм та Віктором, які очолюють напрямок розвитку С++ у львівській локації компанії GlobalLogic, вирішили розповісти про переваги цієї мови та можливості, які відкриває перед розробниками її новий стандарт С++ 20.

Трохи історії, або як з’явилася С++

Мову програмування С++ ще на початку 1980-х років створив Б’ярн Страуструп — співробітник компанії Bell Laboratories. Річ у тому, що мова С, з якою він працював, мала недосконалості. У ній бракувало високорівневих абстрактних типів даних і об’єктів, обробки винятків, а тому техніка реалізації завдання часто домінувала над її змістом. Страуструп вдосконалив мову С для своїх потреб і додав можливість роботи з класами та об’єктами. Покращена версія ґрунтувалася на синтаксисі С, тому її називали «Сі з класами». Хоча нову мову використовували з початку 80-х, її запуск як окремої не планували. Проте 1983 року «Сі з класами» перейменували на «мову програмування C++».

Механізм класів дав можливість визначати і використовувати нові типи даних. А головною метою створення C++ було прагнення збільшити відсоток повторного використання вже написаного коду. Пізніше до С++ додали нові можливості, такі як віртуальні функції, перевантаження функцій і операторів, повноцінний механізм структурної обробки винятків і багато іншого.

Перший комерційний випуск С++ відбувся в жовтні 1985 року. Цікаво, що вона є вільною мовою, тобто ніхто не володіє правами на неї, навіть Б’ярн. З того часу мова зазнала багатьох удосконалень та продовжує розвиватись досі, адже цього року прийняли новий стандарт С++20. Проте про це трохи згодом.

Еволюція С++ та чому вона потрібна новачкам, і не тільки

З кожним новим стандартом ми отримуємо додаткові функціональні можливості. Згадуємо давні проєкти компанії, коли використовувались самописні структури даних та власноруч створені обгортки, які давали змогу спростити роботу з Operating System dependent API. Їх було складно підтримувати, а спеціалісти, які працювали на них, були практично незамінними.

С++ значно розвинулась за останні 10 років. Ми отримали покращені стандарти С++11, С++14, С++17, а цього року — С++20. Головні переваги, що стали доступні в кожній редакції, можна подивитись на малюнку вище. Такий розвиток мови дозволяє нам уніфікувати код і зробити його більш зрозумілим і доступним для широкого кола розробників.

Якщо раніше для визначення рівня С++ розробника бралось до уваги знання синтаксису і конструкцій мови, то зараз очікування дещо виросли і передбачають знання С++11, С++14, С++17 можливостей, таких як move-семантика, лямбда-функції, об’єкти синхронізації, у тому числі std::future, std::promise, std::condition_variable та інші.

Те саме відбувається зі знанням алгоритмів на базі С++. Якщо раніше інтерв’юери концентрувалися на базових структурах даних, як list чи vector, то з появою нових стандартів очікується, що інженер буде знайомим з unordered_map чи unordered_set і зможе пояснити, яка роль hash-функцій у цих контейнерах.

З одного боку, з новим стандартом ми отримуємо можливість писати більш високорівневий код, який компілюється без змін під різні операційні системи. З іншого — нові компоненти С++ відтестовані і стабільніші за власноруч написані.

Тому, якщо є можливість використання нового стандарту, команда його використовуватиме.

Таким чином, С++ є досить актуальною мовою вже 35 років та входить до топ-5 мов програмування, оскільки знання С++ дає розуміння, як працює система на низькому рівні. Водночас, мова досить складна і не дарма використовується для системного програмування. Більшість веббраузерів, операційних систем, середовищ розробки чи графічних редакторів створено з використанням С/С++.

При цьому С++ актуальна й для новачків. Наприклад, в основі популярних Java та JavaScript закладені принципи C++. Тому принципи роботи тієї ж Java достатньо непросто опанувати, якщо не знайомий з плюсами. Саме через це С++ вже довгий час залишається однією з основних мов навчання. Так, за даними дослідження GlobalLogic у Львові, 30% студентів визначили основним напрямком саме С++.

Тим часом С++ продовжує розвиватися, щоб відповідати сучасним вимогам. Одна з груп, що займаються мовою С++ в її сучасному вигляді і направляють комітету зі стандартизації С++ поради з її покращення, — це Boost. Наприклад, один з напрямів діяльності цієї групи — вдосконалення можливостей мови шляхом додавання до неї особливостей метапрограмування.

Стандарт С++ не описує способи іменування об’єктів, деякі деталі обробки винятків та інші можливості, пов’язані з деталями реалізації, що робить несумісним об’єктний код, створений різними компіляторами. Проте (за станом на час написання цієї статті) серед компіляторів С++ все ще продовжується битва за повну реалізацію стандарту С++, особливо в області шаблонів — частини мови, зовсім нещодавно повністю розробленої комітетом стандартизації.

Однією з перешкод у цьому питанні є ключове слово export, що використовується також і для розділення оголошення і визначення шаблонів.

Першим компілятором, що підтримав export у шаблонах, став Comeau C++ на початку 2003 року (за п’ять років після виходу стандарту). 2004 року бета-версія компілятора Borland C++ Builder X також почала його підтримку.

Ці обидва компілятори ґрунтуються на зовнішньому інтерфейсі EDG. Інші компілятори, такі як Microsoft Visual C++ або GCC, взагалі цього не підтримують. Герб Саттер, секретар комітету зі стандартизації С++, рекомендував прибрати export з майбутніх версій стандарту через серйозні труднощі з повноцінною реалізацією, проте згодом остаточним рішенням стало його залишити.

С++ як можливість створювати дійсно круті проєкти

Попри те що у мови С++ багато скептиків, вона буде актуальною ще багато років. С++ використовують у різних технологічних рішеннях, які відомі на весь світ. Наприклад, операційні системи Windows та macOS мають елементи, написані на С++. А YouTube використовує С++ для обробки відео. Крім цього, С++ потрібна для розробок вбудованих систем (embedded). Це різноманітні пристрої, від смартфонів до інсулінової помпи і бортового комп’ютера автомобіля.

Крім того, цю мову використовує й компанія SpaceX для створення своїх програмних рішень.

Згідно з результатами внутрішнього дослідження у межах львівської локації GlobaLlogic, мова С++ є основною для таких проєктів:

  • Розробка сервера для аудіо/відеоконференцій.
  • Автомобільна промисловість — С++ потрібна, щоб пов’язати залізо з програмним забезпеченням. Наприклад, бортовий комп’ютер.
  • Розумні будинки.
  • Медіаплеєри.
  • Системи моніторингу (від відеонянь до операційних).

Тому спеціалісти з С++ створюють справді круті проєкти, які змінюють світ на краще та якісно покращують життя людей.

Варто підкреслити, що C++20 змінить спосіб програмування C++ так само принципово, як і C++11. Це справедливо, зокрема, для великої четвірки: «Ranges, Coroutines, Concepts, and Modules». Півроку тому можна було казати навіть про велику п’ятірку, але Contracts були скасовані на засіданні зі стандартизації цього року в Кельні. Для довідки, Contracts точно і чітко визначають інтерфейси програмних компонентів. Але це в минулому, адже краще дивитись у світле блискуче майбутнє, яке настає вже зараз.

Можливості нової С++20

4 вересня 2020 року комітет ISO зі стандартизації С++ затвердив новий стандарт мови — С++20. Затверджені зміни найбільш вплинуть на загальну екосистему мови із часів С++11, а можливо, і за всю історію С++. Тобто новий стандарт не лише додає нові можливості, а й фундаментально змінює підходи до написання коду, розуміння функцій, створення шаблонів, проєктування бібліотек, організацію пакетів та компіляцію С++ програм.

Так, нова бібліотека діапазонів дозволяє їй виражати алгоритми безпосередньо на контейнері, складати алгоритм із «pipe symbol» та застосовувати їх до нелімітовано довгих потоків даних.

Завдяки Coroutines асинхронне програмування на C++ може стати основним. Coroutines — це основа для спільних завдань, циклів подій, нескінченних потоків даних або конвеєрів.

Нова концепція змінить спосіб мислення та шаблони програмування. Вони є семантичними категоріями для вірних аргументів шаблону. Вони дозволяють вам висловити свій намір безпосередньо в системі типів. Якщо щось піде не так, ви отримаєте коротке повідомлення про помилку.

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

Але це далеко не все. Ось кілька додаткових моментів:

  • тристоронній оператор порівняння <=>
  • рядкові літерали як параметри шаблону
  • розширення календаря та часового поясу бібліотеки «chrono»
  • std :: span як подання на суміжний масив
  • віртуальна функція constexpr
  • перевизначення volatile
  • доповнення до: std :: atomic_ref та std :: atomic >; включено можливість очікування завершення операції
  • нові механізми синхронізації, такі як semaphores, latch та barriers
  • контейнери constexpr
  • вдосконалений потік std :: jthread, який автоматично приєднується і може бути зупинений

Детальніше можна подивитись на малюнку нижче:

Втім, не варто хвилюватись, ті частини, які дійсно зазначені як volatile, не зміняться.

Щодо підтримки нових можливостей стандарту С++20 різноманітними компіляторами можна подивитись на таблицю нижче та дізнатися більше деталей.

Висновки

Загалом, до С++ додалось багато нових функцій, деякі з яких, безсумнівно, гідні того, аби радіти.

Звичайно, деякі з цих нових функцій та розширень вже давно або навіть від самого початку існували в інших мовах. Цікаво спостерігати, як деякі з цих мов, на які колись впливала С++, зараз впливають на майбутнє самої С++.

Хоча підтримка нетворкінгу не увійшла до С++20, можливості С++ розширюються, їхні реалізації та застосування також. Але фундаментально важливі ідеї, такі як продуктивність, надійність, оптимальне використання ресурсів, які лежать в основі С++, залишаються незмінними. На сьогодні С++20 є найкращою реалізацію цих ідей, а прототипи нетворкінгу, до речі, можна знайти в бібліотеці Boost, оскільки розуміння нетворкінгу в С++ є одним з базових понять, які має знати кожен початківець.

Мова С++ універсальна, швидка та затребувана. Плюси мають своїх фанатів, хоча дехто вважає її занадто складною та застарілою. Проте з впевненістю можна стверджувати, що вона залишатиметься актуальною ще довго.

Стежимо за тим, що відбувається в комітеті зі стандартизації С++.

Зокрема, комітет зі стандартизації С++ дозволяє надсилати свої пропозиції, які після розгляду можуть увійти до нового С++ стандарту.

Похожие статьи:
Допомога ЗСУ, волонтерські IT-проєкти, military-tech стартапи — засновник DOU Максим Іщенко запустив новий YouTube-подкаст про те, як українські...
Учебный центр SkillUp приглашает пройти курс QA Automation — Basic & Advanced Levels, после окончания которого вы освоите автоматизированное...
Привіт, мене звуть Павло, я інжиніринг-менеджер у JustAnswer. Раніше — лід, перед тим — розробник. UMC, МТС, далі Conscensia й JustAnswer....
Among the options a brand can choose when looking to reach its customers while also pay attention to trends, content is one of the most relevant and useful techniques in 2019. As described by the PR agency GoodNoon,...
PHP — шоста за популярністю мова програмування і 7% айтівців використовують її на роботі. Нині на DOU розміщено 187...
Яндекс.Метрика