Rust
Rust 是由 Mozilla 主导开发的通用、编译型编程语言。设计准则为“安全、并发、实用”,支持函数式、并发式、过程式以及面向对象的程序设计风格。Rust 的设计目标之一,是要使设计大型的互联网客户端和服务器的任务变得更容易。因此更加强调安全性、存储器配置、以及并发处理等方面的特性。[1]
语言核心[编辑 | 编辑源代码]
Rust 核心库[编辑 | 编辑源代码]
Rust 核心库是 Rust 标准库的基础,无需依赖。它直接与 LLVM 原语对接,使 Rust 可以与平台和硬件无关。正是这种与 LLVM 的集成,使 Rust 比 Clang 编译的同样功能的 C 语言程序性能更高,使得用 libcore 设计的 Rust 软件比 C 语言的更底层。为嵌入式平台设计软件的开发者可通过 #![no_std]
放弃使用标准库,只使用语言自带的核心库,以获得更小的二进制文件和更好的性能。然而,由于大多数库都需要标准库,使用 #![no_std]
意味着来自 Rust 社区的软件支持会受限。
Rust 标准库[编辑 | 编辑源代码]
Rust 标准库提供了方便的高级抽象,用于开发大多数可移植的 Rust 软件。标准库的特点包括 Vec
和 String
类型、大量的语言原语方法、大量的标准宏、I/O 和多线程支持、使用 Box
实现的堆分配,以及更多核心库不具有的高级特性。
发布周期[编辑 | 编辑源代码]
与 Firefox 类似,Rust 使用每六周的发布周期。在每个新版本中,核心库和标准库都会得到改进,以支持更多的平台、提高性能,以及为稳定版本增加新特性。
安装[编辑 | 编辑源代码]
安装 Rust 主要有两种方式:
- 直接安装。如果你只使用 Rust 来运行或安装软件,推荐使用此方式。
- Rustup 安装。如果你打算进行 Rust 编程,推荐使用此方式。
直接安装[编辑 | 编辑源代码]
要从 Arch Linux 官方软件库中安装最新的稳定版 Rust,安装 rust包。这将安装 rustc
编译器和 Cargo。
除此之外还有开发版的 Rust 编译器 rust-nightly-binAUR 和 rust-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
中添加其他目录的麻烦。
/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。
curl some-url | sh
会带来安全风险,因为它执行的是未知的、甚至可能在下载过程中被破坏的代码。因此建议在执行脚本之前,手动下载并检查。rustup
时请确保 ~/.cargo/bin
在 PATH
内。用法[编辑 | 编辑源代码]
你可能需要手动安装工具链,例如稳定版 (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)
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_64
或 i686
)。以下内容将解释如何使用 rustup 进行交叉编译。
- 安装 mingw-w64-gcc包
- 为目标架构安装 rust 标准库:
rustup target add $ARCH-pc-windows-gnu
- 最后,为了使 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.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[编辑 | 编辑源代码]
使用 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 支持[编辑 | 编辑源代码]
工具[编辑 | 编辑源代码]
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 提供了语言服务器协议 (LSP) 的实现,为 IDE、编辑器和其他工具提供了有关 Rust 程序的信息。RLS 支持 goto 定义、符号搜索、重新格式化和代码补全等功能,也能进行重命名和重构。
RLS 在 rust包 软件包中。使用 rustup 安装 RLS:
$ rustup component add rls rust-analysis rust-src
Racer[编辑 | 编辑源代码]
Racer 为编辑器和 IDE 提供了代码补全支持。Racer 已被 RLS 取代 (但仍将 Racer 作为备用)。
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 借助编译器插件支持实现了许多额外提示,能检测出更多错误和非惯用的 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 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/
。
Visual Studio Code[编辑 | 编辑源代码]
Visual Studio Code 对 Rust 的支持可通过 rust-analyzer 与 matklad.rust-analyzer 扩展获取。
Vim[编辑 | 编辑源代码]
Vim 对 Rust 的支持可通过官方的 rust.vim 插件获取,支持文件检测、语法高亮、格式化和 Syntastic 语法检查插件。许多代码补全引擎都支持 Rust,例如 coc(通过 coc.rls 插件)和 YouCompleteMe。
另请参阅[编辑 | 编辑源代码]
- Rust 编程语言官网
- Rust 文档
- 标准库 API
- Rust 官方文档中文教程
- 《Rust 程序设计语言》
- 《通过例子学 Rust》
- 《Rust 参考手册》
- Rust 维基百科词条
- Rust 语言术语中英文对照表
- Rust Telegram 中文讨论群
- 带少量注释的 Rust 示例 (English)
- Cargo 可用的库 (单元包/crate) (English)
- Rust 本周动态 (English)
- Rust 编程语言博客 (English)
- Rust 用户论坛 (English)
- Rust 内部人员论坛 (English)