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

Первая программа на 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.