Rust

来自 Arch Linux 中文维基

Rust 是由 Mozilla 主导开发的通用、编译型编程语言。设计准则为“安全、并发、实用”,支持函数式、并发式、过程式以及面向对象的程序设计风格。Rust 的设计目标之一,是要使设计大型的互联网客户端和服务器的任务变得更容易。因此更加强调安全性、存储器配置、以及并发处理等方面的特性。[1]

语言核心[编辑 | 编辑源代码]

Rust 核心库[编辑 | 编辑源代码]

Rust 核心库是 Rust 标准库的基础,无需依赖。它直接与 LLVM 原语对接,使 Rust 可以与平台和硬件无关。正是这种与 LLVM 的集成,使 Rust 比 Clang 编译的同样功能的 C 语言程序性能更高,使得用 libcore 设计的 Rust 软件比 C 语言的更底层。为嵌入式平台设计软件的开发者可通过 #![no_std] 放弃使用标准库,只使用语言自带的核心库,以获得更小的二进制文件和更好的性能。然而,由于大多数库都需要标准库,使用 #![no_std] 意味着来自 Rust 社区的软件支持会受限。

Rust 标准库[编辑 | 编辑源代码]

Rust 标准库提供了方便的高级抽象,用于开发大多数可移植的 Rust 软件。标准库的特点包括 VecString 类型、大量的语言原语方法、大量的标准宏、I/O 和多线程支持、使用 Box 实现的堆分配,以及更多核心库不具有的高级特性。

发布周期[编辑 | 编辑源代码]

与 Firefox 类似,Rust 使用每六周的发布周期。在每个新版本中,核心库和标准库都会得到改进,以支持更多的平台、提高性能,以及为稳定版本增加新特性。

安装[编辑 | 编辑源代码]

安装 Rust 主要有两种方式:

  • 直接安装。如果你只使用 Rust 来运行或安装软件,推荐使用此方式。
  • Rustup 安装。如果你打算进行 Rust 编程,推荐使用此方式。

直接安装[编辑 | 编辑源代码]

要从 Arch Linux 官方软件库中安装最新的稳定版 Rust,安装 rust。这将安装 rustc 编译器和 Cargo

除此之外还有开发版的 Rust 编译器 rust-nightly-binAURrust-gitAUR 可用,分别用于预编译的通用二进制文件、编译器与系统库的构建。

通过 Rustup 安装[编辑 | 编辑源代码]

为开发软件,官方推荐的 Rust 安装方法是使用 Rustup 工具链管理器安装。

使用 Rustup 工具链管理器而不是仓库中独立的 Rust 软件包的优点,主要是能为多个目标平台(Windows、macOS、Android)和架构(x86、x86_64、arm)安装多个工具链(稳定版、测试版、开发版)。

Rustup 的安装有两种方式,一种是通过 Arch Linux 自带的 pacman,另一种是通过 Rust 官方安装脚本。

Arch Linux 软件包[编辑 | 编辑源代码]

rustup 在 Arch Linux 软件仓库中可用。注意,以这种方式安装时,rustup self update起作用,只能使用 pacman 更新 rustup。

使用此软件包的优点是 Rust 可执行文件都在 /usr/bin 目录内,而不是 ~/.cargo/bin,因此避免了在 PATH 中添加其他目录的麻烦。

注意: rustup 软件包默认不会安装工具链。它提供了 /usr/bin/rustup/usr/bin/rustc/usr/bin/cargo 等普通二进制文件之间的符号链接。如上所述,要使上述 Rust 命令能工作,用户仍需手动安装工具链。

为安装工具链,需要指定使用的版本:稳定版 (stable) 或开发版 (nightly)。

例如:

$ rustup default stable

上游安装脚本[编辑 | 编辑源代码]

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

使用下面命令下载:curl --proto '=https' --tlsv1.3 -sSf https://sh.rustup.rs -o rust.sh,查看脚本:less ./rust.sh,运行脚本以安装 rustup:./rust.sh。此脚本仅对当前登录 Shell 的配置文件进行 PATH 修改。在注销并重新登录之前需要source ~/.cargo/env。在此之后升级 rustup 需执行 rustup self update

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

警告: 正如 Rust 文档所建议的,执行 curl some-url | sh 会带来安全风险,因为它执行的是未知的、甚至可能在下载过程中被破坏的代码。因此建议在执行脚本之前,手动下载并检查。
注意: 在运行 rustup 时请确保 ~/.cargo/binPATH 内。

用法[编辑 | 编辑源代码]

你可能需要手动安装工具链,例如稳定版 (stable)、测试版 (beta)、开发版 (nightly) 或特定版本 (1.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.

测试安装结果[编辑 | 编辑源代码]

通过构建一个小程序来测试 Rust 是否已正确安装,源码如下所示:

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

可使用 rustc 编译,然后运行:

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

交叉编译[编辑 | 编辑源代码]

使用 rustup[编辑 | 编辑源代码]

使用 Rustup 可轻松地交叉编译。Rustup 支持许多交叉编译目标,完整列表可通过执行 rustup target list 查看。

例如,使用 Windows 稳定通道安装 rust,使用 GNU 编译器,需要执行以下命令:

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

此操作只会为目标架构安装 rust 及其工具,但在交叉编译时可能还需要其他工具。

Windows[编辑 | 编辑源代码]

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

  1. 安装 mingw-w64-gcc
  2. 为目标架构安装 rust 标准库:rustup target add $ARCH-pc-windows-gnu
  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"

最后,通过向 cargo 传递 --target $ARCH-pc-windows-gnu 参数,即可为 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 为更新通道,稳定版 (stable)、测试版 (beta) 或开发版 (nightly)。

非官方软件包[编辑 | 编辑源代码]

非官方仓库 archlinuxcn 有 rust-nightly 和 i686, ARM, ARMv7, Windows 32 & 64 的 Rust 标准库,因此只需安装对应的标准库即可享受交叉编译。然而,ARM 工具链只能自行寻找。对于 32 位 Windows 目标,需要获取 mingw-w64-gcc 提供的 libgcc_s_dw2-1.dll 来编译运行。

Cargo[编辑 | 编辑源代码]

Cargo,Rust 的包管理器,是 rust 的一部分。作为 rust-nightly-binAUR 的一部分,cargo 开发版 (nightly) 在 AUR 上可用。如果使用 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/config 中添加一个标志,Cargo 将始终为本机 CPU 进行编译优化。请注意,由此产生的二进制文件无法在其他计算机上运行。如果未来更换 CPU,您甚至可能无法在自己的系统上运行这些二进制文件。

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

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

这说明目前在 x86_64-unknown-linux-gnu 平台上使用稳定版 (stable) rust。

将 Cargo 设置为始终为本机 CPU 进行编译优化:

~/.cargo/config
[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

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

IDE 支持[编辑 | 编辑源代码]

工具[编辑 | 编辑源代码]

Rust 项目的推荐工具请参阅 https://www.rust-lang.org/zh-CN/tools

rust-analyzer[编辑 | 编辑源代码]

rust-analyzer 是实验性的 Rust 语言服务器协议 (LSP) 实现,已取代 #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

RLS[编辑 | 编辑源代码]

这一章节正在考虑移除。

原因: RLS 从 rust 1.65 开始被废弃,转而使用 rust-analyzer,因此不建议继续使用 RLS。 (在 Talk:Rust#Deprecated language servers 讨论)


RLS 为 Rust 提供了语言服务器协议 (LSP) 的实现,为 IDE、编辑器和其他工具提供了有关 Rust 程序的信息。RLS 支持 goto 定义、符号搜索、重新格式化和代码补全等功能,也能进行重命名和重构。

RLS 在 rust 软件包中。使用 rustup 安装 RLS:

$ rustup component add rls rust-analysis rust-src

Racer[编辑 | 编辑源代码]

本文内容或本节内容已经过期。

原因: RLS 已被废弃 (在Talk:Rust讨论)

Racer 为编辑器和 IDE 提供了代码补全支持。Racer 已被 RLS 取代 (但仍将 Racer 作为备用)。

Racer 需要 Rust 源代码。源代码可通过以下几种方式获取:

  • 使用 rustup 获取:rustup component add rust-src
  • 从 AUR 获取:rust-src-gitAURrust-nightly-srcAUR (必须设置 RUST_SRC_PATH 环境变量)。

安装源代码后,可使用 Cargo 来安装 racer,也可从软件仓库(rust-racerAUR)获取。

$ cargo +nightly install racer

Clippy[编辑 | 编辑源代码]

Clippy 借助编译器插件支持实现了许多额外提示,能检测出更多错误和非惯用的 Rust 语法。rust 软件包中包含了 Clippy。

使用 rustup 安装 Clippy:

$ rustup component add clippy

Rustfmt[编辑 | 编辑源代码]

Rustfmt 是一个根据官方代码风格规范来格式化 Rust 代码的工具。

rust 软件包中包含了 Rustfmt。执行以下命令,用 rustup 来安装 Rustfmt:

$ rustup component add rustfmt

编辑器[编辑 | 编辑源代码]

Atom[编辑 | 编辑源代码]

Atom 对 Rust 编程的支持由 ide-rust 插件提供(需要 rustup)。

Emacs[编辑 | 编辑源代码]

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

GNOME Builder[编辑 | 编辑源代码]

GNOME Builder 对 Rust 的支持通过语言服务器协议 (LSP) 实现。默认使用 rust-analyzer,需要同时安装 Rust 源代码。

Helix[编辑 | 编辑源代码]

Helix 编辑器使用 rust 编写,包含了 rust 语言服务器协议 (LSP)。Helix 的灵感来自 Neovim 和 Kakoune。

Kate[编辑 | 编辑源代码]

Kate 对 Rust 的支持通过语言服务器协议 (LSP) 实现。默认使用 rust-analyzer,需要同时安装 Rust 源代码。

IntelliJ IDEA[编辑 | 编辑源代码]

IntelliJ IDEARust 插件。此插件同样适用于 CLion。

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

如果使用 Arch Linux 官方软件库中的 Rust,请将工具链所在位置指定为 /usr/bin,将标准库所在位置指定为 /usr/lib/rustlib/src/rust/library/

Visual Studio Code[编辑 | 编辑源代码]

Visual Studio Code 对 Rust 的支持可通过 rust-analyzermatklad.rust-analyzer 扩展获取。

Vim[编辑 | 编辑源代码]

Vim 对 Rust 的支持可通过官方的 rust.vim 插件获取,支持文件检测、语法高亮、格式化和 Syntastic 语法检查插件。许多代码补全引擎都支持 Rust,例如 coc(通过 coc.rls 插件)和 YouCompleteMe

另请参阅[编辑 | 编辑源代码]

参考资料[编辑 | 编辑源代码]