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

大家好,我是螃蟹哥。

實戰是學習編程語言最好的方式之一,Rust 也不例外。今天分享一篇實戰小工具後的總結。

我第一次用 Rust 編寫應用程序有點令人沮喪。每天使用大部分動態語言後,我很快發現自己與 Rust 的借用檢查器發生衝突 [1]。但是,我發現對於專注於內存安全和性能的靜態類型語言來說,這是一個合理的代價。

雖然這些 Rust 功能確實增加了像我這樣的新手的入門門檻,但它們也有助於檢查你的代碼,並且肯定這是該語言成功的主要因素。

另一個有趣的點是 Rust 沒有 GC(垃圾收集器)。一旦不再需要代碼中的某些內容(函數調用返回),與該範圍關聯的內存就會被清除。Rust 在編譯時插入 Drop::drop[2] 調用來做到這一點。我想這在概念上類似於 .NET 世界中 IL 或代碼編織的方式。這一事實意味着 Rust 不會受到帶有 GC 的語言有時會遇到的性能下降的影響。Discord 寫了一篇有趣的文章,介紹了他們如何通過從 Go 切換到 Rust[3] 來提高性能,提到了這一點。

01 目標

爲了從高層次上了解 Rust 語言和生態系統,我決定編寫一個簡單的工具。我的目標是:

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

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/yW4xM632K40cFun7FNiIxQ