Rust

出自 ArchWiki

出自 维基百科

Rust 是一种多范式、通用编程语言,强调性能、类型安全和并发性。它强制内存安全——意味着所有引用都指向有效的内存——而无需垃圾回收器。为了同时强制内存安全和防止数据竞争,它的 “借用检查器” 在编译期间跟踪程序中所有引用的对象生命周期。Rust 受函数式编程思想的影响,包括不变性、高阶函数和代数数据类型。它在系统编程中很受欢迎。

核心语言

Rust 核心库

Rust 核心库 是 Rust 标准库的无依赖基础。它直接与 LLVM 原语接口,这使得 Rust 能够实现平台和硬件无关性。正是这种与 LLVM 的集成使得 Rust 能够获得比使用 Clang 编译的同等 C 应用程序更高的性能,从而使使用 libcore 设计的 Rust 软件比 C 更底层。它仅包含基本的平台无关类型,例如 OptionResultIterator。希望为嵌入式平台开发软件的开发人员可以放弃标准库,使用 #![no_std] 专门使用不包含任何附加功能的 core 库,以获得更小的二进制文件大小和更高的性能。但是,使用 #![no_std] 会限制您可以从更大的 Rust 社区获得软件支持的数量,因为大多数库都需要标准库。

Rust 标准库

Rust 标准库 提供了便捷的高级抽象,大多数可移植的 Rust 软件都是通过它创建的。它具有便捷的功能,例如 VecString 类型;大量用于语言原语的方法;大量的标准宏;I/O 和多线程支持;使用 Box 进行堆分配;以及许多 core 库中不可用的更高级功能。

发布周期

Rust 遵循有规律的六周发布周期,类似于 Firefox 的发布周期。在每个新版本中,核心库和标准库都会得到改进,以支持更多平台、提高性能并稳定新功能以供稳定的 Rust 使用。

安装

安装 Rust 的两种主要方法是

  • 原生安装,如果您仅将 Rust 用于运行或安装使用 Rust 制作的软件,建议使用此方法
  • Rustup 安装,如果您打算使用 Rust 编写任何程序,建议使用此方法

原生安装

安装来自官方 Arch Linux 软件仓库的最新稳定版 Rust,安装 rust 软件包。这将安装 rustc 编译器和 Cargo

还有一个 Rust 编译器的开发版本可用:rust-nightly-binAUR 用于预构建的通用二进制文件,或 rust-gitAUR 用于使用系统库构建编译器。

Rustup

官方推荐的安装 Rust 以进行软件开发的方法是使用 Rustup 工具链管理器,它使用 Rust 编写。

使用 Rustup 工具链管理器而不是软件仓库中独立的预打包 Rust 的好处是,能够为多个目标(windows、mac、android)和架构(x86、x86_64、arm)安装多个工具链(stable、beta、nightly)。应该注意的是,安装 rustup 不会自动安装 rust 工具链,并且通过任何方法更新 rustup 也不会自动提供最新的 rust 工具链版本。有关工具链的更多信息,请参阅 #用法rustup 工具链文档

Rustup 安装有两种选择,一种受 Arch Linux 通过 pacman 支持,另一种受 Rust 通过其安装脚本官方支持。

Arch Linux 软件包

rustup 在 Arch Linux 软件仓库中可用。请注意,以这种方式安装时,rustup self update不起作用,该软件包需要由 pacman 更新。但是,此更改不扩展到其他 rustup 功能,例如用于更新 rust 工具链的 rustup update

此软件包的优点是各种 Rust 可执行文件位于 /usr/bin 中,而不是 ~/.cargo/bin 中,从而无需将另一个目录添加到您的 PATH 中。

注意: rustup 软件包默认安装工具链。相反,它在 /usr/bin/rustup 和常见二进制文件(如 /usr/bin/rustc/usr/bin/cargo)之间提供符号链接。如上所述,用户仍然需要手动安装工具链,这些 Rust 命令才能执行任何操作。

为了安装工具链,您需要告诉 rustup 要使用的版本,在 stablenightly 之间选择

$ rustup default stable

针对新版本 llvm 构建 rust

由于 rust 使用引导策略构建,因此需要一个功能正常的 rust 软件包。在构建新于官方仓库中版本的 llvm 版本的情况下,用户将需要一个来自先前版本 llvm-libs 的共享对象(用于构建仓库版本的 rust 的对象),以便针对较新版本的 llvm 进行构建。

示例:官方仓库提供 llvm-18.1.8,目标是构建 llvm-19.1.6。

引导步骤需要来自 llvm-libs-18.1.8 的 /usr/lib/libLLVM.so.18.1。此文件可以手动放置在构建根目录中,也可以由软件包(例如 llvm15-libs)放置。

上游安装脚本

Rustup 也可以通过 rustup 官方网页下载并手动安装。

使用 curl --proto '=https' --tlsv1.3 -sSf https://sh.rustup.rs -o rust.sh 下载文件,查看它:less ./rust.sh,并运行脚本 ./rust.sh 以启动 rustup 安装。该脚本仅对登录 shell 配置文件进行 PATH 更改。您需要 source ~/.cargo/env,直到您注销并重新登录系统。要稍后更新 rustup,请运行 rustup self update

该脚本默认安装并激活默认工具链(rust 软件包使用的工具链),因此无需手动安装即可开始使用 Rust。

警告: 运行 curl some-url | sh(如 Rust 文档建议的那样)被认为是安全风险,因为它会执行未知代码,甚至可能在下载过程中被损坏。因此,建议手动下载脚本并在执行之前检查它。
注意: 运行 rustup 时,请确保 ~/.cargo/bin 在您的 PATH 中。

用法

您可能需要手动安装工具链,例如 stablebetanightly1.58.0。如果您想使用/测试另一个工具链,您也需要这样做。

$ rustup toolchain install toolchain

您现在可以通过运行 rustup run toolchain command 来运行 Rust 命令。但是,要直接使用这些命令,您需要激活工具链

$ rustup default toolchain

使用 rustc -V 检查已安装的 Rust 版本

$ rustc -V 
rustc 1.58.0 (02072b482 2022-01-11)
注意

Rust 不执行自己的链接,因此您需要安装链接器。您可以使用 gcc,否则 Rust 将生成以下 error: linker `cc` not found.

注意

Rustup 不会自动更新提供的工具链。如果用户希望使用最新版本的 Rust、crates 和其他相关软件包,他们可能偶尔希望使用 rustup update 更新其工具链。有关更多信息,请参阅 官方 rustup 文档

测试你的安装

通过构建一个简单的程序来检查 Rust 是否正确安装,如下所示

~/hello.rs
fn main() {
    println!("Hello, World!");
}

您可以使用 rustc 编译它,然后运行它

$ rustc hello.rs && ./hello
Hello, World!

交叉编译

使用 rustup

您可以使用 Rustup 轻松进行交叉编译。Rustup 支持许多交叉编译目标。可以通过运行 rustup target list 找到完整列表。

例如,如果您想使用 stable 频道为 Windows 安装 Rust,并使用 GNU Compiler,您需要执行以下操作

$ rustup toolchain install stable-x86_64-pc-windows-gnu

这将仅为您的目标架构安装 Rust 及其工具,但交叉编译可能需要一些额外的工具。

Windows

在本节中,$ARCH 是目标架构(x86_64i686)。它将解释如何使用 rustup 进行交叉编译。

  1. 安装 mingw-w64-gcc
  2. 运行 rustup target add $ARCH-pc-windows-gnu 以安装适用于您的架构的 Rust 标准库。
  3. 最后,通过将以下内容添加到您的 ~/.cargo/config.toml 中,告诉 cargo 在哪里找到 MinGW-w64 gcc/ar
~/.cargo/config.toml
[target.$ARCH-pc-windows-gnu]
linker = "/usr/bin/$ARCH-w64-mingw32-gcc"
ar = "/usr/bin/$ARCH-w64-mingw32-ar"

最后,您可以通过将 --target $ARCH-pc-windows-gnu 传递给 cargo 来为 windows 交叉编译

$ # Build
$ cargo build --release --target "$ARCH-pc-windows-gnu"
$ # Run unit tests under 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 是更新频道(stablebetanightly

非官方软件包

非官方仓库 archlinuxcn 具有 rust-nightly 和 Rust std 库,适用于 i686、ARM、ARMv7、Windows 32 和 64,因此您只需安装您想要的即可享受交叉编译。但是,您必须自己找到 ARM 工具链。对于 Windows 32 位目标,您将需要获取 libgcc_s_dw2-1.dll(由 mingw-w64-gcc 提供)来构建和运行。

Cargo

Cargo,Rust 的包管理器,是 rust 软件包的一部分。nightly 版本在 AUR 中可用,作为 rust-nightly-binAUR 的一部分。如果您使用 rustup,它已经包含 cargo。

Cargo 是一个工具,允许 Rust 项目声明其各种依赖项,并确保您始终获得可重复的构建。建议您阅读 官方指南

用法

要使用 Cargo 创建新项目

$ cargo new hello_world 

这将创建一个目录,其中包含默认的 Cargo.toml 文件,设置为构建可执行文件。

注意: Cargo 使用此 Cargo.toml 作为清单,其中包含编译项目所需的所有元数据。
Cargo.toml
[package]
name = "hello_world"
version = "0.1.0"
edition = "2021"

[dependencies]

为原生 CPU 平台优化

为了指示 Cargo 始终为您的 CPU 平台编译最佳代码,您可以通过将标志添加到 ~/.cargo/config.toml 来实现此目的。请注意,生成的二进制文件不能分发以在其他计算机上使用,甚至在您将来决定更换 CPU 时也可能在您自己的系统上失败。

找出您的安装默认使用的目标平台

$ rustup toolchain list
stable-x86_64-unknown-linux-gnu (default)

在本示例中,我们在 x86_64-unknown-linux-gnu 平台上使用 stable Rust。

指示 Cargo 始终编译针对原生 CPU 平台优化的代码

~/.cargo/config.toml
[target.x86_64-unknown-linux-gnu]
rustflags = ["-C", "target-cpu=native"]

sccache

通过使用 sccachesccache 软件包)可以大大缩短编译时间。这将维护编译器工件的本地缓存,从而无需重新编译自上次编译以来未更改的代码。

要启用 sccache,您可以使用 RUSTC_WRAPPER 环境变量

$ export RUSTC_WRAPPER=sccache
$ cargo build

$ RUSTC_WRAPPER=sccache cargo build

或者,将以下配置添加到 ~/.cargo/config.toml

~/.cargo/config.toml
[build]
rustc-wrapper = "sccache"

IDE 支持

工具

有关 Rust 项目的推荐工具,请参阅 https://rust-lang.net.cn/tools

rust-analyzer

rust-analyzer 是 Rust 的官方语言服务器协议实现,它已取代 RLS

它作为 rust-analyzer 软件包提供,最新的 Git 版本作为 rust-analyzer-gitAUR 提供。或者,如果您安装了 rustup,则可以使用以下命令安装 rust-analyzer

$ rustup component add rust-analyzer

rust-analyzer 需要标准库的源代码。如果它不存在,rust-analyzer 将尝试使用 rustup 自动安装它。要使用 rustup 手动安装源代码,请运行以下命令

$ rustup component add rust-src

Clippy

Clippy 利用编译器插件支持,为检测和警告更多种类的错误和非惯用 Rust 提供大量额外的 lints。

Clippy 包含在 rust 软件包中。要使用 rustup 安装它,请使用

$ rustup component add clippy

Rustfmt

Rustfmt 是一种根据官方样式指南格式化 Rust 代码的工具。

Rustfmt 包含在 rust 软件包中。要使用 rustup 安装它,请使用

$ rustup component add rustfmt

编辑器

Emacs

可以通过官方 rust-mode 插件获得 Emacs 对 Rust 的支持。

GNOME Builder

GNOME Builder 对 Rust 的支持是通过语言服务器协议实现的。它默认使用 rust-analyzer;您只需将其与 Rust 源代码一起安装即可。

Helix

Helix 编辑器是用 Rust 编写的,并包含 Rust 语言服务器协议。Helix 的灵感来自 Neovim 和 Kakoune。

Kate

Kate 对 Rust 的支持是通过语言服务器协议实现的。它默认使用 rust-analyzer;您只需将其与 Rust 源代码一起安装即可。

IntelliJ IDEA

IntelliJ IDEA 有一个 Rust 插件。相同的插件也适用于 CLion。

如果使用 rustup,请使用 rustup 下载源代码 (rustup component add rust-src),然后选择 ~/.rustup/toolchains/<your toolchain>/bin 作为工具链位置。

如果使用来自官方 Arch Linux 软件仓库的 Rust,请选择 /usr/bin 作为工具链位置,/usr/lib/rustlib/src/rust/library/ 作为 stdlib 源代码位置。

Jetbrains RustRover

Jetbrains 还在开发一个专门用于 Rust 的编辑器,目前仅处于 Early Access 阶段。可以在他们的官方 网站 或 AUR 下的 rustroverAURrustrover-eapAUR 中找到并下载。

Visual Studio Code

Visual Studio Code 对 Rust 的支持可以通过 rust-analyzerrust-lang.rust-analyzer 扩展获得。

Vim

Vim 对 Rust 的支持可以通过官方 rust.vim 插件获得,该插件提供文件检测、语法突出显示、格式化以及对 Syntastic 语法检查插件的支持。许多补全引擎都支持 Rust,例如 coc(通过 coc-rust-analyzer 插件)和 YouCompleteMe

参见