我为什么从 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 频道上寻求了一些帮助。 (你可能想注册我认识的一些人所在的通用 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.