Rust
出自 Wikipedia
- Rust 是一种多范式、通用编程语言,强调性能、类型安全和并发性。它强制执行内存安全——意味着所有引用都指向有效的内存——而无需垃圾回收器。为了同时强制执行内存安全并防止数据竞争,它的“借用检查器”在编译期间跟踪程序中所有引用的对象生命周期。Rust 受函数式编程思想的影响,包括不变性、高阶函数和代数数据类型。它在系统编程中很受欢迎。
核心语言
Rust 核心库
Rust 核心库是 Rust 标准库的无依赖基础。它直接与 LLVM 原语接口,这使得 Rust 能够实现平台和硬件无关性。正是这种与 LLVM 的集成使得 Rust 能够获得比使用 Clang 编译的等效 C 应用程序更高的性能,从而使使用 libcore 设计的 Rust 软件比 C 更底层。它仅包含基本的平台无关类型,例如 Option
、Result
和 Iterator
。希望将软件定位到嵌入式平台的开发人员可能会放弃标准库,而使用 #![no_std]
来专门使用不包含任何内容的 core 库,以获得更小的二进制文件大小和更高的性能。但是,使用 #![no_std]
会限制您可以从更大的 Rust 社区获得的软件支持量,因为大多数库都需要标准库。
Rust 标准库
Rust 标准库 提供了便捷的高级抽象,大多数可移植的 Rust 软件都是通过它创建的。它具有方便的功能,例如 Vec
和 String
类型;大量用于语言原语的方法;大量的标准宏;I/O 和多线程支持;使用 Box
进行堆分配;以及核心库中不可用的许多更高级别的功能。
发布周期
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
中。
/usr/bin/rustup
和常用二进制文件(例如 /usr/bin/rustc
和 /usr/bin/cargo
)之间提供符号链接。如上所述,用户仍然需要手动安装工具链,这些 Rust 命令才能执行任何操作。为了安装工具链,您需要告诉 rustup 要使用哪个版本,在 stable
和 nightly
之间选择
$ 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
中。用法
您可能需要手动安装工具链,例如 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.
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 channel 为 Windows 安装 Rust,使用 GNU Compiler,您需要执行以下操作
$ rustup toolchain install stable-x86_64-pc-windows-gnu
这只会为您的目标架构安装 Rust 及其工具,但交叉编译可能需要一些其他工具。
Windows
在本节中,$ARCH
是目标架构(x86_64
或 i686
)。它将解释如何使用 rustup 进行交叉编译。
- 安装 mingw-w64-gcc
- 运行
rustup target add $ARCH-pc-windows-gnu
以安装适用于您的架构的 Rust 标准库。 - 最后,通过将以下内容添加到您的
~/.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
是更新通道(stable
、beta
或 nightly
)
非官方软件包
非官方仓库 archlinuxcn 具有 rust-nightly 和适用于 i686、ARM、ARMv7、Windows 32 和 64 的 Rust std 库,因此您可以只安装您想要的,然后享受交叉编译。但是,您必须自己找到 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.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
使用 sccache(sccache 软件包)可以大大缩短编译时间。这将维护编译器工件的本地缓存,从而无需重新编译自上次编译以来未更改的代码。
要启用 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 利用编译器插件支持来提供大量额外的 lint,以检测和警告更多种类的错误和非惯用的 Rust。
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 中找到并下载,AUR 中为 rustroverAUR 和 rustrover-eapAUR。
Visual Studio Code
可以通过 rust-analyzer 和 rust-lang.rust-analyzer 扩展获得 Visual Studio Code 对 Rust 的支持。
Vim
可以通过官方 rust.vim 插件获得 Vim 对 Rust 的支持,该插件提供文件检测、语法突出显示、格式化以及对 Syntastic 语法检查插件的支持。许多补全引擎都支持 Rust,例如 coc(通过 coc-rust-analyzer 插件)和 YouCompleteMe。