前言-為什么想學Rust?
一直想多學一門編譯語言,主要有幾個原因吧(1. 看到一位老師實驗室要求需要掌握一門編譯語言;2. 自己享想試著開發一些實用的生信工具,感覺自己現在相比于數據分析,探索生物學層面的意義相比更想做一些實用性的東西出來),之前在C、C++、Rust之間搖擺,一直沒有行動起來學,確實也怪自己拖延。
直到前段時間,想去的那個實驗室發了一篇很有創新性的文章,又勾起了我想前往深造的想法。(疊個甲,不是只想著為了發文章才去,而是覺得在那里會有更多的可能性。)再瀏覽實驗室信息的時候,偶然發現一位博士師兄之前竟然是我在B-G-I實習時候的室友,盡管只當了三四天的室友,但對他的一些基本情況還是比較了解的。知道他去了那個學校,但沒想到竟然去了那位老師門下。
有在網上搜索這位師兄的相關信息,確實很優秀,掌握很多技能,漸漸地心里將他變成了我研究生階段的榜樣。看到他的github或者是推文中都在推薦Rust,我那搖擺的天平最終偏向Rust這邊,下決心要開始行動了。
再不做真的就wan(晚/完)了。
說干就干,趕緊學!!!
PS:現在腦中有個小工具的雛形,爭取能在今年實現!!
Rust資源
- Rust圣經
關于本書 - Rust語言圣經(Rust Course)
- 菜鳥教程
Rust 教程 | 菜鳥教程
- Rust官方文檔中文教程
Rust 文檔網 - Rust 官方文檔中文教程
- rustlings
https://github.com/rust-lang/rustlings/
- 在線運行網站
Rust Playground
- Rust By Example
Introduction - Rust By Example
Rust特點
簡單了解一下Rust特點,之前一直聽說一大特點是內存安全,之前在大一時候學過C++,但是到后面學指針的時候就開小差了,其實也不能很好理解這部分內容。這里引用一下菜鳥教程里的內容吧:
- 內存安全:Rust 的所有權系統在編譯時防止空懸指針、數據競爭等內存錯誤,無需垃圾收集器。
- 并發編程:Rust 提供了現代的語言特性來支持并發編程,如線程和消息傳遞,使得編寫并發程序更加安全和容易。
- 性能:Rust 編譯為機器碼,沒有運行時或垃圾收集器,能夠提供接近 C 和 C++ 的性能。
- 類型系統:Rust 的類型系統和模式匹配提供了強大的抽象能力,有助于編寫更安全、更可預測的代碼。
- 錯誤處理:Rust 的錯誤處理模型鼓勵顯式處理所有可能的錯誤情況。
- 宏系統:Rust 提供了一個強大的宏系統,允許開發者在編譯時編寫和重用代碼。
- 包管理:Rust 的包管理器 Cargo 簡化了依賴管理和構建過程。
- 跨平臺:Rust 支持多種操作系統和平臺,包括 Windows、macOS、Linux、BSDs 等。
- 社區支持:Rust 有一個活躍的社區,提供了大量的庫和工具。
- 工具鏈:Rust 擁有豐富的工具鏈,包括編譯器、包管理器、文檔生成器等。
- 無段錯誤:Rust 的所有權和生命周期規則保證了引用的有效性,從而避免了段錯誤。
- 迭代器和閉包:Rust 提供了強大的迭代器和閉包支持,簡化了集合的處理。
對于生信可以借助Rust進行工具開發,這也是我一直想學著做的一件事
Cargo
我們在平常管理生信環境是經常會用到conda/pip,那么在Rust里面可以使用Cargo來對包進行管理。
創建項目
在這里使用cargo創建一個world_hello項目
(base) PS D:\000zyf\Learning\rust_learn> cargo new world_helloCreating binary (application) `world_hello` package
note: see more `Cargo.toml` keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
(base) PS D:\000zyf\Learning\rust_learn> cd .\world_hello\
(base) PS D:\000zyf\Learning\rust_learn\world_hello> lsDirectory: D:\000zyf\Learning\rust_learn\world_helloMode LastWriteTime Length Name
---- ------------- ------ ----
d---- 2025/4/12 21:33 src
-a--- 2025/4/12 21:33 82 Cargo.toml(base) PS D:\000zyf\Learning\rust_learn\world_hello>
這里如果使用命令cargo new --vcs git xxx
來創建項目的話還會給出相應的git文件。
吐槽:windows終端上操作真難受!!
運行項目
有兩種方式運行:
cargo run
- 手動編譯和運行項目
cargo run
在剛剛創建的項目路徑下運行cargo run
便可看到:
(base) PS D:\000zyf\Learning\rust_learn\world_hello> cargo run Compiling world_hello v0.1.0 (D:\000zyf\Learning\rust_learn\world_hello)Finished `dev` profile [unoptimized + debuginfo] target(s) in 5.83sRunning `target\debug\world_hello.exe`
Hello, world!
上述代碼,cargo run
首先對項目進行編譯,然后再運行,因此它實際上等同于運行了兩個指令
手動編譯運行
(base) PS D:\000zyf\Learning\rust_learn\world_hello> cargo buildFinished `dev` profile [unoptimized + debuginfo] target(s) in 0.03s
(base) PS D:\000zyf\Learning\rust_learn\world_hello> lsDirectory: D:\000zyf\Learning\rust_learn\world_helloMode LastWriteTime Length Name
---- ------------- ------ ----
d---- 2025/4/12 21:39 src
d---- 2025/4/12 21:50 target
-a--- 2025/4/12 21:39 8 .gitignore
-a--- 2025/4/12 21:50 155 Cargo.lock
-a--- 2025/4/12 21:39 82 Cargo.toml(base) PS D:\000zyf\Learning\rust_learn\world_hello> .\target\debug\world_hello.exe
Hello, world!
(base) PS D:\000zyf\Learning\rust_learn\world_hello>
行云流水,但談不上一氣呵成。 細心的讀者可能已經發現,在調用的時候,路徑 ./target/debug/world_hello 中有一個明晃晃的 debug 字段,沒錯我們運行的是 debug 模式,在這種模式下,代碼的編譯速度會非常快,可是福兮禍所伏,運行速度就慢了. 原因是,在 debug 模式下,Rust 編譯器不會做任何的優化,只為了盡快的編譯完成,讓你的開發流程更加順暢。
比如你想要高性能的代碼怎么辦? 簡單,添加 --release 來編譯:
cargo run --release
cargo build --release
試著運行一下我們高性能的 release 程序:
(base) PS D:\000zyf\Learning\rust_learn\world_hello> cd .\target\
(base) PS D:\000zyf\Learning\rust_learn\world_hello\target> lsDirectory: D:\000zyf\Learning\rust_learn\world_hello\targetMode LastWriteTime Length Name
---- ------------- ------ ----
d---- 2025/4/12 21:51 debug
d---- 2025/4/12 22:00 release
-a--- 2025/4/12 21:51 1120 .rustc_info.json
-a--- 2025/4/12 21:50 177 CACHEDIR.TAG(base) PS D:\000zyf\Learning\rust_learn\world_hello\target> .\release\world_hello.exe
Hello, world!
cargo check
當項目大了后,cargo run 和 cargo build 不可避免的會變慢,那么有沒有更快的方式來驗證代碼的正確性呢?大殺器來了,接著!
cargo check 是我們在代碼開發過程中最常用的命令,它的作用很簡單:快速的檢查一下代碼能否編譯通過。因此該命令速度會非常快,能節省大量的編譯時間。
Cargo.toml和Cargo.lock
Cargo.toml 和 Cargo.lock 是 cargo 的核心文件,它的所有活動均基于此二者。
Cargo.toml 是 cargo 特有的項目數據描述文件。它存儲了項目的所有元配置信息,如果 Rust 開發者希望 Rust 項目能夠按照期望的方式進行構建、測試和運行,那么,必須按照合理的方式構建 Cargo.toml。
Cargo.lock 文件是 cargo 工具根據同一項目的 toml 文件生成的項目依賴詳細清單,因此我們一般不用修改它。
什么情況下該把 Cargo.lock 上傳到 git 倉庫里?很簡單,當你的項目是一個可運行的程序時,就上傳 Cargo.lock,如果是一個依賴庫項目,那么請把它添加到 .gitignore 中。
現在用 VSCode 打開上面創建的"世界,你好"項目,然后進入根目錄的 Cargo.toml 文件,可以看到該文件包含不少信息:
[package]
name = "world_hello"
version = "0.1.0"
edition = "2024"[dependencies]
name 字段定義了項目名稱,version 字段定義當前版本,新項目默認是 0.1.0,edition 字段定義了我們使用的 Rust 大版本。
定義項目依賴
使用 cargo 工具的最大優勢就在于,能夠對該項目的各種依賴項進行方便、統一和靈活的管理。
在 Cargo.toml 中,主要通過各種依賴段落來描述該項目的各種依賴項:
- 基于 Rust 官方倉庫 crates.io,通過版本說明來描述
- 基于項目源代碼的 git 倉庫地址,通過 URL 來描述
- 基于本地項目的絕對路徑或者相對路徑,通過類 Unix 模式的路徑來描述