寫一個小型的 Rust CLI 工具後的總結

語言: CN / TW / HK

關注「 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]

這裡可以看效果演示:https://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] 。這個還是挺棒的。

原文連結:https://www.shogan.co.uk/development/my-first-rust-app-initial-impressions-and-what-i-struggled-with/

參考資料

[1]

借用檢查器發生衝突: https://rustc-dev-guide.rust-lang.org/borrow_check.html

[2]

Drop::drop: https://doc.rust-lang.org/std/ops/trait.Drop.html

[3]

通過從 Go 切換到 Rust: https://blog.discord.com/why-discord-is-switching-from-go-to-rust-a190bbca2b1f

[4]

fstojson-rust: https://github.com/shogan/fstojson-rust

[5]

連結器: https://en.wikipedia.org/wiki/Linker

[6]

crates.io: https://crates.io/

[7]

rustup: https://rustup.rs/

[8]

文件: https://www.rust-lang.org/learn

[9]

學習 Rust 的半小時: https://fasterthanli.me/articles/a-half-hour-to-learn-rust

推薦閱讀

覺得不錯,點個贊吧

掃碼關注「 Rust程式設計指北