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

Ссылки по теме

- Rust package guidelines

Википедия:

  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, которую вы можете получить одним из нескольких способов:

- С помощью rustup: `rustup component add rust-src`
- Из AUR: rust-src-gitAUR или rust-nightly-srcAUR, в этом случае вы должны установить переменную окружения `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

### Редакторы

#### Atom

Atom поддерживает программирование на Rust с помощью модуля ide-rust (требуется rustup).

#### 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
- Русскоязычный форум

Category:

- Programming languages (Русский)