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)