写一个小型的 Rust CLI 工具后的总结
2021-11-25 19:12:00 Author: mp.weixin.qq.com(查看原文) 阅读量:21 收藏

实战是学习编程语言最好的方式之一,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


往期推荐

我是 polarisxu,北大硕士毕业,曾在 360 等知名互联网公司工作,10多年技术研发与架构经验!2012 年接触 Go 语言并创建了 Go 语言中文网!著有《Go语言编程之旅》、开源图书《Go语言标准库》等。

坚持输出技术(包括 Go、Rust 等技术)、职场心得和创业感悟!欢迎关注「polarisxu」一起成长!也欢迎加我微信好友交流:gopherstudio


文章来源: http://mp.weixin.qq.com/s?__biz=MzAxNzY0NDE3NA==&mid=2247488914&idx=2&sn=3c6664693aa90bc863c1d9f55a524103&chksm=9be33a73ac94b365f9531991699d77fe204fa053d94b1ce3ac28be9d6695c46d03bc24cbcf45#rd
如有侵权请联系:admin#unsafe.sh