我已经很久没有好好学习一门新语言了——无论是计算机语言还是人类语言。大概有 25 年了。那门语言是 Java,虽然这段时间我不得不写一些 C 语言(非常非常少)和 JavaScript,但我写过大量实际代码的语言只有 Perl 和 Java。
我是一个名为 Enarx 的项目的联合创始人,该项目几乎完全用 Rust 编写。现在我称自己为“架构师”,自从我编写任何生产代码以来已经有很长一段时间了。在 2019 年圣诞节前夕,我完成了近几年编写的第一个重要项目:用 Java 实现一套关于专利申请的算法。这是一个让我重新投入代码的好机会,我对它非常满意。
以下是我作为一名具有强大面向对象背景的 Java 开发人员对 Rust 的一些看法。
1. Rust 感觉很熟悉
虽然您会发现的许多教程和书籍都是以 C 和 C++ 为目标编写的,但 Rust 与 Java 有足够的相似之处,使通用语言感觉很熟悉。我一直在使用的两个教程是 The Rust Programming Language(在线版)和经典的 Programming Rust 书籍(纸质版),后者经常提及与其他语言(不仅包括 C、C++ 和 Java,还包括 Python、JavaScript 等)的异同。像控制结构和类型这样的东西与 Java 非常相似,以至于它们通常很容易理解,虽然存在一些主要差异,但您应该能够相当简单地掌握该语言的基础知识。但是请注意:我最初遇到的最大问题之一是 Rust 有时感觉太熟悉了,所以我开始尝试用错误的方式做事,不得不退回去,尝试找出一种更符合 Rust 习惯的方法。在这方面我还有很长的路要走!
2. 引用有意义
在 Rust 中,您最终不得不使用引用,即通过内存地址访问数据。坦率地说,当我查看 C 或 C++ 时,引用和解引用变量对我来说从来没有多大意义,但这一次,我觉得我明白了。如果您习惯于通过引用和值传递 Java 变量,并且知道何时需要在特定情况下采取步骤来以不同的方式执行此操作,那么您就准备好开始理解 Rust 引用了。您需要理解的另一件事是为什么 Rust 需要您使用它们:这是因为 Rust 在内存管理方面非常非常小心,并且您没有垃圾回收器来在您去任何地方之后进行清理(就像在 Java 中一样)。您不能随意传递字符串(例如):Rust 将坚持要求您知道变量的生命周期 并考虑何时可以“drop”它。这意味着您需要认真思考作用域,并且它引入了一个复杂的概念:所有权。
3. 所有权将会有意义
老实说,我还没有完全理解。我学习 Rust 和用 Rust 编码已经不到两周了,我开始逐渐理解所有权。对我来说(我怀疑对许多新手来说也是如此),这是从 Java 或大多数其他语言转向 Rust 的重大转变:所有权。正如我上面提到的,您需要了解变量何时将被使用以及它将存活多久。然而,还有更多内容,真正理解这一点对我这个 Java 开发人员来说感觉有点陌生:您需要了解 堆栈和堆,Java 将这种区别充分地对我隐藏起来了,但许多 C 和 C++ 开发人员可能会更容易理解。这里不是解释这个概念的地方(我发现 Programming Rust 中的图表特别有帮助),但是为了管理内存中变量的生命周期,Rust 将需要知道哪个组件拥有每个变量。当您习惯于创建对象并使用来自各处的变量实例化它们时(就像在 Java 中一样),这会变得很复杂,并且需要进行一些重大的重新思考。将此与生命周期的显式标记相结合,是我现在必须执行的最大概念性更改。
4. Cargo 非常有用
我老实说没有正确使用最新和最棒的 Java 工具。当我开始学习 Java 时,它甚至还不是 1.0 版本,当我完成定期编写生产代码时,还没有必要学习最新的工具,所以 Java 在这方面可能比我记得的要好,但是用于管理 Rust 项目的各个部分的内置工具,包括依赖项、库、编译和测试,都是一个启示。Cargo 二进制文件只是做了正确的事情,当它意识到您更改了依赖项时,看到它完成它的工作真是太棒了。例如。它将执行自动测试、自动优化、生成文档——如此多的有用任务,都在一个包中。将此与 Git 存储库结合使用,管理项目变得更理智、更轻松。
5. 编译器非常棒
最后,但绝非最不重要的是编译器。我喜欢 Rust 编译器:它真的非常努力地帮助您。社区的成员1 (他们制作和维护 Rust)显然不遗余力地提供有用的指导,以在您犯错时纠正您——而我,就我个人而言,已经犯了很多错误。与其说是其他语言编译器中可能熟悉的神秘预言,不如说是您会得到带有警告和错误以及关于您实际可能想要做什么的建议的彩色编码文本。您甚至会得到如下输出:
For more information about this error, try rustc --explain E0308
当您尝试这样做时,您会得到(通常!)有用的解释和代码片段。有时,特别是当您仍在努力学习该语言时,并不总是很明显您哪里做错了,但是仔细研究错误可以帮助您理解这些概念,这与我习惯从 javac 工具收到的消息感觉非常不同,例如。
结论
我不期望永远编写大量的生产 Rust 代码,也不期望真正达到专家级别——无论是在 Rust 还是在任何其他语言中,说实话——但我真的认为 Rust 有很多值得称道的地方。在我到目前为止的旅程中,我一直在点头,并思考,“这真是一个好方法来做这件事”,或者“啊,这比我习惯的方式更有道理。” 这篇文章不是关于为什么 Rust 是一种如此优秀的语言——有很多这样的文章——也不是关于学习 Rust 的最佳方法——也有很多这样的文章——但我可以说我正在享受它。它具有挑战性,但教程、书籍和其他学习材料都非常强调解释 Rust 做出选择的原因,这当然对我有帮助,既可以解决我的挫败感,也可以尝试内化 Java 和 Rust 之间的一些差异。
如果我能真正理解 Rust,我真的认为我可能永远不会再写任何 Java 了。我不确定我是否还有另外 25 年的编码生涯,但我认为我现在会长期使用 Rust 了。我是一个(初出茅庐的)Rustacean。
1. 当然,Rust 是完全开源的,并且社区对它的支持似乎非常棒。
本文基于 5 Rust reflections (from Java),来自 Alice, Eve, and Bob – 一个安全博客,并已获得许可重复使用。
评论已关闭。