写一个小型的 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] 。
这里可以看效果演示: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/
参考资料
借用检查器发生冲突: https://rustc-dev-guide.rust-lang.org/borrow_check.html
Drop::drop: https://doc.rust-lang.org/std/ops/trait.Drop.html
通过从 Go 切换到 Rust: https://blog.discord.com/why-discord-is-switching-from-go-to-rust-a190bbca2b1f
fstojson-rust: https://github.com/shogan/fstojson-rust
链接器: https://en.wikipedia.org/wiki/Linker
crates.io: https://crates.io/
rustup: https://rustup.rs/
文档: https://www.rust-lang.org/learn
学习 Rust 的半小时: https://fasterthanli.me/articles/a-half-hour-to-learn-rust
推荐阅读
觉得不错,点个赞吧
扫码关注「 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 开启替换潮?
- 喜欢 Rust 的 5 大理由,你认可吗?