Перейти к основному содержимому

Первая программа на Rust

Разработчику Архитектору

Play ITЗагрузка интерактивного демо…


Первая программа на Rust​

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


Где применяют Rust​

Rust даёт производительность уровня C/C++ и безопасность памяти без сборщика мусора — через владение и borrow checker. Сборка и зависимости — Cargo. После этой статьи: типы и владение, затем Axum.


Что сделаем по шагам​

ЭтапРезультат
Установкаrustc и cargo в PATH
ПроектCargo.toml и src/main.rs
Запускcargo run

Borrow checker можно освоить позже — сейчас важно собрать и запустить проект.


Установка инструментов​

Для работы с Rust требуется установка набора инструментов, известного как Rustup. Это официальный установщик и менеджер версий языка. Он автоматически загружает и настраивает всё необходимое — компилятор rustc, менеджер пакетов и зависимостей cargo, а также документацию.


Шаг 1. Скачивание и запуск установщика​

На Linux/macOS — установщик rustup:

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

Разбор:

  • curl скачивает установочный скрипт с официального адреса https://sh.rustup.rs.
  • Флаг --proto '=https' запрещает небезопасные протоколы и оставляет только HTTPS.
  • Флаг --tlsv1.2 требует современную версию TLS для защищённого канала.
  • -sSf делает вывод аккуратным — скрывает прогресс, но показывает ошибку, если загрузка неуспешна.
  • Конструкция | sh передаёт содержимое скрипта в оболочку для немедленного выполнения.
  • В результате запускается инсталлятор rustup, который ставит rustc, cargo и служебные компоненты.

Эта команда загружает скрипт установки с официального сайта и передаёт его интерпретатору оболочки. Скрипт спрашивает, какую конфигурацию выбрать. Рекомендуется оставить вариант по умолчанию — default host triple — и нажать Enter. Это установит стабильную версию Rust для текущей операционной системы и архитектуры.

На Windows процесс аналогичен. Следует скачать исполняемый файл rustup-init.exe с официального сайта и запустить его. Установщик предложит те же варианты, что и в Unix-версии.


Шаг 2. Обновление переменной окружения PATH​

После завершения установки скрипт автоматически добавляет каталог ~/.cargo/bin в переменную окружения PATH. Это необходимо для того, чтобы команды rustc и cargo были доступны из любого места в терминале.

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

source "$HOME/.cargo/env"

Разбор:

  • source исполняет файл в текущей shell-сессии, а не в отдельном процессе.
  • Путь "$HOME/.cargo/env" указывает на скрипт, который добавляет ~/.cargo/bin в PATH.
  • После выполнения команды cargo и rustc становятся доступны сразу, без перезапуска терминала.
  • Кавычки вокруг пути нужны для безопасной обработки возможных пробелов в пути.
  • Это изменение действует только на текущий терминал; в новом окне настройка обычно подхватится из профиля оболочки.

Это загружает обновлённые настройки окружения в текущую сессию.


Шаг 3. Проверка установки​

Чтобы убедиться, что всё работает корректно, следует проверить версии установленных компонентов:

rustc --version
cargo --version

Разбор:

  • rustc --version проверяет, что компилятор Rust установлен и доступен по PATH.
  • cargo --version отдельно проверяет пакетный менеджер и систему сборки.
  • Ожидаемый результат - строка вида rustc X.Y.Z (...) и cargo X.Y.Z (...).
  • Если команда не найдена, значит переменная PATH не обновилась или установка не завершилась.
  • Этот шаг лучше делать сразу после установки, чтобы не тратить время на отладку позже.

Команды должны вывести информацию о версиях компилятора и менеджера пакетов. Например:

rustc 1.78.0 (9b00956e5 2024-04-29)
cargo 1.78.0 (54d8815d0 2024-04-23)

Разбор:

  • 1.78.0 - номер версии инструмента; по нему легко проверить совместимость с документацией.
  • Хэш в скобках (9b00956e5, 54d8815d0) - идентификатор конкретной сборки.
  • Дата после хэша показывает, когда был выпущен данный релиз.
  • Совпадение major/minor у rustc и cargo обычно означает корректно синхронизированный toolchain.
  • Допустимо, если у вас версия новее, чем в примере; важно, чтобы команды вообще успешно отработали.

Наличие номеров версий подтверждает успешную установку.


Выбор интегрированной среды разработки​

Rust не требует конкретной IDE, но использование специализированных инструментов значительно ускоряет разработку. Основной компонент, обеспечивающий поддержку языка в редакторах, — это rust-analyzer. Это сервер языка, реализующий протокол Language Server Protocol (LSP). Он предоставляет такие функции, как автодополнение, навигация по коду, подсветка ошибок в реальном времени, рефакторинг и быстрый просмотр типов.


Поддерживаемые редакторы​

  • Visual Studio Code — наиболее популярный выбор. Для работы с Rust требуется установка расширения rust-analyzer из Marketplace. После установки расширение автоматически обнаруживает проекты Rust и активирует все возможности языкового сервера.

  • JetBrains IntelliJ IDEA / CLion / RustRover — мощные коммерческие IDE с отличной поддержкой Rust через плагин. Особенно рекомендуется RustRover, специализированная среда от JetBrains, созданная специально для Rust.

  • Vim / Neovim — для пользователей этих редакторов доступны плагины, такие как coc.nvim или nvim-lspconfig, которые интегрируют rust-analyzer.

  • Emacs — поддержка осуществляется через пакет lsp-mode и rust-mode.

Выбор редактора зависит от личных предпочтений и опыта. Для новичков рекомендуется начать с Visual Studio Code из-за простоты настройки и богатой экосистемы расширений.


Создание первого проекта​

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


Шаг 1. Инициализация проекта​

В каталоге будущего проекта:

cargo new hello_rust

Разбор:

  • cargo new создаёт новый проект с базовой структурой и шаблонным main.rs.
  • hello_rust - имя каталога проекта и пакета в Cargo.toml.
  • Команда автоматически создаёт файл манифеста и папку src.
  • Этот способ предпочтительнее ручного создания файлов, потому что сразу даёт корректный каркас.
  • Далее все команды (cargo run, cargo test, cargo build) выполняются из корня этого каталога.

Эта команда создаёт новый каталог hello_rust со следующей структурой:

hello_rust/
├── Cargo.toml
└── src/
└── main.rs

Разбор:

  • Cargo.toml - центральный конфигурационный файл проекта — имя, версия, зависимости, профили.
  • src/main.rs - стандартная точка входа бинарного приложения Rust.
  • Такая структура - соглашение Cargo; оно позволяет запускать проект без дополнительной настройки.
  • Если проект станет библиотекой, дополнительно добавляют src/lib.rs.
  • Все артефакты сборки создаются вне src, в каталоге target.

Файл Cargo.toml — это манифест проекта. Он содержит метаданные — название, версию, зависимости, настройки сборки. По умолчанию он выглядит так:

[package]
name = "hello_rust"
version = "0.1.0"
edition = "2021"

[dependencies]

Разбор:

  • [package] открывает секцию метаданных самого crate.
  • name - идентификатор пакета; по умолчанию совпадает с именем каталога.
  • version = "0.1.0" задаёт стартовую semver-версию проекта.
  • edition = "2021" включает правила синтаксиса и идиомы соответствующего издания языка.
  • [dependencies] пока пустой: внешние библиотеки ещё не подключены.
  • Любая новая зависимость добавляется именно в эту секцию.

Раздел [package] описывает сам проект. Поле edition указывает, какую версию языка использовать. Rust сохраняет обратную совместимость через выпуски (editions), и 2021 — это актуальная стабильная версия на момент написания.

Каталог src содержит исходный код. Файл main.rs — точка входа в программу. Его содержимое по умолчанию:

fn main() {
println!("Hello, world!");
}

Разбор:

  • fn main() объявляет главную функцию, с которой стартует выполнение программы.
  • Фигурные скобки { ... } определяют тело функции.
  • println! - макрос стандартной библиотеки для вывода текста в консоль.
  • Строковый литерал "Hello, world!" передаётся макросу как форматируемое сообщение.
  • Символ ; завершает выражение вызова макроса.
  • После компиляции этот код становится исполняемым файлом, который печатает одну строку и завершается.

Это и есть первая программа на Rust.

Небольшое расширение — переменные и форматирование:

fn main() {
let name = "Rust";
let year = 2026;
println!("Привет, {name}! Год: {year}");
}

Разбор:

  • let name = "Rust" создаёт неизменяемую переменную со строковым литералом.
  • let year = 2026 хранит целое число типа i32 (вывод типа компилятором).
  • println! с {name} и {year} подставляет значения в шаблон строки.
  • Обе переменные живут до конца main и автоматически освобождаются при выходе.
  • Такой стиль вывода удобнее конкатенации строк через +.

Шаг 2. Анализ структуры программы​

Программа состоит из одной функции — main. Это специальное имя, которое компилятор ищет как стартовую точку выполнения. Тело функции заключено в фигурные скобки {}.

Вызов println! — это макрос, а не обычная функция. Макросы в Rust обозначаются восклицательным знаком. Они позволяют генерировать код на этапе компиляции, что делает их мощным инструментом метапрограммирования. Макрос println! выводит текст в стандартный поток вывода (обычно терминал) и добавляет символ новой строки в конце.

Строка "Hello, world!" — это строковый литерал. В Rust строки по умолчанию имеют тип &str (срез строки), который является эффективной ссылкой на неизменяемую последовательность UTF-8 символов.

Каждое выражение в Rust завершается точкой с запятой, если оно не возвращает значение, предназначенное для использования в другом месте. В данном случае вызов println! ничего не возвращает, поэтому требует точки с запятой.


Компиляция и запуск программы​

Cargo предоставляет удобные команды для сборки и выполнения проекта.


Шаг 1. Запуск в режиме разработки​

Выполните в корне проекта:

cargo run

Разбор:

  • cargo run объединяет два шага: сначала сборка, затем запуск бинарника.
  • Если исходники не менялись, Cargo может использовать уже собранные артефакты.
  • По умолчанию используется профиль dev (быстрая сборка, отладочная информация).
  • Команда удобна для повседневной разработки, когда нужен короткий цикл "изменил -> проверил".
  • При ошибке компиляции запуск не произойдёт: сначала нужно исправить код.

Эта команда автоматически компилирует проект и запускает полученный исполняемый файл. Вывод будет таким:

Compiling hello_rust v0.1.0 (/path/to/hello_rust)
Finished dev [unoptimized + debuginfo] target(s) in 0.35s
Running `target/debug/hello_rust`
Hello, world!

Разбор:

  • Compiling ... означает, что rustc собирает ваш crate.
  • Finished dev [unoptimized + debuginfo] показывает профиль сборки и ключевые его свойства.
  • target(s) in 0.35s - длительность текущей сборки.
  • Running target/debug/hello_rust - путь к собранному исполняемому файлу.
  • Последняя строка Hello, world! - фактический вывод программы в stdout.

Cargo создаёт исполняемый файл в подкаталоге target/debug/. Режим сборки по умолчанию — dev — оптимизирован для скорости компиляции и включает отладочную информацию, что полезно при разработке.


Шаг 2. Запуск в режиме релиза​

Когда программа готова к распространению, её собирают в режиме release:

cargo build --release

Разбор:

  • cargo build запускает только сборку, без выполнения программы.
  • Флаг --release переключает профиль на оптимизированный релизный режим.
  • Такой бинарник обычно работает быстрее, но собирается дольше.
  • Артефакты складываются в target/release.
  • Команда типично используется перед публикацией или нагрузочными тестами.

Этот режим включает все уровни оптимизации компилятора, что значительно увеличивает производительность, но замедляет саму сборку. Исполняемый файл помещается в target/release/.

Для запуска релизной версии:

cargo run --release

Разбор:

  • Команда собирает и запускает приложение в релизном профиле.
  • Эквивалентна последовательности cargo build --release и запуску итогового бинарника.
  • Полезна, когда нужно проверить поведение именно оптимизированной версии.
  • Часто используется для замеров производительности, где dev даёт искажённые результаты.
  • Если есть различия между dev и release, их видно именно на этом этапе.

Шаг 3. Только компиляция​

Если нужно только собрать программу без запуска, используется команда:

cargo build

Разбор:

  • Базовая команда сборки в профиле dev.
  • Создаёт бинарник и промежуточные файлы в target/debug.
  • Не запускает программу автоматически.
  • Подходит для CI-шага "проверить, что проект компилируется".
  • Часто применяется вместе с cargo test и cargo clippy.

или

cargo build --release

Разбор:

  • Та же сборка, но для релизного профиля с оптимизациями.
  • Создаёт итоговый бинарник в target/release.
  • Удобна, когда запуск будет выполняться отдельно, вручную или скриптом.
  • При больших проектах может занимать заметно больше времени, чем cargo build.
  • Результат ближе к тому, что будет в продакшене.

После этого можно запустить исполняемый файл напрямую:

./target/debug/hello_rust

Разбор:

  • Запуск происходит напрямую, без участия Cargo.
  • Используется уже собранный бинарник из target/debug.
  • Удобно, если нужно вызывать программу из внешних скриптов.
  • На Unix-подобных системах путь начинается с ./, чтобы явно указать текущий каталог.
  • На Windows формат пути и расширение отличаются (.exe).

(на Windows путь будет .\target\debug\hello_rust.exe)


Дальнейшие шаги и рекомендации​

Первая программа — это отправная точка. Rust предоставляет богатую стандартную библиотеку и огромное количество внешних пакетов через реестр crates.io. Чтобы добавить зависимость, её описание помещают в раздел [dependencies] файла Cargo.toml. Например:

[dependencies]
rand = "0.8"

Разбор:

  • [dependencies] - секция с внешними библиотеками проекта.
  • rand = "0.8" подключает crate rand совместимой версии 0.8.x.
  • После добавления записи Cargo сам скачает пакет из crates.io при следующей сборке.
  • Версию стоит периодически обновлять осознанно, с прогоном тестов.
  • Использование зависимостей делает код короче и надёжнее, чем самостоятельная реализация типовых задач.

После этого Cargo автоматически скачает и скомпилирует указанную версию библиотеки при следующем запуске cargo build.

Пример использования rand в src/main.rs:

use rand::Rng;

fn main() {
let n = rand::thread_rng().gen_range(1..=6);
println!("Выпало: {n}");
}

Разбор:

  • use rand::Rng подключает трейт с методами генератора случайных чисел.
  • rand::thread_rng() возвращает генератор, привязанный к текущему потоку.
  • gen_range(1..=6) выбирает число от 1 до 6 включительно (как кубик).
  • println! печатает результат в консоль.
  • Без записи rand = "0.8" в Cargo.toml проект не соберётся.

Первый unit-тест рядом с кодом:

fn add(a: i32, b: i32) -> i32 {
a + b
}

#[cfg(test)]
mod tests {
use super::add;

#[test]
fn adds_two_numbers() {
assert_eq!(5, add(2, 3));
}
}

Разбор:

  • #[cfg(test)] включает модуль только при cargo test.
  • use super::add импортирует функцию из родительского модуля.
  • #[test] помечает функцию как тестовый сценарий.
  • assert_eq!(5, add(2, 3)) проверяет ожидаемый результат.
  • При падении теста Cargo покажет оба значения для быстрой диагностики.

Также рекомендуется изучить встроенную документацию. Команда:

rustup doc

Разбор:

  • rustup doc открывает локальную документацию Rust в браузере.
  • Источник документов - установленный toolchain, поэтому интернет не обязателен.
  • Удобно для быстрого перехода к std, rustc book и другим официальным материалам.
  • Команда особенно полезна в изолированных окружениях или при нестабильной сети.
  • Это рекомендованный путь для проверки точных сигнатур функций и типов.

открывает локальную копию официальной документации в браузере. Это особенно полезно при отсутствии интернета или для быстрого поиска информации.


Частые ошибки​

СимптомПричина
cargo не найденrustup не завершился — перезапустите терминал
cannot find crateОпечатка в Cargo.toml или не cargo build
Borrow checkerОдновременно изменяемый и заимствованный &mut — разделите scope

Что попробовать​

  1. cargo test — тест рядом с fn build_greeting.
  2. cargo clippy — линтер по идиомам.
  3. HTTP: Axum.

Частые ошибки​

СимптомПричина
cargo не найденrustup не завершился — перезапустите терминал
cannot find crateОпечатка в Cargo.toml или не cargo build
Borrow checkerОдновременно изменяемый и заимствованный &mut — разделите scope

Что попробовать​

  1. cargo test — тест рядом с fn build_greeting.
  2. cargo clippy — линтер по идиомам.
  3. HTTP: Axum.

Дальше​


Основа по протоколу

Базовый разбор HTTP и HTTPS находится в отдельной статье — HTTP как основа веб-интеграций.


В подборках​

Статья входит в тематические подборки и блок "С чего начать?" на главной. Соседние шаги того же маршрута:

Первые шаги (маршрут подборки) — Первая программа на Ruby, Первая программа на Swift, Первая программа на Kotlin, Первая программа на Lua, Первая программа на Node.js, Первая программа на Smalltalk.