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

另請參閱[編輯 | 編輯原始碼]

參考資料[編輯 | 編輯原始碼]