我为什么从 Java 转向 Rust

Rust 感觉是未来的方向:它结构良好、富有表现力,并且帮助你做正确的事情。
91 位读者喜欢这篇文章。
Why and how to handle exceptions in Python Flask

图片来自 Unsplash.com,知识共享 Zero 许可 

最近,在多年的 Java 开发之后,我开始学习 Rust。脑海中不断浮现的五个要点是

  1. Rust 感觉很熟悉
  2. 引用有意义
  3. 所有权将会变得有意义
  4. Cargo 非常有用
  5. 编译器非常出色

我绝对坚持所有这些观点,但我还有更多要说,因为我现在感觉自己像一个 Rustacean1 ,因为

  • 我再也不想用其他任何语言编程了。
  • 我已经摆脱了简单的咒语。

我所说的这两个声明是什么意思?嗯,第一个很简单:Rust 感觉是未来的方向。它结构良好、富有表现力,并且帮助你做正确的事情,2 它有很棒的文档和工具,并且有一个很棒的社区。当然,这一切都是开源的,这正是我深深关心的事情。

这是一个 Rust 使用示例

// Where checkhashes is pre-defined vector of hashes to verify
let algorithms = vec![String::from("SHA-256"); checkhashes.len()];

这会创建一个名为“algorithms”的新向量,其长度与向量“checkhashes”相同,并用字符串“SHA-256”填充它。第二个呢?好吧,我决定为了正确学习 Rust,我应该采用一个最初用 Java 编写的项目,并希望以相当地道的 Rust 重新实现它。不久之后,我开始修复错误——并犯错误——围绕实现而不是围绕语法。我不仅仅是从教程中复制文本,或者根据编译器输出对我的代码进行看似随机的细微更改。换句话说,我让代码编译通过,理解了它们为什么编译通过,然后只是犯了编程错误。3

这是另一个示例,应该会感觉非常熟悉

fn usage() {
    println!("Usage: findfromserial KEY_LENGTH INITIAL_SALT CHECK_HASH1 [CHECK_HASH2, ...]");
    std::process::exit(1);
}

这是一个巨大的进步。当你开始学习一门语言时,很容易只是复制粘贴你在其他地方看到的文本,或者摆弄不熟悉的结构,直到它们——勉强——工作。使用或生成你并不真正理解但似乎可以工作的代码有时被称为“使用咒语”(来自小说、电影和游戏中的大多数魔术师背诵一系列“只是工作”的魔语,而没有真正理解他们在做什么或单词组合实际意味着什么的想法)。有些语言4 特别容易出现这种方法,但许多——大多数?——学习新语言的人在刚开始时都容易这样做,只是因为他们想让事情正常工作。

最近,我一直熬夜到凌晨 1 点来实现一个新功能——接受命令行输入——我真的搞不懂。我花了很多时间在这上面(包括寻找——但未能找到——一些合适的咒语),然后在内部 rust-lang 频道上寻求了一些帮助。(你可能想注册 通用 Slack Rust 频道,那里住着一些我认识的人。)一些人对哪里出了问题提出了一些建议,其中一个人非常乐于助人地分析了一些建议,所以我更好地理解了它们。他解释了很多,但最后说,“我不知道你调用的哈希函数的返回类型——我认为这是一个你自己弄清楚的好地方。”

这就是我试图达到的目标

checkhashes = std::env::args()
    .skip(3)
    .map(|x| hex::decode(x))
    .collect::<Result<Vec<Vec<u8>>, _>>()
    .unwrap();

在你想通之前它可能看起来很奇怪,但它实际上按你可能期望的那样工作:我想从命令行获取输入,跳过前三个输入,迭代其余输入,将每个输入转换为 u8 向量并创建一个向量。 “collect”调用的末尾的 _ 会收集任何错误或问题,并基本上将其丢弃。

这正是我需要的,也是任何学习任何东西的人(包括编程语言)所需要的。所以当我在午夜不得不下楼放狗时,我决定留在楼下,看看我是否可以自己解决问题。我做到了。我采纳了人们提出的建议,理解了他们在做什么,试图推测他们应该做什么,弄清楚他们应该如何做,然后找到了实现它的正确方法。

我还有很多东西要学,我仍然会犯很多错误,但现在我觉得我已经能够找到解决这些错误的方法(可能需要一些帮助——感谢所有已经为我指明正确方向的人)。但我确实觉得我现在真的在用 Rust 编程。我喜欢它。


  1. 这就是 Rust 程序员对自己的称呼。
  2. 完全阻止人们做错事几乎是不可能的,但鼓励人们做正确的事是很棒的。事实上,Rust 更进一步,实际上使得在许多情况下难以做错事。你真的必须非常努力才能在 Rust 中做坏事。
  3. 例如,我在我的代码中发现了一个特别离谱的差一错误,这与 Rust 无关,而与我没有足够注意程序流程有关。
  4. 咳嗽 Perl 咳嗽

本文基于 More Rusty thoughts 在 Alice, Eve and Bob – 安全博客上发布,并经许可重复使用。

接下来阅读什么
标签
User profile image.
自 1997 年左右以来,我一直参与开源,并且从那时起一直使用 (GNU) Linux 作为我在家和工作的主要桌面:并非总是容易...  我是一名安全专家和架构师,Enarx 项目的联合创始人,目前是一家初创公司的 CEO,该公司位于

10 条评论

我喜欢这些故事让开发者听起来如此重要,并决定一切的方式。可能在小规模公司中是这样。但是,如果你在一家拥有数千名 Java 程序员以及所有装饰和设置的大公司工作,而一个人用 Rust 敲出了一些东西,那就不行了。我最不想在凌晨 3 点发现只有一个人懂这周的语言,而他在 6 个月前就来过又走了。这根本不可能发生。可支持性和维护是关键。

Richard -

感谢您的评论。小规模公司...或开源项目。当然,用一种新语言开始一些新的东西更容易。你说“小公司”——微软正在转向 Rust。这当然需要时间,但有时好处是如此巨大,以至于可能会发生转变。

-Mike。

回复 作者 Richard Bunnett (未验证)

当财富 500 强中的每一家都有成千上万的开发人员支持和维护 C++、COBOL、C 等时,Java 是如何超越成为本周语言的?

回复 作者 Richard Bunnett (未验证)

您看到任何性能提升吗?您建议将 Rust 用于微服务开发吗?

现在说还为时过早,我认为。我正在进行的特定项目在 Rust 中确实比 Java 快,但我犹豫是否仅从这一点得出更普遍的结论!

回复 作者 Himanshu Gupta (未验证)

很棒的文章!

我同意作者所说的一切,除了第一个论点。

无论你来自哪种语言,这都_不_熟悉
fn args<'a, 'b, T: ToCStr>(&'a mut self, args: &'b [T]) -> &'a mut Command;
(而且它可能比这更复杂!)

尽管如此,我认为生命周期是一个绝妙的主意,而 Rust 从扩展意义上来说是一门出色的语言。
@Himanshu Gupta 对于纯计算,我看到 Rust 比同等的 Java 代码快了不止一个数量级,而是两个数量级。但实际上使 Rust 适合微服务的原因是需要复制的工件更小,没有运行时,并且使用的内存更少。Golang 可能更适合微服务。虽然总体效率不如 Rust,但它配备了丰富的开箱即用库,因此开发速度将比 Rust 快得多得多。我只会将 Rust 用于最关键的代码片段。

Alex -

您的观点完全公平,我并不是说关于它的一切都感觉熟悉,而是_足够多_关于它的东西感觉熟悉,以至于最初的学习曲线并没有那么陡峭。

回复 作者 Alex-M (未验证)

这是一个非常好的开始之旅。我喜欢你解释你如何从 Java 切换到 Rust 的事实。鉴于你拥有的丰富经验,你成功的方式更具启发性。尽管 Rust 并不常见,并且根据财富 500 强排名,其使用率较低。我应该大胆尝试一下。这让我对扩展我的编程世界有了新的认识。我接受这个挑战,将学习 Rust 与我的 C++ 语言结合起来。

知识共享许可协议本作品根据知识共享署名-相同方式共享 4.0 国际许可协议获得许可。
© . All rights reserved.