Язык программирования C++, на котором написано 95% существующего программного обеспечения, был создан Бьерном Страуструпом, датским инженером со странноватой прической, в далеком 1985 году — очень давно!
Нет, все эти годы язык не стагнировал. Он продолжал свое развитие — пополнялся новыми функциями и обрастал синтаксическим сахаром. Мощный, гибкий, сложный, C++ заменил тогдашний C, добавив больше абстракций, присущих ООП — тот самый «Си с классами».
Но 40 лет — это много. Все это время IT-индустрия открывала инсайты, меняла подходы к разработке ПО, придумывала новые методологии и архитектуры, развивала другие языки и их синтаксисы. В общем, аспекты разработки сильно менялись, эволюционировали.
Поспевал ли за этими изменениями C++? Он старался. И старается до сих пор. НО!
Рабочая группа по стандартизации собирает новые идеи и имплементирует их. Добавление новых фич занимает годы — столько времени уходит на придумывание идей, проверку гипотез, тестирование функций, реализацию библиотек и т. д.
Разработка C++ децентрализована, а разработчиков компиляторов как минимум 3 — каждый понимает стандарт по своему и дополнительно добавляет собственные уникальные фичи. То же самое касается пакетных менеджеров и систем сборки. Говоря иначе — хаос. Хаос, тормозящий развитие языка, его понимание и поддержку.
Это что касается контекста. Если говорить о технических недостатках (они же, кстати, могут считаться и достоинствами, ибо тут с какой стороны посмотреть), то озвучиваются они обычно так: «Да, С++ очень быстрый, экономит память и батарею, но он совсем не безопасный — позволяет выходить за границы массивов, обращаться к освобожденным кускам памяти и все такое».
Короче говоря, низкоуровневая свобода имеет свои издержки. И делает язык сложнее и опаснее.
Многие крупные компании (об этом чуть ниже) стремятся объединить усилия, создав полную замену C++ — лаконичную, понятную, безопасную и такую же быструю. Сделать этого пока не удалось, но прогресс есть.
В статье мы разберем наиболее популярные и перспективные C-подобные языки, которые в ближайшем (ну или не очень ближайшем) будущем имеют право заменить C++, став его преемником. Важно подчеркнуть, «имеют право» — вполне возможно, они не сделают этого никогда.
1. Rust
Rust — язык программирования общего назначения, увидевший мир в 2015 году. Так же, как и C++, он делает упор на производительность, типизацию и параллелизм.
Однако в отличие от «плюсов», он обеспечивает полную безопасность памяти — все ссылки указывают только на допустимую память. При этом Rust не использует автоматический сборщик мусора — вместо этого он отслеживает время жизни объекта и его ссылки еще на стадии компиляции программы.
Rust, как и C++, используется в системном программировании. Язык довольно нейтрален и не навязывает какую-либо парадигму программирования, но во многом он построен на идеях функционального программирования. Разумеется, в языке есть все необходимые типы данных и для ООП: структуры (struct), перечисления (enum), черты (trait) и методы (fn).
Вот небольшой пример кода на Rust:
// entry point в программу
fn main() {
let width1 = 30;
let height1 = 50;
println!("Площадь прямоугольника: {} пикселей", area(width1, height1)); // здесь выполняется конвертация тип u32 при передаче аргументов в функцию
}
// пользовательская функция, считающая площадь прямоугольника
// принимает в качестве параметров и возвращает целочисленный тип u32
fn area(width: u32, height: u32) -> u32 {
width * height
}
Изначально Rust появился как личный проект Грейдона Хоара в 2006 году, когда он работал в Mozilla Research.
«Rust» переводится как «ржавчина». Однако речь идет не о процессе окисления металла, а о грибковых патогенах, которые покрывают листья растений в характерный коричневый цвет, напоминающий ржавчину.
В 2009 году Mozilla начала спонсировать Rust официально и наняла десяток инженеров для помощи Грейдону.
В 2011 году, как часто бывает у языков программирования, компилятор Rust смог скомпилировать сам себя. Тогда же появился привычный логотип с шестеренкой — на самом деле это велосипедная передача для цепи.
До 2015 года Rust был внутренним проектом — о нем мало кто знал и он нигде не использовался. Но именно после 2015 года Rust стал выглядеть, как потенциальный преемник C++. тогда вышел первый стабильный релиз Rust 1.0.
После коронавируса (в рамках реструктуризации) Mozilla стала увольнять сотрудников, многие из которых работали над Rust. В итоге из-за различных опасений в 2020 году был создан фонд — Rust Foundation. В него вошли пять компаний-основателей, заинтересованных в поддержке языка: Mozilla, AWS, Huawei, Google, Microsoft.
Более того, с 2021 года Google теперь поддерживает Rust в разработке приложений для Android наравне с C/C++.
Основные отличия Rust от C++:
-
Элегантный синтаксис. Rust стремится к современному синтаксису, лаконичности кода и удобству чтения. C++ имеет более сложный синтаксис и большую базу уже существующего кода, что иногда делает его менее удобным для новых разработчиков.
-
Безопасная память. Rust использует так называемую систему «владения и заимствования» для управления памятью, тем самым предотвращая утечки и ошибки на уровне компиляции. Компилятор проверяет время жизни переменных и гарантирует отсутствие обращений к уже освобожденной памяти. C++, напротив, позволяет вручную управлять памятью с помощью соответствующих ключевых слов и функций: new, delete, malloc и free. Да, это увеличивает гибкость, но в то же время требует от программиста большей осторожности.
-
Единообразная компиляция. У Rust есть основной компилятор, который поставляется с пакетным менеджером Cargo для управления зависимостями и сборки проектов. В этом смысле Rust более един и централизован. А значит, в его инфраструктуре сложнее запутаться. А вот у C++ есть множество поставщиков компиляторов (GCC, Clang, MSVC), каждый из которых по-своему поддерживает общий стандарт языка. То же касается внешних систем сборки и пакетных менеджеров. Неопытному разработчику это может показаться одним большим беспорядком.
Rust выглядит более свежим, но менее зрелым языком, чем C++. Поэтому он — идеальное решение для тех, кто хочет писать низкоуровневые решения, но в современной парадигме (синтаксис, работа с памятью) и окружении (компилятор, менеджер пакетов, документация, комьюнити).
Год выпуска |
2015 |
Разработчик |
Mozilla (Грейдон Хоар), Rust Foundation |
Расширение файлов |
.rs и .rlib |
Пакетный менеджер |
|
Официальный сайт |
2. Golang
Golang — компилируемый язык программирования, разработанный компанией Google. Хотя обычно его называют просто Go. Но ни в коем случае не путайте Go с Go! — последний имеет восклицательный знак в конце названия и является совершенно другим языком программирования.
С самого начала Go задумывался как более современная замена C и C++ — такая же высокоэффективная и способная работать на распределенных системах, вроде многоядерных процессоров.
Однако Go не был продуктом энтузиазма какого-либо сотрудника Google — он возник из сугубо прикладной мотивации и был призван решить реальные проблемы, с которыми сталкивался Google при разработке своих сервисов.
Go стремился вобрать в себя простоту динамических языков, вроде Python или Ruby, и производительность компилируемых языков, вроде C и C++. Но, в отличие от «плюсов» и Rust, в Golang имеется сборщик мусора.
Вот пример простого HTTP-сервера на Go:
// объявление главного пакета
package main
// подключение библиотек консольного вывода и работы с HTTP-соединением
import (
"fmt"
"net/http"
)
// функция обработки запроса hello
func hello(w http.ResponseWriter, req *http.Request) {
fmt.Fprintf(w, "hello\n") // вывод приветствия в консоль
}
// функция обработки запроса headers
func headers(w http.ResponseWriter, req *http.Request) {
for name, headers := range req.Header {
for _, h := range headers {
fmt.Fprintf(w, "%v: %v\n", name, h) // вывод HTTP-заголовка в консоль
}
}
}
func main() {
// поочередное добавление обработчиков запросов к роутеру
http.HandleFunc("/hello", hello)
http.HandleFunc("/headers", headers)
// запуск сервера
http.ListenAndServe(":8090", nil)
}
Разумеется, Go не настолько быстрый, как C++, но его производительности более чем достаточно для большинства приложений.
А еще у Golang есть собственный встроенный пакетный менеджер Go Package Manager.
Кстати, на Golang написали некоторые популярные инструменты разработки:
-
Docker. Самый известный и, возможно, самый сложный продукт, написанный на Go — открытая платформа для контейнеризации приложений.
-
Kubernetes. Система оркестрации контейнеров, тесно связанная с Docker, тоже написана на Go. Более того, Kubernetes написали сами создатели языка — разработчики из Google. Можно сказать, что Kubernetes — одна из внутренних разработок Google, для которых и задумывался Golang.
-
Container Linux. Не вся целиком, но большая часть компонентов этой легковесной операционной системы написаны на Golang.
Год выпуска |
2009 |
Разработчик |
|
Расширение файлов |
.go |
Пакетный менеджер |
|
Официальный сайт |
3. Swift
Swift — это язык программирования от компании Apple, который предназначен для разработки приложений на закрытых платформах компании: iOS и macOS. На удивление (учитывая тотальную закрытость всех разработок Apple), язык имеет открытый исходный код.
Также, как и Golang, язык Swift имеет собственный официальный пакетный менеджер The Swift Package Manager — сокращенно просто SwiftPM.
Вот пример кода на Swift, в котором реализована логика отгадывания числа через консоль:
// подключение библиотеки для работы с консолью
import Foundation
// генерация случайного числа от 1 до 100
let secretNumber = Int.random(in: 1...100)
var guess: Int?
var attempts = 0
print("Попробуйте угадать число от 1 до 100.")
// цикл, внутри которого выполняется работа с консолью
while guess != secretNumber {
print("Введите число: ", terminator: "")
if let input = readLine(), let number = Int(input) {
guess = number
attempts += 1
if number < secretNumber {
print("Мое число больше.")
} else if number > secretNumber {
print("Мое число меньше.")
} else {
print("Поздравляем! Вы угадали число за \(attempts) попыток.")
}
} else {
print("Некорректное число. Введите еще раз.")
}
}
Из-за закрытости платформ Apple язык Swift подойдет только для:
-
мобильных разработчиков, которые пишут приложения под операционную систему iOS;
-
десктопных разработчиков, которые пишут приложения под операционную систему macOS;
-
геймдев-разработчиков, которые пишут игры игры под все платформы Apple;
-
бэкенд-разработчиков сайтов, которые работают с веб-библиотеками Swift;
То есть любые другие платформы, будь то Windows, Linux или Android, не подойдут для финального запуска приложений, написанных на Swift.
Более того, с большей вероятностью разработчикам, которым нужна качественная поддержка нативных функций Apple, просто придется погрузиться в Swift. Благо его синтаксис похож на другие C-подобные языки.
Год выпуска |
2014 |
Разработчик |
Apple |
Расширение файлов |
.swift |
Пакетный менеджер |
The Swift Package Manager (SwiftPM) |
Официальный сайт |
4. Carbon
Carbon — это абсолютно новый (он появился в 2022 году) компилируемый язык общего назначения от компании Google, который позиционируется как более синтаксически элегантный преемник C++.
Язык имеет открытый исходный код, поэтому любой желающий может ознакомится с его реализацией в официальном репозитории на GitHub.
На момент 2024 года Carbon все еще находится на стадии экспериментальной версии — готовая к производству ожидается только после 2027 года.
Вот небольшой пример кода на Carbon:
package Geometry; // код ниже будет содержимым пакета Geometry
import Math; // подключение библиотеки с математическими функциями
// пользовательский класс
class Circle {
var radius: f32; // переменная типа float32
}
// пользовательская функция
fn PrintTotalArea(circles: Slice(Circle)) {
var area: f32 = 0;
for (circle: Circle in circles) {
area += Math.Pi * circle.radius * circle.radius;
}
Print("Площадь круга: {0}", area);
}
// entry point, который возвращает переменную типа int32
fn Main() -> i32 {
// Array является аналогом динамического массива std::vector
var circles: Array(Circle) = ({.radius = 1.0}, {.radius = 2.0});
// при передаче аргументов в функцию происходит неявная конвертация типа Array в Slice
PrintTotalArea(circles);
return 0;
}
Кстати синтаксис Carbon очень похож на синтаксис Rust, хотя и не полностью. Есть 2 причины появления Carbon. Ну или мотивации его создания:
-
Свежая идея. Основной системный язык общего назначения на сегодняшний день, C++, выглядит громоздким и архаичным. По крайней мере, приличное количество людей из коммьюнити склонно так полагать. Да, C++ по прежнему имеет множество уникальных особенностей, однако всегда есть путь дальнейшего улучшения — превращение языка в более быструю, эффективную и синтаксически лаконичную форму. И иногда улучшать уже существующую базу, большую и сложную, гораздо тяжелее, чем проектировать с нуля. Carbon — тот самый новый язык, стремящийся вобрать в себя достоинства C++, но исключить его недостатки.
-
Бизнес-решение. Google — это огромная корпорация мирового уровня. Большая часть того, что нас окружает (поисковик, сервисы, Android) — это все Google. И именно он использует C++ больше всего. По этой причине Google на протяжении последних 20 лет вкладывал огромные ресурсы в поддержку и улучшение этого языка, его компиляторов, инструментов (например, Clang-Tidy и Google C++ Style Guide) и библиотек. Во многом он влиял на философию написания кода, которая окутывает язык. А еще долгое время состоял национальной рабочей группе по стандартизации С++. А теперь представьте, что вы хотите внести серьезное (а, возможно, и не серьезное) изменение в язык, но не можете этого сделать — огромный легаси, написанный 20 лет назад и который нечем заменить (либо это очень дорого) просто сломается. Это сильно ограничивает Google в решении технических задач и заставляет сервисы компании стагнировать. Поэтому Carbon — следствие бизнес-потребности Google.
На самом деле Apple сделала то же самое. Компании надоело возиться с крайне инертным C++, и она заменила его его на Swift. Не полностью, но заменила — ядро ОС по-прежнему на «плюсах», а клиентские приложения уже на Swift.
Вот несколько важных особенностей Carbon:
-
Обратная совместимость. Код C++ можно включать в файлы Carbon. Компилятор в любом случае преобразует их в один формат и соберет рабочую программу. Однако разработчики Carbon не обещают совместимость навечно. Если Carbon действительно сможет полностью заменить C++, то поддержка последнего вряд ли будет нужна.
-
Централизованная поддержка. Изменения в языке решают только руководством Carbon — никаких комитетов и рабочих групп с многочисленными участниками. С другой стороны, это не исключает получения полезной обратной связи от разработчиков других крупных компаний и IT-гигантов.
-
Регулярные обновления. Новые функции в язык C++ приходится ждать десятилетиями. Пока кто-то придумает новую фичу в виде отдельной библиотеки, пока кто-то ее протестирует, пока о ней узнают в комитете, пока согласуют, доработают, добавят в стандарт и так далее и тому подобное. Короче, целая вечность. С Carbon все иначе — обновления языка, даже самые незначительные, будут выходить регулярно. CI/CD во всей красе!
-
Модульная система. Carbon имеет более интуитивную систему модулей — файлы с кодом объединяются в абстракцию, под названием «пакет». Каждый такой пакет можно импортировать и использовать его функции. В C++ с этим немного сложнее. Нужно выполнять «инклуды» и в явном виде помогать препроцессору языка собрать все воедино. Тем не менее, пакетный менеджер для управления зависимости пока на уровне дискуссии в GitHub — некоторые разработчики, разумеется, желают увидеть официальный пакетный менеджер Carbon.
-
Шаблоны. Система шаблонов в C++ имеет свои нюансы и фишки, многие из которых непонятны новичкам или напрочь контринтуитивны. Шаблонизация в Carbon обещает быть нагляднее — так же, как она реализована в Rust.
Тем не менее Carbon все еще в неопределенности. Никто не знает, что будет с языком завтра. Поэтому, если и учить Carbon сегодня, то только ради интереса и общего развития. На текущий момент действительно стабильная альтернатива C++ — Rust.
Год выпуска |
2022 |
Разработчик |
Google (Чендлер Каррут) |
Расширение файлов |
.carbon |
Пакетный менеджер |
— |
Официальный сайт |
Заключение
Так или иначе, C++ до сих пор является наилучшим вариантом для инвестирования своего времени, способностей, интеллектуального и психического ресурса. Альтернативы ему нет. Ну, при условии, что вам требуется системное программирование с высоким быстродействием кода.
Тем не менее стоять на месте нельзя. Относительно «древний» каркас C++, берущий свое начало в прошлом столетии, все еще работает и разумеется решает задачи, но не поспевает за современной разработкой.
Даже сам создатель C++ как-то сказал:
«Эволюция необходима, чтобы справляться с вызовами меняющегося мира и реализовывать новые идеи».
(«Evolution is necessary to meet the challenges of a changing world and to incorporate new ideas»)
Старые дома можно реставрировать до поры до времени. Построить же новый мегаполис можно только полностью с нуля — после сноса старого. С соблюдением всех современных стандартов.
НЛО прилетело и оставило здесь промокод для читателей нашего блога:
-15% на заказ любого VDS (кроме тарифа Прогрев) — HABRFIRSTVDS