Альтернативы для замены C++: Rust, Go, Swift, Carbon

Альтернативы для замены C++: Rust, Go, Swift, Carbon

Язык программирования 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), каждый из которых по-своему поддерживает общий стандарт языка. То же касается внешних систем сборки и пакетных менеджеров. Неопытному разработчику это может показаться одним большим беспорядком.

Мем virgin/chad про Rust и C++ (источник: Skillbox Media)
Мем virgin/chad про Rust и C++ (источник: Skillbox Media)

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

Год выпуска

2015

Разработчик

Mozilla (Грейдон Хоар), Rust Foundation

Расширение файлов

.rs и .rlib

Пакетный менеджер

Cargo

Официальный сайт

rust-lang.org

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

Разработчик

Google

Расширение файлов

.go

Пакетный менеджер

Go Package Manager

Официальный сайт

go.dev

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)

Официальный сайт

swift.org

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

Пакетный менеджер

Официальный сайт

github.com/carbon-language/carbon-lang

Заключение

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

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

Даже сам создатель C++ как-то сказал:

Бьерн Страуструп, компьютерный инженер, разработчик первых версий C++
Бьерн Страуструп, компьютерный инженер, разработчик первых версий C++

«Эволюция необходима, чтобы справляться с вызовами меняющегося мира и реализовывать новые идеи».

Evolution is necessary to meet the challenges of a changing world and to incorporate new ideas»)

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


НЛО прилетело и оставило здесь промокод для читателей нашего блога:
-15% на заказ любого VDS (кроме тарифа Прогрев) — HABRFIRSTVDS

 

Источник

Читайте также