Rust (Русский)

From ArchWiki
Состояние перевода: На этой странице представлен перевод статьи Rust. Дата последней синхронизации: 20 января 2022. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.

Википедия:

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 не требуется.

Примечание: Пакет rustup по умолчанию не устанавливает никакой инструментарий. Вместо этого он предоставляет символические ссылки /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).

  1. Установите пакет mingw-w64-gcc.
  2. Выполните rustup target add $ARCH-pc-windows-gnu чтобы установить стандартную библиотеку Rust для целевой архитектуры.
  3. Подскажите 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 использует файл манифеста 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, которую вы можете получить одним из нескольких способов:

После установки исходного кода вы можете использовать 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.

Смотрите также