Rust (Русский)
- Rust — мультипарадигмальный компилируемый язык программирования общего назначения, сочетает парадигмы функционального и процедурного программирования с объектной системой, основанной на типажах. Rust гарантирует безопасную работу с памятью благодаря встроенной в компилятор системе статической валидации ссылок (borrow checker). Ключевые приоритеты языка: безопасность, скорость и параллелизм. Rust сопоставим по скорости и возможностям с C++/Си, однако даёт большую безопасность при работе с памятью, что обеспечивается встроенными в язык механизмами контроля ссылок.
Ядро языка
Rust Core Library
Rust Core Library — свободная от зависимостей основа стандартной библиотеки Rust. Она напрямую взаимодействует с примитивами LLVM, что позволяет Rust не зависеть от конкретных аппаратных и программных платформ. Именно эта интеграция с LLVM позволяет Rust получить производительность выше чем у эквивалентных приложений на C, скомпилированных с помощью Clang, что делает программы на Rust, разработанные с помощью libcore, более низкоуровневыми, чем на C. Она содержит только типы, не зависящие от платформы, такие как Option
, Result
и Iterator
. Разработчики программ для встраиваемых систем могут отключить использование стандартной библиотеки с помощью #![no_std]
и использовать только «безбатареечный» libcore для уменьшения размера скомпилированных программ и повышения производительности. Однако использование #![no_std]
ограничивает объём поддержки, которую вы можете получить от сообщества Rust, поскольку большинство библиотек зависят от стандартной библиотеки.
Rust Standard Library
Стандартная библиотека Rust предоставляет удобные абстракции высокого уровня, с помощью которых создаётся большинство переносимых программ на Rust. Например, она содержит типы Vec
и String
; огромное число методов для примитивов языка; много стандартных макросов; поддержка ввода-вывода и многопоточности; использование кучи (heap) с помощью Box
; и многие другие высокоуровневые возможности, не доступные в libcore.
Цикл выпуска
Rust следует шестинедельному циклу выпуска, похожему на цикл выпуска Firefox. С каждым новым выпуском ядро и стандартные библиотеки улучшаются для поддержки большего числа платформ, повышения производительности и стабилизации новых возможностей для использования со стабильной версией Rust.
Установка
Есть два варианта установки Rust, один из которых поддерживается Arch Linux, а другой официально поддерживается Rust.
Из репозитория
Для установки последней стабильной версии Rust из официальных репозиториев Arch Linux установите пакет rust. Он установит компилятор rustc
и Cargo.
В AUR также доступна development-версия компилятора. Используйте rust-nightly-binAUR для установки заранее скомпилированных файлов или rust-gitAUR, чтобы собрать компилятор на своей системе.
С помощью Rustup
Официальный и рекомендумемый способ установки Rust для разработки ПО — с помощью инструмента Rustup, написанного на Rust.
Преимуществом использования Rustup вместо обычной установки Rust из репозитория является возможность установки нескольких toolchains (stable, beta, nightly) для нескольких целевых платформ (windows, mac, android) и архитектур (x86, x86_64, arm).
Официальный установочный скрипт
Скачайте скрипт установки командой curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs -o rust.sh
, просмотрите его: less ./rust.sh
и запустите: ./rust.sh
для установки. Этот скрипт вносит изменения в PATH только в настройках оболочки входа. Для применения изменений вам нужно перезайти или выполнить source ~/.cargo/env
для обновления PATH в текущей командной оболочке. Для обновления rustup в будущем запускайте rustup self update
.
Скрипт устанавливает и активирует инструментарий (toolchain) по умолчанию (тот же, который используется пакетом rust), поэтому нет необходимости устанавливать его вручную, чтобы начать использовать Rust.
curl какая-то-ссылка | sh
, как предлагает документация Rust, считается риском для безопасности, поскольку он выполняет неизвестный код, который может быть даже повреждён в процессе загрузки. Поэтому рекомендуется вручную загрузить скрипт и проверить его перед выполнением.rustup
убедитесь, что ~/.cargo/bin
добавился в переменную окружения PATH
.Пакет Arch Linux
В официальных репозиториях Arch Linux есть пакет rustup. Обратите внимание, что при установке с помощью этого пакета обновление с помощью rustup self update
работать не будет, и для обновления rustup следует обновлять этот пакет с помощью pacman.
Преимущество этого пакета в том, что исполняемые файлы Rust находятся в /usr/bin
вместо ~/.cargo/bin
, так что менять переменную окружения PATH
не требуется.
/usr/bin/rustc
и /usr/bin/cargo
, указывающие на /usr/bin/rustup
. Пользователю нужно установить инструментарий вручную, чтобы эти команды Rust могли что-то сделать.Для установки инструментария задайте в rustup интересующую вас версию: stable
или nightly
.
Например:
$ rustup default stable
Использование
Вам может потребоваться вручную установить инструментарий, например stable
, beta
, nightly
или 1.58.0
. Это также необходимо сделать, если вы хотите использовать/тестировать другой инструментарий.
$ rustup toolchain install toolchain
Теперь вы можете запускать команды Rust, выполняя rustup run toolchain command
. Однако, чтобы использовать эти команды напрямую, необходимо активировать инструментарий:
$ rustup default toolchain
Проверим версию Rust с помощью rustc -V
:
$ rustc -V
rustc 1.58.0 (02072b482 2022-01-11)
- Rustup не устанавливает некоторые команды Rust, которые есть в пакете rust, такие как
rustfmt
иrls
. Это позволяет сопровождающим Rust поставлять nightly Rust с неработающимиrustfmt
/rls
. Чтобы установить их, запуститеrustup component add rustfmt
иrustup component add rls
соответственно. Это также приостановит обновления nightly, если они сломаютrustfmt
/rls
. - Rust не выполняет компоновку самостоятельно, поэтому нужно установить сторонний компоновщик. Вы можете использовать gcc, иначе Rust выдаст
error: linker `cc` not found.
Проверка после установки
Давайте убедимся, что Rust установился корректно, написав простую программу:
~/hello.rs
fn main() { println!("Hello, World!"); }
Затем скомпилируйте её с помощью rustc
, введя это:
$ rustc hello.rs && ./hello
Hello, World!
Кросс-компиляция
С помощью rustup
Использовать кросс-компиляцию с rustup очень легко. Он поддерживает очень много целевых платформ. Полный их список можно увидеть с помощью команды rustup target list
.
Например, если вы хотите использовать stable Rust для Windows с компилятором GNU, сделайте следующее:
$ rustup toolchain install stable-x86_64-pc-windows-gnu
Эта команда установит только rust и инструменты для вашей целевой платформы, и для кросс-компиляции нужно сделать ещё несколько вещей.
Windows
В этом разделе $ARCH
будет целевой архитектурой (x86_64
или i686
).
- Установите пакет mingw-w64-gcc.
- Выполните
rustup target add $ARCH-pc-windows-gnu
чтобы установить стандартную библиотеку Rust для целевой архитектуры. - Подскажите cargo, где искать MinGW-w64 gcc/ar добавлением следующих параметров в
~/.cargo/config
(создайте файл, если он отсутствует):
~/.cargo/config
[target.$ARCH-pc-windows-gnu] linker = "/usr/bin/$ARCH-w64-mingw32-gcc" ar = "/usr/bin/$ARCH-w64-mingw32-ar"
Теперь вы можете выполнять кросс-компиляцию для Windows, указывая дополнительный аргумент --target $ARCH-pc-windows-gnu
при вызове cargo:
$ # Сборка $ cargo build --release --target "$ARCH-pc-windows-gnu" $ # Запуск unit-тестов через wine $ cargo test --target "$ARCH-pc-windows-gnu"
В настоящее время сборка исполняемых файлов с использованием MinGW 6 и инструментария, установленного через rustup, сломана. Чтобы исправить это, выполните
for lib in crt2.o dllcrt2.o libmsvcrt.a; do cp -v /usr/x86_64-w64-mingw32/lib/$lib $HOME/.rustup/toolchains/$CHANNEL-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-pc-windows-gnu/lib/; done
где CHANNEL
это канал обновлений (stable
, beta
или nightly
)
Неофициальные пакеты
Неофициальный репозиторий archlinuxcn содержит rust-nightly и стандартную библиотеку Rust для i686, ARM, ARMv7, Windows 32 и 64, и вы можете просто установить то, что вам нужно, и использовать кросс-компиляцию. Тем не менее вам нужно найти ARM toolchain самостоятельно. Для Windows 32bit вам нужно получить libgcc_s_dw2-1.dll (предоставляется пакетом mingw-w64-gcc) для сборки и запуска.
Cargo
Cargo — система сборки и менеджер пакетов для Rust. Он является частью пакета rust. Версия nightly доступна в AUR: rust-nightly-binAUR. Если у вас rustup, то он уже содержит в себе cargo.
Cargo помогает работать с зависимостями вашего проекта, скачивая их из своего хранилища или стороннего Git репозитория. Также он позволяет убедиться, что вы всегда будете получать повторяемые сборки. Рекомендуем прочитать официальное руководство.
Использование
Для создания нового проекта с помощью Cargo:
$ cargo new hello_world
Эта команда создаст директорию с файлом Cargo.toml
по умолчанию и настроит сборку в исполняемый файл.
Cargo.toml
, который содержит метаданные, необходимые Cargo для сборки вашего проекта.
Cargo.toml
[package] name = "hello_world" version = "0.1.0" edition = "2021" [dependencies]
Оптимизация для текущей платформы
Чтобы Cargo всегда компилировал оптимальный код для вашего текущего процессора, добавьте флаг в ~/.cargo/config
. Имейте в виду, что полученные двоичные файлы не должны распространяться для использования на других компьютерах и могут перестать работать даже на вашей собственной системе, если вы решите сменить процессор в будущем.
Узнайте, какая целевая платформа используется по умолчанию в вашей установке:
$ rustup toolchain list
stable-x86_64-unknown-linux-gnu (default)
В данном примере используется stable
rust на платформе x86_64-unknown-linux-gnu
.
Настройка Cargo для компилирования кода, оптимизированного для текущей платформы:
~/.cargo/config
[target.x86_64-unknown-linux-gnu] rustflags = ["-C", "target-cpu=native"]
sccache
Время компиляции можно сильно сократить, используя sccache (пакет sccache). Он будет хранить локальный кэш артефактов компилятора, избавляя вас от необходимости перекомпилировать код, который не изменился с момента последней компиляции.
Чтобы включить sccache, можно использовать переменную окружения RUSTC_WRAPPER
:
export RUSTC_WRAPPER=sccache cargo build
или
RUSTC_WRAPPER=sccache cargo build
Также можно добавить настройку в ~/.cargo/config
:
~/.cargo/config
[build] rustc-wrapper = "sccache"
Поддержка в IDE
Инструменты
Список полезных инструментов можно посмотреть на https://www.rust-lang.org/tools
RLS
RLS реализует Language Server Protocol для Rust, предоставляя IDE, редакторам и другим инструментам информацию о программах на Rust. Он поддерживает 'goto definition', поиск символов, переформатирование и автодополнение кода, а также позволяет осуществлять переименование и рефакторинг.
RLS входит в состав пакета rust. Чтобы установить RLS с помощью rustup:
$ rustup component add rls rust-analysis rust-src
rust-analyzer
rust-analyzer — это экспериментальная реализация Language Server Protocol для Rust, которая призвана заменить RLS.
Она доступна в виде пакета rust-analyzer, а последняя Git-версия доступна как rust-analyzer-gitAUR.
rust-analyzer нуждается в исходном коде стандартной библиотеки. Если его нет, rust-analyzer попытается установить его автоматически с помощью rustup. Чтобы установить исходный код вручную с помощью rustup, выполните следующую команду:
$ rustup component add rust-src
Racer
Racer предоставляет поддержку автодополнения кода для редакторов и IDE. Он был заменён на RLS (который использует Racer в качестве запасного варианта).
Для этого требуется также установить копию исходного кода Rust, которую вы можете получить одним из нескольких способов:
- С помощью rustup:
rustup component add rust-src
- Из AUR: rust-src-gitAUR или rust-nightly-srcAUR[ссылка недействительна: package not found], в этом случае вы должны установить переменную окружения
RUST_SRC_PATH
.
После установки исходного кода вы можете использовать Cargo
для установки racer или получить его из репозиториев (rust-racerAUR).
$ cargo +nightly install racer
Clippy
Clippy использует поддержку плагинов компилятора в Nightly-сборках Rust, чтобы обеспечить большое количество дополнительных проверок для обнаружения и предупреждения о более широком разнообразии ошибок и неидиоматическом Rust.
Clippy входит в состав пакета rust. Чтобы установить Clippy с помощью Rustup:
$ rustup component add clippy
Rustfmt
Rustfmt — инструмент для форматирования кода Rust в соответствии с официальным руководством по стилю.
Rustfmt входит в состав пакета rust. Чтобы установить с помощью Rustup:
$ rustup component add rustfmt
Редакторы
IntelliJ IDEA
В IntelliJ IDEA имеется Rust plugin. Этот плагин также работает с CLion. При настройке toolchain используйте rustup для загрузки исходников (rustup component add rust-src
), а затем выберите ~/.rustup/toolchains/<your toolchain>/bin
в качестве расположения toolchain.
При установке Rust из официальных репозиториев Arch Linux выберите /usr/bin
в качестве каталога toolchain и /usr/lib/rustlib/src/rust/library/
в качестве каталога, содержащего исходные коды стандартной библиотеки.
Visual Studio Code
В Visual Studio Code поддержка Rust может быть получена через официальное дополнение rust-lang.rls (требуется rustup). Если вы используете rust-analyzer, вместо этого расширения установите matklad.rust-analyzer.
Vim
В Vim поддержка Rust может быть получена через официальный плагин rust.vim, который предоставляет обнаружение файлов, подсветку синтаксиса, форматирование и поддержку плагина проверки синтаксиса Syntastic. Многие механизмы автодополнения имеют поддержку Rust, например coc (через плагин coc.rls) и YouCompleteMe.
Emacs
В Emacs поддержка Rust может быть получена через официальный rust-mode плагин.
Kate
Поддержка Rust в Kate реализуется через Language Server Protocol. По умолчанию используется rust-analyzer; всё, что вам нужно, — это установить его вместе с исходниками Rust.
GNOME Builder
Поддержка Rust в GNOME Builder реализуется через Language Server Protocol. По умолчанию используется rust-analyzer; всё, что вам нужно, — это установить его вместе с исходниками Rust.
Смотрите также
- Официальный сайт языка программирования Rust (англ.)
- Документация Rust (англ.)
- Официальная Книга (англ.)
- Перевод Книги на русский язык
- Обзор API стандартной библиотеки (англ.)
- Rust на примерах (англ.)
- Rust на примерах (перевод на русский язык)
- Подборка материалов по изучению Rust
- Библиотеки (крейты, crates), доступные через Cargo
- Новостная рассылка This Week in Rust (англ.)
- Блог языка программирования Rust (англ.)
- Форум пользователей Rust (англ.)
- The Rust Internals Forum (англ.)
- Список библиотек и ресурсов Awesome Rust: A curated list of Rust libraries and resources (англ.)
- Статья в Википедии
- Русскоязычный сайт о Rust
- Русскоязычный форум