Rust (язык)
| Класс языка | мультипарадигменный, системный |
|---|---|
| Появился в | 2010 (публично), 1.0 — 15 мая 2015 |
| Автор | Грейдон Хоар |
| Разработчик | проект Rust, Rust Foundation (с 2021) |
| Выпуск версий | каждые 6 недель; редакции 2015, 2018, 2021, 2024 |
| Типизация | статическая, строгая, с выводом типов |
| Управление памятью | владение и заимствование, без сборщика мусора |
| Компилятор | rustc (бэкенд LLVM) |
| Расширение файлов | .rs |
| Лицензия | MIT / Apache 2.0 |
| Сайт | rust-lang.org |
Rust — компилируемый системный язык программирования, который сочетает производительность уровня C и C++ с гарантиями безопасности памяти. Ошибки вроде обращения к освобождённой памяти, двойного освобождения и гонок данных отсекаются ещё на этапе компиляции благодаря системе владения и заимствования, без сборщика мусора и без накладных расходов во время работы программы. Rust используют для операционных систем, браузеров, сетевых сервисов, инструментов командной строки и WebAssembly.
История
Грейдон Хоар начал Rust как личный проект в 2006 году; в 2009-м его разработку стала спонсировать Mozilla, рассчитывая использовать язык для нового браузерного движка Servo. Ранние версии сильно отличались от современной: в языке были сборщик мусора и зелёные потоки, от которых впоследствии отказались.
Стабильная версия Rust 1.0 вышла 15 мая 2015 года с обещанием обратной совместимости.[2] С тех пор новые версии выходят каждые шесть недель.[6] Несовместимые изменения синтаксиса вводятся через редакции (editions) — 2015, 2018, 2021 и 2024; крейты разных редакций свободно работают вместе.[4]
В 2021 году создан независимый фонд Rust Foundation, учредителями которого стали AWS, Google, Huawei, Microsoft и Mozilla.[3] В 2022 году поддержка Rust вошла в ядро Linux (версия 6.1) как второй язык после C.[5] Язык много лет подряд возглавлял опрос Stack Overflow в номинации «самый любимый». Неофициальный талисман — краб Феррис.
Ключевые идеи
- Владение. У каждого значения ровно один владелец; когда владелец выходит из области видимости, значение освобождается. Передача значения перемещает владение.
- Заимствование. Можно одновременно иметь либо сколько угодно неизменяемых ссылок
&T, либо одну изменяемую&mut T. Это правило исключает гонки данных. - Абстракции без накладных расходов. Итераторы, замыкания, обобщённые типы компилируются в код, сравнимый с написанным вручную.
- Алгебраические типы и сопоставление с образцом.
enumс данными иmatch, проверяющий полноту вариантов. - Нет null и исключений. Отсутствие значения выражается типом
Option<T>, ошибка —Result<T, E>(см. Обработка ошибок в Rust (Result, ?)). - Трейты вместо наследования (см. Трейты (Rust)).
Пример
use std::collections::HashMap;
fn word_count(text: &str) -> HashMap<String, usize> {
let mut counts = HashMap::new();
for word in text.split_whitespace() {
*counts.entry(word.to_lowercase()).or_insert(0) += 1;
}
counts
}
fn main() {
let counts = word_count("Раз два раз три раз");
match counts.get("раз") {
Some(n) => println!("«раз» встречается {n} раз(а)"),
None => println!("не найдено"),
}
}
Инструменты
Экосистема собрана вокруг официальных утилит:
- rustup — установка компилятора и переключение между версиями;
- Cargo — сборка, зависимости, тесты, публикация пакетов (крейтов) на crates.io;
- Clippy и rustfmt — линтер и форматировщик;
- rust-analyzer — языковой сервер для редакторов.
Компилятор славится подробными сообщениями об ошибках с подсказками, как их исправить.
Применение
- системное ПО: компоненты Windows, Android, ядра Linux;
- инфраструктура: прокси, базы данных, среды исполнения (например, Deno);
- инструменты разработчика: Ruff и uv для Python, ripgrep, сборщики JavaScript;
- встраиваемые системы и WebAssembly.
Сравнение
| Rust | C++ | Go | |
|---|---|---|---|
| Безопасность памяти | гарантирована компилятором (вне unsafe) |
на совести программиста | сборщик мусора |
| Сборщик мусора | нет | нет | есть |
| Скорость компиляции | низкая | низкая | высокая |
| Порог входа | высокий | высокий | низкий |
Для низкоуровневых операций, которые компилятор не может проверить, есть блоки unsafe (см. Unsafe Rust).
Критика
Главные претензии — крутая кривая обучения (споры с «проверяющим заимствования»), долгая компиляция больших проектов и сложность асинхронного программирования. Кроме того, экосистема моложе, чем у C++ или Java, и ряд библиотек ещё не достиг версии 1.0.
См. также
- Владение и заимствование (Rust)
- Cargo и crates.io
- Go vs Rust — сравнение
- Сборка мусора vs ручное управление памятью