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

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

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

这是一个巨大的进步。 当你开始学习一门语言时,很容易只是复制粘贴你在其他地方看到的文本,或者摆弄不熟悉的结构,直到它们——勉强——工作。 使用你不真正理解但似乎可以工作的代码或生成代码有时被称为“使用咒语”(来自 fiction、电影和游戏中的大多数魔法师背诵“只是工作”的魔法词集合,而没有真正理解他们在做什么或单词组合实际含义的想法)。 有些语言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。

Alex -

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

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

这是一个很好的入门之旅。 我喜欢你解释你如何从 Java 转向 Rust 的事实。 你凭借你周围的丰富经验来解决这个问题的方式更具启发性。 虽然 Rust 并不常见,并且根据财富 500 强排名使用率较低。 我应该大胆尝试一下。 这让我对扩展我的编程世界有了新的认识。 我接受这个挑战,将学习 Rust 与我的 C++ 语言结合起来。

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