寫一個小型的 Rust CLI 工具後的總結
關注「 Rust程式設計指北 」,一起學習 Rust,給未來投資
大家好,我是螃蟹哥。
實戰是學習程式語言最好的方式之一,Rust 也不例外。今天分享一篇實戰小工具後的總結。
我第一次用 Rust 編寫應用程式有點令人沮喪。每天使用大部分動態語言後,我很快發現自己與 Rust 的 借用檢查器發生衝突 [1] 。但是,我發現對於專注於記憶體安全和效能的靜態型別語言來說,這是一個合理的代價。
雖然這些 Rust 功能確實增加了像我這樣的新手的入門門檻,但它們也有助於檢查你的程式碼,並且肯定這是該語言成功的主要因素。
另一個有趣的點是 Rust 沒有 GC(垃圾收集器)。一旦不再需要程式碼中的某些內容(函式呼叫返回),與該範圍關聯的記憶體就會被清除。Rust 在編譯時插入 Drop::drop [2] 呼叫來做到這一點。我想這在概念上類似於 .NET 世界中 IL 或程式碼編織的方式。這一事實意味著 Rust 不會受到帶有 GC 的語言有時會遇到的效能下降的影響。Discord 寫了一篇有趣的文章,介紹了他們如何 通過從 Go 切換到 Rust [3] 來提高效能,提到了這一點。
01 目標
為了從高層次上了解 Rust 語言和生態系統,我決定編寫一個簡單的工具。我的目標是:
-
編寫一個 CLI 小工具。該工具將遞迴遍歷檔案系統中的目錄,並將結構作為 JSON 列印到標準輸出。
-
感受一下語言的語法。
-
瞭解包管理和依賴項是如何工作的。
-
檢視交叉編譯到其他平臺的選項。
02 工具 – fstojson
這是我為實現上述目標而編寫的小工具: fstojson-rust [4] 。
這裡可以看效果演示:http://asciinema.org/a/446165/embed
我已經在 macOS、Linux 和 Windows 上編譯了我的第一個應用程式,它們使用同一份原始碼,沒有任何問題。
03 Rust 包
Rust 包很容易理解和使用。Rust 使用 “crates”,它們的工作方式與 JavaScript 包非常相似。
要將 crate 新增到你的專案中,你只需將依賴項新增到 Cargo.toml 檔案(類似於 Node.js 中的 package.json 檔案)。
例如:
[dependencies] serde_json = "1.0.68"
一旦用 cargo
命令安裝了 crate ,你會得到一個鎖檔案( Cargo.lock ),就像在 Node.js 專案中使用 npm 或 yarn 一樣。
04 Rust 交叉編譯
第一次使用 rustup 安裝 Rust 時,會安裝當前平臺的標準庫。如果你想交叉編譯到其他平臺,你需要單獨新增這些目標平臺。
使用 rustup target add
命令新增其他平臺目標。使用 rustup target list
來顯示所有可用的目標。
要交叉編譯,你通常還需要安裝 連結器 [5] 。例如,如果你嘗試在 Windows 上編譯 x86_64-unknown-linux-gnu
,則需要 cc 連結器。
05 想法和印象
在 Rust 中啟動並執行一個非常簡單的 “hello-world” 應用程式很簡單。cargo 命令讓你可以非常輕鬆地構建專案。
然而,老實說,在那之後的幾個小時裡,我一直在努力解決更復雜的問題。主要是與“借用檢查器”作鬥爭。這是我的錯,因為我最初並沒有花太多時間通過文件熟悉該語言。我開始嘗試編寫一個小應用程式。
我上一次用系統程式語言寫東西至少是在 7 或 8 年前——我用 C++ 編寫了一個工具來靜默檔案系統,為要拍攝的快照做準備。除此之外,在引入 ARC 之前,我最後一次真正需要關注記憶體管理是使用 Objective-C (iOS)。
在我看來,Rust 的一些巨大好處也意味著它具有很高的進入門檻。它非常強調記憶體安全。我在我的第一個應用程式中嘗試做所有我可以在 Typescript/Javascript 或 C# 中輕鬆完成的事情。
我很快意識到 Rust 世界中的事物有多麼不同,以及這種固執己見的方法如何有助於保持你的程式碼無錯誤和你的應用程式在記憶體上的安全。
06 結語
經過多年的動態語言使用,我對 Rust 的第一次介紹有點不完整。這是一個很高的進入門檻,但話雖如此,我確實發現如果沒有編譯器警告,我的程式碼幾乎可以保證毫無問題地執行,這讓我感到滿意。
據我所知,Rust 生態系統是活躍和繁榮的。你可以使用 crates.io [6] 線上搜尋包。你可以使用 rustup [7] 來安裝工具鏈。
有大量的 stackoverflow 問題和答案,Rust 的 文件 [8] 頁面有很多很好的資訊。
展望未來,我將嘗試更多地研究 Rust 語言。我正在嘗試不同的程式語言(我在 C# 和 Typescript/JavaScript 方面有相當多的經驗,所以我現在從這些語言中擴展出來)。
我最近發現了這篇文章—— 學習 Rust 的半小時 [9] 。這個還是挺棒的。
原文連結:http://www.shogan.co.uk/development/my-first-rust-app-initial-impressions-and-what-i-struggled-with/
參考資料
借用檢查器發生衝突: http://rustc-dev-guide.rust-lang.org/borrow_check.html
Drop::drop: http://doc.rust-lang.org/std/ops/trait.Drop.html
通過從 Go 切換到 Rust: http://blog.discord.com/why-discord-is-switching-from-go-to-rust-a190bbca2b1f
fstojson-rust: http://github.com/shogan/fstojson-rust
連結器: http://en.wikipedia.org/wiki/Linker
crates.io: http://crates.io/
rustup: http://rustup.rs/
文件: http://www.rust-lang.org/learn
學習 Rust 的半小時: http://fasterthanli.me/articles/a-half-hour-to-learn-rust
推薦閱讀
覺得不錯,點個贊吧
掃碼關注「 Rust程式設計指北 」
- VSCode for Rust 相關外掛推薦
- Rust 安全參考 | Rust 編譯到 WebAssembly 可能出現側通道攻擊
- Rust 實戰:使用閉包和泛型實現簡單的Cache
- 學習 Rust 你需要一個認知框架
- Rust 實戰:使用 Iterator 迭代器實現斐波那契數列(Fibonacci)
- Rust 中的氣泡排序:第一部分
- rust Cell 與 RefCell的區別
- 2022年非同步Rust的改進計劃
- rust 如何用單調時鐘獲取更精確的時間間隔
- 反方觀點:為什麼我們沒有選擇Rust?
- rust使用vec在遍歷時刪除元素
- 為 Rust 編譯器提速的經驗分享
- Rust 中常見的有關生命週期的誤解
- Rust 與 C 不完全對比
- Python、Java佔主導,Rust、Go增長迅速,元宇宙成為關注焦點|2022技術趨勢預測
- Rust 在這個領域要大放異彩:一本新書推薦
- 用 Rust 鏽化 Vue Compiler
- Rust 到底值不值得學:萬字長文對比、特色和理念
- Node.js 開發者的 Rust 入門指南
- 厭倦 JavaScript,開發者用 Rust 開啟替換潮?