- PVSM.RU - https://www.pvsm.ru -

Языки программирования, которые могут заменить C++ — Rust, Go, Swift, Carbon

Языки программирования, которые могут заменить C++ — Rust, Go, Swift, Carbon - 1

Язык программирования C++, на котором написано 95% существующего программного обеспечения, был создан Бьерном Страуструпом [1], датским инженером со странноватой прической, в далеком 1985 году — очень давно!

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

Но 40 лет — это много. Все это время IT-индустрия открывала инсайты, меняла подходы к разработке ПО, придумывала новые методологии и архитектуры, развивала другие языки и их синтаксисы. В общем, аспекты разработки сильно менялись, эволюционировали.

Поспевал ли за этими изменениями C++? Он старался. И старается до сих пор. НО!

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

Разработка C++ децентрализована, а разработчиков компиляторов как минимум 3 — каждый понимает стандарт по своему и дополнительно добавляет собственные уникальные фичи. То же самое касается пакетных менеджеров и систем сборки. Говоря иначе — хаос. Хаос, тормозящий развитие языка, его понимание и поддержку.

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

Короче говоря, низкоуровневая свобода имеет свои издержки. И делает язык сложнее и опаснее.

Многие крупные компании (об этом чуть ниже) стремятся объединить усилия, создав полную замену C++ — лаконичную, понятную, безопасную и такую же быструю. Сделать этого пока не удалось, но прогресс есть.

В статье мы разберем наиболее популярные и перспективные C-подобные языки, которые в ближайшем (ну или не очень ближайшем) будущем имеют право заменить C++, став его преемником. Важно подчеркнуть, «имеют право» — вполне возможно, они не сделают этого никогда.

1. Rust

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

Однако в отличие от «плюсов», он обеспечивает полную безопасность памяти — все ссылки указывают только на допустимую память. При этом Rust не использует автоматический сборщик мусора [2] — вместо этого он отслеживает время жизни объекта и его ссылки еще на стадии компиляции программы.

Языки программирования, которые могут заменить C++ — Rust, Go, Swift, Carbon - 2

Rust, как и C++, используется в системном программировании. Язык довольно нейтрален и не навязывает какую-либо парадигму программирования, но во многом он построен на идеях функционального программирования. Разумеется, в языке есть все необходимые типы данных и для ООП [3]: структуры (struct), перечисления (enum), черты (trait) и методы (fn).

Вот небольшой пример кода [4] на 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» переводится как «ржавчина». Однако речь идет не о процессе окисления металла, а о грибковых патогенах [5], которые покрывают листья растений в характерный коричневый цвет, напоминающий ржавчину.

В 2009 году Mozilla начала спонсировать Rust официально и наняла десяток инженеров для помощи Грейдону.

В 2011 году, как часто бывает у языков программирования, компилятор Rust смог скомпилировать сам себя. Тогда же появился привычный логотип с шестеренкой — на самом деле это велосипедная передача для цепи.

До 2015 года Rust был внутренним проектом — о нем мало кто знал и он нигде не использовался. Но именно после 2015 года Rust стал выглядеть, как потенциальный преемник C++. тогда вышел первый стабильный релиз Rust 1.0 [6].

После коронавируса (в рамках реструктуризации) Mozilla стала увольнять сотрудников [7], многие из которых работали над Rust. В итоге из-за различных опасений в 2020 году был создан фонд — Rust Foundation [8]. В него вошли пять компаний-основателей, заинтересованных в поддержке языка: 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 [9])

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

Год выпуска

2015

Разработчик

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

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

.rs и .rlib

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

Cargo [10]

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

rust-lang.org [11]

2. Golang

Golang — компилируемый язык программирования, разработанный компанией Google. Хотя обычно его называют просто Go. Но ни в коем случае не путайте Go с Go!последний [12] имеет восклицательный знак в конце названия и является совершенно другим языком программирования.

Языки программирования, которые могут заменить C++ — Rust, Go, Swift, Carbon - 4

С самого начала 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, "hellon") // вывод приветствия в консоль
}

// функция обработки запроса headers
func headers(w http.ResponseWriter, req *http.Request) {
    for name, headers := range req.Header {
        for _, h := range headers {
              fmt.Fprintf(w, "%v: %vn", name, h) // вывод HTTP-заголовка в консоль
    }
  }
}

func main() {
    // поочередное добавление обработчиков запросов к роутеру
    http.HandleFunc("/hello", hello)
    http.HandleFunc("/headers", headers)

    // запуск сервера
    http.ListenAndServe(":8090", nil)
}

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

А еще у Golang есть собственный встроенный пакетный менеджер Go Package Manager [13].

Кстати, на Golang написали некоторые популярные инструменты разработки:

  • Docker. Самый известный и, возможно, самый сложный продукт, написанный на Go — открытая платформа для контейнеризации приложений.

  • Kubernetes. Система оркестрации контейнеров, тесно связанная с Docker, тоже написана на Go. Более того, Kubernetes написали сами создатели языка — разработчики из Google. Можно сказать, что Kubernetes — одна из внутренних разработок Google, для которых и задумывался Golang.

  • Container Linux. Не вся целиком, но большая часть компонентов этой легковесной операционной системы написаны на Golang.

Год выпуска

2009

Разработчик

Google

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

.go

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

Go Package Manager [13]

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

go.dev [14]

3. Swift

Swift — это язык программирования от компании Apple, который предназначен для разработки приложений на закрытых платформах компании: iOS и macOS. На удивление (учитывая тотальную закрытость всех разработок Apple), язык имеет открытый исходный код [15].

Также, как и Golang, язык Swift имеет собственный официальный пакетный менеджер The Swift Package Manager [16] — сокращенно просто 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 [16] (SwiftPM)

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

swift.org [17]

4. Carbon

Carbon — это абсолютно новый (он появился в 2022 году) компилируемый язык общего назначения от компании Google, который позиционируется как более синтаксически элегантный преемник C++.

Язык имеет открытый исходный код, поэтому любой желающий может ознакомится с его реализацией в официальном репозитории на GitHub [18].

Языки программирования, которые могут заменить C++ — Rust, Go, Swift, Carbon - 5

На момент 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++, выглядит громоздким и архаичным. По крайней мере, приличное количество людей из коммьюнити склонно так полагать [19]. Да, C++ по прежнему имеет множество уникальных особенностей, однако всегда есть путь дальнейшего улучшения — превращение языка в более быструю, эффективную и синтаксически лаконичную форму. И иногда улучшать уже существующую базу, большую и сложную, гораздо тяжелее, чем проектировать с нуля. Carbon — тот самый новый язык, стремящийся вобрать в себя достоинства C++, но исключить его недостатки.

  • Бизнес-решение. Google — это огромная корпорация мирового уровня. Большая часть того, что нас окружает (поисковик, сервисы, Android) — это все Google. И именно он использует C++ больше всего. По этой причине Google на протяжении последних 20 лет вкладывал огромные ресурсы в поддержку и улучшение этого языка, его компиляторов, инструментов (например, Clang-Tidy [20] и Google C++ Style Guide [21]) и библиотек. Во многом он влиял на философию написания кода, которая окутывает язык. А еще долгое время состоял национальной рабочей группе по стандартизации С++. А теперь представьте, что вы хотите внести серьезное (а, возможно, и не серьезное) изменение в язык, но не можете этого сделать — огромный легаси, написанный 20 лет назад и который нечем заменить (либо это очень дорого) просто сломается. Это сильно ограничивает Google в решении технических задач и заставляет сервисы компании стагнировать. Поэтому Carbon — следствие бизнес-потребности Google.

На самом деле Apple сделала то же самое. Компании надоело возиться с крайне инертным C++, и она заменила его его на Swift. Не полностью, но заменила — ядро ОС по-прежнему на «плюсах», а клиентские приложения уже на Swift.

Вот несколько важных особенностей Carbon:

  • Обратная совместимость. Код C++ можно включать в файлы Carbon. Компилятор в любом случае преобразует их в один формат и соберет рабочую программу. Однако разработчики Carbon не обещают совместимость навечно. Если Carbon действительно сможет полностью заменить C++, то поддержка последнего вряд ли будет нужна.

  • Централизованная поддержка. Изменения в языке решают только руководством Carbon — никаких комитетов и рабочих групп с многочисленными участниками. С другой стороны, это не исключает получения полезной обратной связи от разработчиков других крупных компаний и IT-гигантов.

  • Регулярные обновления. Новые функции в язык C++ приходится ждать десятилетиями. Пока кто-то придумает новую фичу в виде отдельной библиотеки, пока кто-то ее протестирует, пока о ней узнают в комитете, пока согласуют, доработают, добавят в стандарт и так далее и тому подобное. Короче, целая вечность. С Carbon все иначе — обновления языка, даже самые незначительные, будут выходить регулярно. CI/CD во всей красе!

  • Модульная система. Carbon имеет более интуитивную систему модулей — файлы с кодом объединяются в абстракцию, под названием «пакет». Каждый такой пакет можно импортировать и использовать его функции. В C++ с этим немного сложнее. Нужно выполнять «инклуды» и в явном виде помогать препроцессору языка собрать все воедино. Тем не менее, пакетный менеджер для управления зависимости пока на уровне дискуссии в GitHub [22] — некоторые разработчики, разумеется, желают увидеть [23] официальный пакетный менеджер Carbon.

  • Шаблоны. Система шаблонов в C++ имеет свои нюансы и фишки, многие из которых непонятны новичкам или напрочь контринтуитивны. Шаблонизация в Carbon обещает быть нагляднее — так же, как она реализована в Rust.

Тем не менее Carbon все еще в неопределенности. Никто не знает, что будет с языком завтра. Поэтому, если и учить Carbon сегодня, то только ради интереса и общего развития. На текущий момент действительно стабильная альтернатива C++ — Rust.

Год выпуска

2022

Разработчик

Google (Чендлер Каррут)

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

.carbon

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

-

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

github.com/carbon-language/carbon-lang [24]

Заключение

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

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

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

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

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

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

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

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


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

Автор: gov0run

Источник [27]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/c-3/394801

Ссылки в тексте:

[1] был создан Бьерном Страуструпом: https://ru.wikipedia.org/wiki/%D0%A1%D1%82%D1%80%D0%B0%D1%83%D1%81%D1%82%D1%80%D1%83%D0%BF,_%D0%91%D1%8C%D1%91%D1%80%D0%BD

[2] сборщик мусора: https://ru.wikipedia.org/wiki/%D0%A1%D0%B1%D0%BE%D1%80%D0%BA%D0%B0_%D0%BC%D1%83%D1%81%D0%BE%D1%80%D0%B0#:~:text=garbage%20collection)%20%D0%B2%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B8%20%E2%80%94%20%D0%BE%D0%B4%D0%BD%D0%B0,%D0%BF%D0%BE%D0%B2%D1%8B%D1%81%D0%B8%D1%82%D1%8C%20%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D1%81%D1%82%D1%8C%20%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%D0%B0%20%D0%BA%20%D0%BF%D0%B0%D0%BC%D1%8F%D1%82%D0%B8.

[3] ООП: https://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BD%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5

[4] пример кода: https://doc.rust-lang.org/book/ch05-02-example-structs.html

[5] грибковых патогенах: https://en.wikipedia.org/wiki/Rust_(fungus)

[6] релиз Rust 1.0: https://blog.rust-lang.org/2015/05/15/Rust-1.0.html

[7] Mozilla стала увольнять сотрудников: https://www.opennet.ru/opennews/art.shtml?num=53533

[8] Rust Foundation: https://foundation.rust-lang.org/

[9] Skillbox Media: https://skillbox.ru/media/code/chem-rust-luchshe-plyusov/

[10] Cargo: https://doc.rust-lang.org/cargo/

[11] rust-lang.org: https://www.rust-lang.org/

[12] последний: https://ru.wikipedia.org/wiki/Go!

[13] Go Package Manager: https://pkg.go.dev/

[14] go.dev: https://go.dev/

[15] открытый исходный код: https://www.swift.org/documentation/source-code/

[16] The Swift Package Manager: https://www.swift.org/documentation/package-manager/

[17] swift.org: http://swift.org

[18] официальном репозитории на GitHub: https://github.com/carbon-language/carbon-lang

[19] склонно так полагать: https://www.reddit.com/r/cpp/comments/8v0gcz/why_do_so_many_people_consider_c_to_be_difficult/

[20] Clang-Tidy: https://clang.llvm.org/extra/clang-tidy/

[21] Google C++ Style Guide: https://google.github.io/styleguide/cppguide.html

[22] дискуссии в GitHub: https://github.com/carbon-language/carbon-lang/discussions/3669

[23] желают увидеть: https://github.com/carbon-language/carbon-lang/discussions/1481

[24] github.com/carbon-language/carbon-lang: http://github.com/carbon-language/carbon-lang

[25] сказал: https://www.stroustrup.com/quotes.html

[26] -15% на заказ любого VDS: https://firstvds.ru/?utm_source=habr&utm_medium=article&utm_campaign=product&utm_content=vds15exeptprogrev

[27] Источник: https://habr.com/ru/companies/first/articles/838752/?utm_campaign=838752&utm_source=habrahabr&utm_medium=rss