Що нового у С++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, оскільки розуміння нетворкінгу в С++ є одним з базових понять, які має знати кожен початківець.

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

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

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

Похожие статьи:
В сети сразу на нескольких ресурсах появилась информация о том, что компания Samsung занимается подготовкой к выпуску на рынок смартфона,...
Влада України нині працює над унормуванням використання супутникових терміналів Starlink усіма охочими. Наразі ще тривають необхідні...
В выпуске: .NET Core Hidden Gems, Event sourcing using Kafka, Version control improvements in Rider 2018.1, книга „Introducing GitHub”. .NET Allocation-free awaitable async operations with ValueTask<T> and...
Друзья! Сейчас, лучшая инвестиция — инвестиция в себя, свое развитие! Немного о курсе «Автоматизированное тестирование....
Затвердили перелік країн для програми електронного резидентства України. Йдеться про Словенію, Індію, Пакистан...
Яндекс.Метрика