Обложка: Какой язык программирования изучать в 2021 году?

Какой язык программирования изучать в 2021 году?

23
4
Давид Медведик
Давид Медведик

Старший инженер-программист в компании Positive Technologies

Меня зовут Давид Медведик, я имею большой опыт работы с высоконагруженными приложениями, разрабатывал комплексы на 200+ серверов, также являюсь одним из преподавателей курса по Highload Architect. В настоящий момент работаю в одной из передовых компаний, занимающихся обработкой и анализом трафика, — Positive Technologies.

В этой статье мы поговорим о том, какой язык программирования стоит изучать в 2021 году, в чём его особенности, и причем тут highload.

На какой язык программирования стоит обратить внимание в 2021 году

Сейчас есть большое количество языков программирования: какие-то более универсальные, какие-то заточены под определённые задачи. Основываясь на текущих тенденциях IT-рынка, я бы рекомендовал изучать язык программирования С++.

Почему нужно изучать С++

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

Насколько сейчас востребован язык С++

Достаточно взглянуть, как изменился YouTube за последние несколько лет. То количество трафика, которое он обрабатывает, растёт по экспоненте. И таких примеров много. Когда мы упираемся в «потолок» вертикального масштабирования серверов, а горизонтально масштабироваться не получается, то тут на помощь и может прийти язык С++. Так как этот язык является прямым наследником языка Си, то мы получаем большой спектр оптимизаций, при помощи которых можно выжать максимум из железа.

При этом С++ продолжает активно развиваться: добавляются механизмы и инструменты, позволяющие упростить написание кода. Если эта тенденция сохранится, то мы сможем увидеть снижение порога вхождения, что может значительно улучшить позиции языка С++ в рейтинге самых востребованных языков. И как раз в этот момент хорошо уже быть «прокачанным» специалистом.

Какими особенностями обладает С++ по сравнению с другими языками

Работа с памятью в С++

Одна из ключевых особенностей С++, которая, однако, является и минусом, и плюсом — это работа с памятью. Так как С++ является наследником языка Си, то есть возможность управлять памятью напрямую, добиваясь максимальной производительности вашей программы.

К примеру, в операционной системе Linux используется страничная адресация памяти, где каждая страница занимает около 4 KB. Когда ваше приложение использует 2 GB памяти, то вам будет выделено 2 GB/4 KB страниц. Эти страницы мапятся на физическую память.

Вся эта виртуализация требует накладных расходов, но у неё есть значительное преимущество — вашему приложению сразу же не будет выделена вся память, а только то количество, которое необходимо в данный момент. Но если ваше приложение потребляет основную часть ресурсов сервера, то вы можете выделить память не стандартного страничного размера 4 KB, а, например, целиком 2 GB, что позволит нам избавиться от накладных расходов на страничную адресацию в рамках большой страницы, она же huge pages в рамках нашего приложения.

Также стоит отметить, что C++ предоставляет нам возможность использования разного рода аллокаторов памяти при работе с объектами.

Аллокаторы в C++

Аллокаторы памяти — это специализированный класс, реализующий и инкапсулирующий малозначимые детали распределения и освобождения ресурсов компьютерной памяти. Они позволяют, например, избежать повторного обращения к операционной системе за новой памятью.

Но у этого механизма есть и обратная сторона: вам придётся тщательно следить за утечками памяти. Ведь кто выделил память, тот и должен её освободить. И эта проблема решена в С++. Для этого используются умные указатели — класс, предназначенный для управления динамически выделенной памятью и обеспечения её освобождения (удаления). Рекомендую самостоятельно прочитать про это, механизм достаточно интересный.

Семантика перемещения

Одна из самых интересных, на мой взгляд, возможностей С++ — это перемещение временных объектов в место копирования. Временные объекты  — это те объекты, которые были сконструированы во время выполнения каких-либо операций. Таким объектом может быть возвращаемое значение.

Object get_object();
...
Object a,b;
...
a = b; // тут будет вызван оператор присваивания
a = get_object(); // в обычном случае будет вызван конструктор класса Object
                  // и после оператор присваивания, но если у нас реализован
                  // оператор перемещения, то конструктор вызван не будет и
                  // временный объект будет перемещен в 'a'
// пример такого оператора
Object & operator=(Object && other) 
{
    // тут делается перенос полей которые нам интересны
    return *this;
}

Пропуск копии (Copy elision)

Этот инструмент компилятора позволяет избавиться от лишних копий в рамках работы приложения. Компилятор сам анализирует код и оптимизирует его, чтобы обеспечить минимальное количество копий объектов во время работы программы.

Рассмотрим пример:

struct C {
  C() {}
  C(const C&) { std::cout << "A copy was made.\n"; }
};
 
C f() {
  return C();
}
 
int main() {
  std::cout << "Hello World!\n";
  C obj = f();
}

В зависимости от настроек оптимизации компилятора у нас могут быть следующие результаты:

// без оптимизаций
Hello World!
A copy was made.
A copy was made.
// обычная оптимизация кода
Hello World!
A copy was made.
// максимальная оптимизация кода
Hello World!

Нам интересен последний случай. Возвращаемое значение функции f() будет сконструировано на месте объекта obj — это одна из оптимизаций, называемая return value optimization. А самое интересное, что если мы реализуем операторы перемещения, как, например, в семантике перемещения, то компилятор (с 17 стандарта) нам гарантирует, что копий не будет сделано, и объекты будут перемещены. Тем самым можно добиться результата, когда у вас в рамках приложения не создаётся ни одной копии объектов.

Использование системных вызовов

Одним из главных преимуществ языка С++ является возможность использования системных вызовов «как есть». Как я уже говорил, язык С++ происходит от языка Си, а именно на этом языке написано ядро Linux. Опираясь на это, мы, например, можем написать такой код в рамках С++:

// Create a cpu_set_t object representing a set of CPUs. Clear it and mark
// only CPU i as set.
cpu_set_t cpuset;
CPU_ZERO(&cpuset);
CPU_SET(i, &cpuset);
int rc = pthread_setaffinity_np(threads[i].native_handle(),
                                sizeof(cpu_set_t), &cpuset);

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

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

Выводы

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

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

Приходилось ли вам использовать C++?

Хинт для программистов: если зарегистрируетесь на соревнования Huawei Cup, то бесплатно получите доступ к онлайн-школе для участников. Можно прокачаться по разным навыкам и выиграть призы в самом соревновании.

Перейти к регистрации

Что думаете?