我为什么从 Java 转向 Rust

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

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

在多年的 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 频道上寻求了一些帮助。 (您可能想注册 general Slack Rust channel,那里住着一些我认识的人。) 很多人对哪里出错了提出了一些建议,其中一个人在剖析一些建议方面非常有帮助,所以我更好地理解了它们。 他解释了很多,但最后说,“我不知道你调用的哈希函数的返回类型——我认为这是一个好地方,让你自己弄清楚这部分。”

这是我试图达到的目标

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。

Alex -

你的观点完全公平,我并不是说关于它的一切都感觉很熟悉,更确切地说,足够多的东西感觉很熟悉,以至于最初的学习曲线并不陡峭。

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

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

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