Обложка: Развеиваем мифы о С++

Развеиваем мифы о С++

За 38 лет существования C++ о нём появилось много мифов. В этой статье вместе с курсом Яндекс.Практикума «Разработчик С++» мы разберём некоторые из этих мифов, чтобы понять, почему так и есть ли смысл им верить.

Миф №1: С++ — низкоуровневый язык

Это правда только наполовину, потому что C++ — очень гибкий язык. Он совмещает в себе качества как низкоуровневых, так и высокоуровневых языков.

Уровень языка говорит о его схожести с естественными языками. Низкоуровневые языки больше похожи на машинные — в них даже самые простые операции достаточно сложны. Высокоуровневые языки больше похожи на человеческие — в них все инструкции могут быть понятны даже человеку без подготовки. 

Например, на C++ вы можете написать процедурный низкоуровневый код, обращаясь к памяти напрямую. Или можете использовать высокоуровневые концепции вроде ООП и функционального программирования.

 Императивное программирование:

int v = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

int len = (sizeof(v)/sizeof(*v));
int sum = 0;

for(int i = 0; i < len; i++)
{
    sum += v[i];
}
//sum == 55

int product = 1;

for(int i = 0; i < len; i++)
{
    product *= v[i];
}
//product == 3628800

Функциональное (декларативное) программирование:

//Данные для вычислений
std::vector<int> v{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

//Функция accumulate() принимает первое и последнее значение массива, и начальное число
int sum = std::accumulate(v.begin(), v.end(), 0);
// Результат ‒ 55

//Та же функция может проделать и другие операции с данными. 
//Для этого нужно всего лишь передать нужный алгоритм
int product = std::accumulate(v.begin(), v.end(), 1, std::multiplies<int>());
//Результат ‒ 3628800

Оба фрагмента кода решают одни и те же задачи — складывают и умножают элементы массива. При этом при императивном подходе разработчик пишет чёткие инструкции: какие шаги компьютеру нужно выполнить, чтобы решить задачу. При декларативном подходе можно просто описать результат, который вы хотите получить.

То есть C++ позволяет работать сразу в нескольких парадигмах программирования, что совсем не вяжется с понятием «низкоуровневый язык».

Парадигма программирования — это набор идей и понятий, которые определяют стиль написания программ. Почитайте, что об этом говорят эксперты

Миф №2: C++ подходит только для написания низкоуровневых программ

Этот миф вытекает из предыдущего. C++ даёт разработчикам столько возможностей, что на нём можно писать что угодно: от драйверов до интерфейсов сайтов с помощью WebAssembly. Также он не только универсальный, но и производительный.

Вот только пишутся программы на C++ дольше, чем на более специализированных языках. Разработчик на JavaScript может потратить больше времени на выбор фреймворка, чем на создание самого сайта. Библиотеки для Python позволяют написать нейросеть всего на 11 строках кода. В C++, конечно, тоже есть такие инструменты, но заточены они на производительность, а не универсальность и скорость разработки.

Библиотека — набор инструментов и готовых функций для языка программирования.

Фреймворк — готовый каркас приложения.

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

Сам же язык можно использовать для любых задач. Просто во многих сферах важнее выпускать приложения чаще, пусть и со сниженной производительностью.

Миф №3: Язык не развивается

В последние годы у C++ появились новые конкуренты — Rust и GoLang. Из-за этого кажется, что C++ сдал позиции и вообще это какой-то древний язык, от которого пора отказаться. Однако он ещё очень долго будет популярен по нескольким причинам:

  1. На нём уже очень много всего написано, в том числе то, что вы используете каждый день: браузеры Chrome и Firefox, Windows, Linux, OS X, Android, iOS. Всё это нужно поддерживать и развивать. Следовательно, нужно больше C++-разработчиков, а сам язык должен развиваться.
  2. Язык хорошо зарекомендовал себя, а вот его конкуренты пока слишком молоды. Они понравились многим разработчикам, но пройдут годы, прежде чем они смогут сравняться с C++ по количеству новых и существующих проектов.

Что же касается развития, то разработчики постоянно обновляют популярные библиотеки и пишут новые. Так Qt (один из самых популярных инструментов для работы с графикой) получил новую версию в марте 2021 года, а относительно молодой TensorFlow (библиотека машинного обучения, первый релиз выпущен в 2015-м) — в декабре 2020-го. Стандарт языка тоже обновляется: C++20 был принят в сентябре 2020 года. Следующий планируют принять в 2023 году.

Миф №4: C++ — очень сложный язык

Частично это правда, потому что в C++ нет многих удобств, которые есть в более высокоуровневых языках. Например, разработчику на плюсах приходится самому работать с памятью, беспокоиться о том, чтобы не было утечек, собирать мусор и так далее.

Сборка мусора — освобождение памяти, которая больше не понадобится для работы программы. Это удобнее для программиста, но требует больше ресурсов для работы приложения. 

С другой стороны, в C++ есть много высокоуровневых инструментов, конструкций и библиотек, что позволяет значительно ускорить разработку. Например, можно достаточно быстро создать игру с помощью Unreal Engine, а не мучиться с написанием собственного движка. Работа с базами данных упрощается SOCI, а математические операции — с помощью целого ряда библиотек и того же функционального программирования.

Сложность изучения C++ главным образом заключается в более высоком пороге входа. Перед тем как вы сможете использовать даже самые продвинутые и высокоуровневые библиотеки, придётся многому научиться.

Также язык требует от разработчика более продвинутого знания об устройстве компьютера, чем другие языки вроде JavaScript, на котором можно просто начать писать.

Тема сложности C++ достаточно часто обсуждается, и однозначно ответить, сложный ли он, нельзя. Например, в статье «Почему никому не нравится язык программирования C++?» собраны мнения разных разработчиков с сайта Quora об этом языке. Кто-то говорит, что C++ невероятно сложный, а кто-то — что совсем несложный, но очень обширный и не терпящий ошибок.

В обсуждении на StackOverflow большинство считает, что язык настолько сложный, что изучив его, можно без труда выучить любой другой язык. Один из участников дискуссии даже смог получить сертификат по Java, не зная о нём вообще ничего.

Миф №5: C++ — (не) лучший язык для новичков

Тут мнения тоже достаточно заметно расходятся.

Кто-то говорит, что лучше начать с простого языка, чтобы втянуться в процесс и сразу что-то создавать. Глубокие знания можно будет получить позже, да и вообще они никогда не понадобятся большинству разработчиков. Зачем понимать принципы работы компьютера, если ты сайтики создаёшь?

Другие говорят, что все, кто не знают, как работает процессор, не достойны звания программиста. И вообще, если начать с простого языка, то привыкнешь к простоте и никогда не сможешь стать настоящим профессионалом. Нужно начинать с C++, а лучше с C. А ещё лучше с Ассемблера или двоичного кода.

Люди пишут об этом целые статьи и устраивают в комментариях настоящие войны:

  1. Почему Python плохой первый язык и нужно учить C или Assembler,
  2. Часовое выступление на CppCon2015 «Перестаньте учить C»,
  3. Почему С++ хороший первый язык,
  4. Как стать профессиональным веб-разработчиком (автор советует начинать с самого простого, а сложное учить, когда оно понадобится).

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