点击上方蓝色“火丁笔记”关注我们,设个星标,每天学习全栈知识

来自一位专家对这两门语言的优缺点的评价。
如果你用 Rust 或 Go 语言编写过代码,就会发现它们之间有不少相似之处,同时也存在不同点。这两门语言的设计目标有重叠的部分,但也有很多差异。一般来说,选择哪门语言,取决于要解决的问题。
为了更好的了解这两门语言,我们找到了一位对这两门语言(Rust 和 Go)都有着丰富经验的工程师 — Damien Stanton,并与他进行了一次交流。他从 2014 年开始接触 Rust 和 Go 语言,当时他从事的某个项目要求能够静态编译为二进制文件。由于 Go 和 Rust 语言均具备这样的能力,因此他深入研究了这两门语言的优缺点。
从那时起,Damien 多次发现自己处于这两门语言的交汇处。尽管他的大部分编程经验都曾在 Go 上,但是他对于 Rust 社区解决各种问题抱有很大的兴趣,包括错误处理,泛型和并发。
所以,他花了大量时间研究两种语言,而且他将研究成果提交给了 Golang DC Meetup 社区(https://www.meetup.com/Golang-DC)—— 这里是该视频:“Go 程序员看 Rust” https://www.youtube.com/watch?v=eQjPvsmfIts&feature=emb_title。
我们与 Damien 的对话深入探讨了这两种语言的不同方面:它们的差异,相似之处以及两者之间的一些共同争议。
他的对话内容和长度已被编辑。
这两门语言之间有哪些相似之处?你说的设计重叠是指什么?
两种生态系统都在尝试解决许多相同或相似的问题。
它们都位于偏底层的系统语言(例如 C 或 C ++)和基于运行时的语言(例如 JavaScript 或 Python)之间。两种语言都倾向于系统编程领域。
我认为易于部署和交叉编译,这是两种语言做的很好的点。内存安全对两种语言也很重要。它们都天然地解决了需要高性能或高并发的问题。而传统的 Python 或 Java 是是不容易做到的。
每种语言都采用非常不同的方法,尤其是在内存管理中。但是,拥有稳定,可靠,易于维护和升级的代码是两者都擅长的事情。
2020 年,很多社区似乎都在表达这样一种观点:同时学会这两种语言,并使用它们解决不同的问题。那么,你同时掌握它们了,会如何选择呢?
使用 Go 编程:过去,人们认为 Go 是“用户友好的C”。但是就我的使用经验和对社区的观察来说,Go 可能是 Java 的更好继承者,因为它对构建分布式系统很有用。Go 对于构建服务器和分布式系统体系结构很有用。这就是 Kubernetes,Docker 和所有其他系统首先使用 Go 编写的原因。 使用 Rust 编程:该语言在时间/空间受限的情况下(例如微控制器)特别有用。Rust 的另一个重要用途是 Web Assembly。在 Rust 社区中,围绕着构建可编译为 Web 程序并在浏览器中运行的工具的做法很多。我认为 Rust 自然感觉上看更类似于 C++。
在两种语言之间进行选择时,我认为从某种程度上讲,这更多是关于您的编程背景,而不是您要解决的特定问题。您可能会以适合 Rust 代码库或 Go 代码库的方式处理大多数问题。
根据我在初创公司的经验,当时我们选择使用 Go,尤其是在我们处于快速增长时期时,因为它很容易上手。新的团队成员可以迅速开始贡献并帮助构建系统。
但对于 Rust 而言就不是这样了。由于其独特的内存模型,它的学习曲线更陡峭,更难上手。我发现具有 C++ 或 Java 背景的团队可能会很快选择它。如果这样的话,似乎会吸引来自“大”语言而不是“小”语言的人。
尽管有一个很好的,可以相互争论的案例,但该决定通常归结为相关人员的技术倾向以及技术经验或能力的问题。
围绕 Rust 和 Go 的讨论很多,有哪些热门话题更吸引你?
Go 泛型
在 Go 社区内部,最常见的抱怨就是范型的缺失。相比而言,Rust 具有强大的类型系统并支持泛型。它的设计哲学不同于 Go ,类型系统方面借鉴了 Haskell 和 C++。
GopherCon 2019 上,有一个关于范型的演讲提出了一种语法表达方式。我认为在 Go v2.0 之前,肯定会看到对于范型的正式支持。(如果不得不猜测的话,大概在 v1.16~v1.19 之间)。
并发
在过去的六个月里,Rust 并发特性发生了很大变化。
Rust 和 Go 使用者之间的常见讨论就是并发。Go 具有 goroutine+channel 的并发模型,而 Rust 则具备更简单的多线程模型。类似于 C++ 或 Java,但是具有更好的线程间通信能力,比如 MPSC channel(非常类似于 Go channel)。
但是现在,Rust 朝 Future 模型发展,其实就是我们已经熟悉的 async/await 模型,以同步的方式和思维编写代码,但以异步方式执行。
但是现在,Rust 生态系统已经朝着 Future 模型发展,这使其与 Python,JavaScript 或 C# 的工作方式保持一致。假设您有某种任务执行器,并且将一个函数标记为异步。该函数将在将来的某个时间完成,你需要等待结果。返回结果后,即可继续。人们真的很喜欢 async/await 模型,因为可以让你以同步的方式和思维编写代码,但却是异步执行。Future 模型非常强大。
还有一点,您可以编写自己的任务执行程序以控制算法。这类似于拥有自己的 goroutine 调度程序。
Rust 还有一个功能非常强大的宏(macro)系统,它使编译器可以做很多工作,如生成代码,而这些代码在 Go 中可能很繁琐或危险。在 Rust 中,还有更多可以自己控制的细节!尽管这对于解决各种问题很有好处,但它意味着还有很多东西要学习。像其他任何东西一样,这是一个权衡。所以这意味着 Rust 的学习挑战很大。
Go 的构建工具
长期以来,依赖管理一直是 Go 程序员抱怨的。在工作中,我们最近才切换到 Go modules。我们在迁移过程中的经验非常不错,但是我们读了很多恐怖故事。整体来说,Go 的工具效果很好,但是(就像语言本身一样)非常简单。现代开发人员希望为他们的编辑器提供稳定的语言服务器(languange server,可参考 lsp 协议),易于使用的依赖管理解决方案以及良好的自动文档和发布工具。其中一些功能在 Go 生态系统中运作良好,而其他功能却不理想。例如,语言服务器gopls 遇到了一些问题。另一方面,Rust 的 cargo 工具似乎没有这些问题。它可以正常工作,可以提供出色的文档,并且可以轻松地通过子命令进行扩展。
Fuschia:Google 的 Android 后继产品
关于 Go 与 Rust 的一个有趣的例子是 Google 的新软件 Fuschia,据说该软件最终将取代 Android。
Google 主要使用 C++ 构建该系统,但是其中有一些来自 ChromeOS 的 Rust 组件,其中包含大量 Rust。为了确定用户如何为 Fuschia 编写程序(即用户级程序而不是内核组件),他们研究了五种语言,包括 Go 和 Rust。在这种情况下,Go 的内存管理开销会导致过高的延迟。这是自动内存管理语言的普遍问题,最终只能用 C++ 或 Rust 编写面向用户的代码。
发布周期
这两种语言有非常不同的发布方式和发布周期:
Go 的发布周期:Go 的发布周期有些规律,但这也是一个黑匣子;核心团队之外没有人真正知道何时发布新版本。通常是通过一篇博客就宣布发布了。Gerrit/GitHub 上以 issue 形式存在的文档很多,但这依然不够完善和透明。 Rust 的发布周期:在 Rust 社区中,它更加透明。核心团队在 YouTube 上记录了所有团队会议,因此您实际上可以看到他们的讨论。特别是看到语言背后的设计思考和决策很有趣。Rust 具有明确的滚动发布周期,具有良好的稳定版/测试版/尝鲜版说明。
我不知道一种方法是否一定比另一种更好,但是它们肯定是不同的。我个人认为,从长远来看,所有内容完全开放和透明可能更好。
有时,使用 Go 语言进行技术决策的动机可能令人困惑,甚至没有道理。有些人对不允许任何辩论的技术决定有不良反应。核心团队成员这样说,最终或多或少是规则。不过,这不是书呆子,而是 Go 的核心设计理念。缺乏外界影响导致该语言保持非常简单且变化缓慢。
有趣的是,虽然它们的组织风格如此不同,但是两门语言都取得了巨大的成功。Go 和 Rust 都是很棒的语言,我希望两个社区的新手和资深程序员可以聚在一起,互相学习,一起变得更好!
原文链接:https://dmv.myhatchpad.com/insight/choosing-between-rust-or-go/
采访者:LAUREN ALEXANDER

Hi,此公众号由全栈技术交流群维护,持续发布关于Web全栈的技术知识。欢迎投稿/关注个人公众号:火丁笔记。

欢迎申请:polaris_6196 进入 “全栈技术交流群“ 讨论全栈技术。




