Довольно часто вижу баталии на форумах вокруг Rust, и тут снова масла в огонь подлила история с Linux ядром и разработчиком Asahi Linux. Коммьюнити Rust часто обвиняют в токсичности, но по моим наблюдениям, нападают в основном именно на Rust: сложный синтаксис, много скобочек, зачем вы переписали X на Rust и т.д. Чтобы не быть жертвой эмоций и реально понять насколько обоснованы претензии к Rust, я потратил около месяца на учебник по Rust от Стива Клабника и Кэрол Николс.

Бэкграунд

У меня высшее образование по специальности “Прикладная математика”. Свою первую работу я получил на 5-м курсе универа в качестве (btw) Си программиста. Потом поменял направление на администрирование, и программированием занимался либо в качестве хобби, либо для написания небольших утилит, скриптов и прочего.

“Много скобочек”

Наличие стрелочек-скобочек обусловоенно несколькими вещами:

  • строгой типизацией. Необходимо указывать типы переменых, аргументов и возвращаемых значений функций
  • гибкая система обобщенных типов. В 70% случаев “много скобочек” будут именно про это
fn process<T: Display>(item: T) -> String {
    format!("Value: {}", item)
}
  • анонимные функции/замыкания
let multiply = |x: i32| x * 2;
println!("{}", multiply(5)); // 10

Если вы писали на JS, Python, PHP.. - да, это может выглядеть необычно, но позволяет писать гибкий и лаконичный код, не плодя дополнительные сущности. Хотя те же замыкания активно используются в JS и иногда понять, что же делает конкретный код в JS намного сложнее, особенно с его способностью приводить любой тип к чему угодно.

Что касается синтаксиса Rust, достаточно прочесть 10 из 20 глав упомянутого выше учебника, чтобы синтаксис стал вполне понятным и читаемым. Rust вобрал в себя идеи из разных языков программирования, от C++ до Haskel, и в этом плане ничего выходящего за рамки понимания при привносит.

Зависимость от crates.io

Типичный критик Rust

Типичный критик Rust: Вот отключат crates.io и что вы будете делать?

Да, для rust существует свой пакетный менеджер и репозиторий библиотек crates.io, но:

  • любой желающий может поднять свой приватный репозиторий и делать с ним что угодно
  • зависимости в проектах могут ссылаться на локальные библиотеки, которые лежат физически у вас на диске рядом с вашим проектом
[dependencies]
regex-lite   = { path = "../regex/regex-lite" }
  • зависимости могут ссылаться на git-репозитории, где вы можете указывать конкретные ветки/тэги/коммиты которые должны использоваться для сборки проекта
[dependencies]
regex = { git = "https://github.com/rust-lang/regex.git", tag = "1.10.3" }

Crate - это не ошейник, который привязывает вас к crates.io, это гибкий инструмент, можете использовать его как считаете нужным.

Борьба с компилятором/боров-чекером

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

Единственное, на что я потратил несколько дней, - это life time (время жизни) конкретно применительно к структурам. Зачем указывать время жизни структурам и полям помогло вот это видео на Youtube “Crust of Rust: Lifetime Annotations”:

В целом работа с указателями вполне логичная, если понимать какие задачи хотели решить создатели языка. Вы просто принимаете (или нет) это решение и живете дальше. Если вам нужен код, где с одной стороны не будет проблем с записью за границы буфера или обращение к null-указателям, а с другой - нет проблем, связанных со сборщиками мусора, - то Rust отличное решение.

На начальном этапе можно решить проблемы владения с помощью clone() и потом, при необходимости, оптимизировать.

Что касается ошибок компилятора - это лучшее, что я видел по сравнению с другими языками.

Выводы и впечатления

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

Мне понравился вывод компилятора, ошибки хорошо читаемы, часто там же указано как решить указанную проблему.

Замыкания, итераторы, трейты, обобщеные типы и т.д. делают язык современным и выразительным.

Отличная производительность на уровне С/C++, zero-cost абстракции.

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

Пока впечатления от языка в целом положительные, хотя есть особености к котрым надо привыкнуть. В конечном счёте, выбор языка должен основываться на специфике задачи, а не на эмоциях. Если вам важны безопасность, производительность и контроль над ресурсами, Rust может стать оптимальным решением для системного программирования, высоконагруженных сервисов и других критичных по стабильности проектов.