Rust vs. Go:为什么他们在一起更好

30 篇文章 26 订阅

Rust vs. Go:为什么他们在一起更好

Rust vs. Go:为什么他们在一起更好

虽然很多人可能认为 Rust 和 Go 是竞争激烈的编程语言,但 Rust 和 Go 团队都不这么认为。恰恰相反,我们的团队非常尊重其他人正在做的事情,并将这些语言视为对整个软件开发行业现代化共同愿景的补充。

在本文中,我们将讨论 Rust 和 Go 的优缺点,以及它们如何相互补充和支持,以及我们对于何时使用两种语言最合适的建议。

企业发现了采用这两种语言的价值,以及它们的互补价值。为了将我们的观点转变为实际操作的用户体验,我们与三家这样的公司进行了交流,它们分别是 Dropbox、 Fastly 和 Cloudflare,谈论了它们一起使用 Go 和 Rust 的体验。在本文中,我们将引用他们的话来进一步阐述我们的观点。

语言比较

在这里插入图片描述

Go: 应用程序接口,Web 应用程序,CLI 应用程序,DevOps,网络,数据处理,云应用
Rust:物联网,处理引擎,安全敏感应用,系统组件,云应用

共同点

Go 和 Rust 有很多共同点。这两种语言都是现代软件语言,它们都需要为影响软件开发的问题提供安全和可伸缩的解决方案。两者都是针对开发者在业界现有语言中遇到的问题,特别是开发者的生产力、可伸缩性、安全性和并发性方面的缺陷而创建的。

今天的大多数流行语言都是在30年前设计的。当这些语言被设计出来的时候,与今天有五个关键的不同:

  1. Moore’s law was thought to be eternally true. 摩尔定律被认为是永恒正确的
  2. Most software projects were written by small teams, often working in person together. 大多数软件项目都是由小团队编写的,通常是一起工作
  3. Most software had a relatively small number of dependencies, mostly proprietary. 大多数软件都有相对较少的依赖关系,大多是私有的
  4. Safety was a secondary concern… or not a concern at all. 安全是次要的问题… 或者根本不是问题
  5. Software was typically written for a single platform. 软件通常是为单一平台编写的

相比之下,Rust 和 Go 都是为当今世界编写的,并且通常采用类似的方法来设计一种满足当今开发需求的语言。

1. 性能和并发性

Go 和 Rust 都是专注于生成高效代码的编译语言。它们还可以方便地访问当今机器的多个处理器,使它们成为编写高效并发代码的理想语言。

“通过使用 Go,MercadoLibre 可以将用于这项服务的服务器数量减少到原来的八分之一(从32台减少到4台) ,而且每台服务器可以使用更少的能量运行(原来是4个 CPU 内核,现在减少到2个 CPU 内核)。随着 Go 的推出,该公司削减了88% 的服务器,其余服务器的 CPU 也减少了一半——节省了巨大的成本。” — “MercadoLibre 随着Go成长”

“在我们运行 Go 代码的严格管理的环境中,我们已经看到通过更简洁和可维护的代码,CPU 降低了大约10% 。” — Bala Natarajan,Paypal

“在 AWS,我们也喜欢 Rust,因为它帮助 AWS 编写高性能、安全的基础设施级网络和其他系统软件。亚马逊的第一个值得注意的产品是 Rust,Firecracker,于2018年公开发布,提供了开源虚拟化技术,为 AWS Lambda 和其他无服务器产品提供动力。但是我们也使用 Rust 来提供服务,比如 Amazon Simple Storage Service (Amazon s 3) ,Amazon EC2,Amazon CloudFront,Amazon Route 53,等等。最近我们推出了 Bottlerocket,这是一个基于 linux 的容器操作系统,用 Rust 编写。”ー Matt Asay,Amazon Web Services

我们“看到我们的速度惊人地提高了1200-1500% !我们使用 Scala 从300-450毫秒的发布模式实现了更少的解析规则,使用 Rust 从25-30毫秒的解析规则实现了更多的解析规则!”ー Josh Hannaford,IBM

2. 团队可扩展性ー可复审性

今天的软件开发是由成长和发展的团队构建的,通常使用源代码控制以分布式的方式进行协作。Go 和 Rust 都是为团队工作方式而设计的,它们通过消除不必要的顾虑,如格式、安全性和复杂的组织结构来改进代码审查。这两种语言都不需要什么上下文来理解代码在做什么,允许审阅者更快地处理其他人编写的代码,审阅团队成员和团队外开源开发人员贡献的代码。

“构建 Go 和 Rust 代码,在我早期的职业生涯中来自 Java 和 Ruby 背景,感觉就像肩上不可能卸下的重担。当我在谷歌的时候,遇到一个用Go编写的服务是一种解脱,因为我知道它很容易构建和运行。对 Rust 来说也是如此,尽管我只是在一个小得多的规模上做过这方面的工作。我希望无限可配置构建系统的时代已经结束,所有的语言都有自己的专用构建工具,可以直接在盒子外工作。”ーSam Rose,CV Partner

“在 Go 中编写服务时,我常常松一口气,因为与动态语言相比,它有一个非常简单、容易推理的静态类型系统,并发性是一个第一类物件,而 Go 的标准库优美得令人难以置信,功能强大,同时又切中要害。以标准的 Go 安装为例,加入一个 grpc 库和一个数据库连接器,在服务器端构建任何东西只需要很少的其他东西,每个工程师都能够阅读代码并理解库。在 Rust 中编写模块时,Dropbox 的工程师们感觉到,在 Async-await 于2019年稳定下来之前,Rust 在服务器端的成长阵痛已经到来,但自那以后,各种板条箱都在趋于一致地使用它,我们从异步模式和无所畏惧的并发性中获益。”ー Daniel Reiter Horn,Dropbox

3. 开放源码

如今,一般软件项目所使用的依赖项数量是惊人的。现代软件开发已经实现了数十年的软件复用目标,今天的软件是使用100个项目构建的。为了做到这一点,开发人员使用软件存储库,在不断扩大的应用程序中,软件存储库越来越成为软件开发的主要工具。反过来,开发人员包含的每个包都有自己的依赖项。当今编程环境中的语言需要毫不费力地处理这种复杂性。

Go 和 Rust 都有软件包管理系统,允许开发人员列出他们想要构建的软件包的简单列表,语言工具会自动获取和维护这些软件包,这样开发人员就可以更多地关注他们自己的代码。

4. 安全

o 和 Rust 都很好地解决了当今应用程序的安全问题,它们确保用语言编写的代码能够运行,而不会让用户暴露于各种典型的安全漏洞,如缓冲区溢出、释放后使用等。通过移除这些关注点,开发人员可以专注于手头的问题,并构建默认情况下更安全的应用程序。

“当你遇到错误时,[ Rust ]编译器真的会帮助你。这使您能够专注于业务目标,而不是寻找错误或破译神秘的消息。” ー Josh Hannaford,IBM

“简而言之,Rust 的灵活性、安全性和安全性超过了不得不遵循严格的生存期、借用和其他编译器规则的任何不便,甚至超过了没有垃圾收集器的不便。这些特性是云软件项目急需的附加功能,将有助于避免其中常见的许多缺陷。”ー Taylor Thomas,sr,Microsoft

”Go 是强静态类型的,没有隐式转换,但语法开销仍然惊人地小。这是通过赋值中的简单类型推断以及非类型化数值常量来实现的。这使得 Go 比 Java (具有隐式转换)具有更强的类型安全性,但代码读起来更像 Python (具有非类型化变量)。”ー计算机科学教授 Stefan Nilsson

“在 Dropbox 构建用于存储块数据的 Brotli 压缩库时,我们限制自己使用 Rust 的安全子集,而且还限制自己使用核心库(no-stdlib) ,并将分配器指定为泛型。以这种方式使用 Rust 的子集,可以非常容易地从客户端的 Rust 调用 Rust-Brotli 库,并使用 Python 和 Go on the Server 的 c FFI。这种汇编模式也提供了实质性的安全保障。经过一些调优后,Rust Brotli 实现尽管是100% 安全的、数组边界检查代码,但仍然比 c 语言中相应的本地 Brotli 代码快。

5. 真正便携

在 Go 和 Rust 中,编写一个在许多不同的操作系统和体系结构上运行的软件是微不足道的。“写一次,随处编译。”此外,Go 和 Rust 本身都支持交叉编译,消除了通常与旧编译语言相关的“build farms”的需要。

“ Golang 具有优化生产的优点,比如占用的内存很少,这支持它在大型项目中作为构建块的能力,以及与其他架构的交叉编译。由于 Go 代码被编译成单一的静态二进制文件,因此它允许简单的集装箱化/代码,并且,通过扩展,使得部署 Go 到任何高度可用的环境(如 Kubernetes)变得几乎无关紧要。”ー Dewet Diener,Curve

“当您查看基于云的基础设施时,通常会使用类似于 Docker 容器之类的东西来部署工作负载。使用在 Go 中构建的静态二进制文件,你可以得到一个10、11、12兆字节的 Docker 文件,而不是引入整个 Node.js 生态系统,或者 Python,或者 Java,在那里你可以得到数百兆字节大小的 Docker 文件。因此,这么小的二进制是令人惊异的。”ー Brian Ketelsen,微软

“有了 Rust,我们将拥有一个高性能和便携的平台,可以轻松地在 Mac、 iOS、 Linux、 Android 和 Windows 上运行。”ー Matt Ronge,Astropad

Go 和 Rus差异

1. 性能

Go 具有出色的性能开箱即用。根据设计,没有knobs 或levers,你可以用来榨取更多的性能使用Go。Rust 的设计目的是让您能够从代码中榨取最后一滴性能; 在这方面,您真的找不到比 Rust 更快的语言了。然而,Rust 性能的提高是以额外的复杂性为代价的。

“值得注意的是,在Rust 版本编写时,我们只对优化进行了非常基本的思考。即使只是基本的优化,Rust 能够超过Go调整去版本。这是一个巨大的证明,与Rust 相比,它是多么容易编写有效的程序。”ー Jesse Howarth,Discord。

“ Dropbox 的工程师经常看到,通过逐行移植 Python 代码到 Go 中,性能和延迟提高了5倍,而且内存使用量与 Python 相比往往大幅下降,因为没有 GIL,进程计数可能会减少。然而,当我们的内存受到限制时,比如在桌面客户端软件或某些服务器进程中,我们就会转向 Rust,因为 Rust 中的手动内存管理要比 Go GC 有效得多。”ー Daniel Reiter Horn,Dropbox

2. 适应性/互动性

Go的快速迭代优势使得开发人员能够快速尝试各种想法,并且专注于解决手头任务的工作代码。通常,这已经足够了,可以让开发人员转移到其他任务上。另一方面,Rust 与 Go 相比编译时间更长,导致迭代时间更慢。这使得开发人员可以在更快的周转时间允许开发人员适应不断变化的需求的情况下更好地工作,而 Rust 在可以花费更多时间进行更加精细和高效的实现的情况下更好。

“ Go 类型系统的妙处在于调用方可以定义接口,允许库返回可扩展的结构,但需要窄接口。Rust type 系统的天才之处在于将 match 语法与 Result < > 结合起来,在这里您可以静态地确定所有可能发生的情况都得到了处理,而且永远不必创建空值来满足未使用的返回参数。”ー Daniel Reiter Horn,Dropbox

“(i)如果你的用例更接近客户,它更容易受到需求变化的影响,那么Go就会好很多,因为连续重构的成本要低得多。而是你能以多快的速度表达新的需求并进行试用。”ー Peter Bourgon,Fastly

3. 易学性

简单地说,没有比Go更容易学习的语言了。有很多团队的案例,他们能够采用Go,并在几周内将Go服务/应用程序投入生产。此外,Go 在语言中是相对独特的,因为它的语言设计和实践在其10多年的生命周期中是相当一致的。因此,在Go学习上投入的时间在很长一段时间内都保持着它的价值。相比之下,由于其复杂性,Rust 被认为是一门难学的语言。它通常需要几个月的学习Rust从而掌握,但随着这种额外的复杂性可以精确控制和提高性能。

“当时,没有一个团队成员知道Go,但在一个月内,每个人都在Go上写东西”——Jaime Garcia, Capital One

“Go不同于其他编程语言的原因在于认知负荷。你可以用更少的代码做更多的事情,这使你更容易推理和理解你最终要写的代码。大多数 Go 代码最终看起来都非常相似,因此,即使您使用的是一个全新的代码库,您也可以很快地启动并运行。”ー美国运通公司忠诚度平台的 Glen Balliet 工程总监使用 Go for Payments & Rewards

“然而,与其他编程语言不同的是,Go 的创建是为了最大限度地提高用户效率。因此,具有 Java 或 PHP 背景的开发人员和工程师可以在几周内熟练掌握使用 Go 的技能,并接受相关培训ーー以我们的经验来看,他们中的许多人最终更喜欢 Go。”ー Dewet Diener,Curve

4. 精确控制

也许 Rust 最大的优势之一就是开发人员可以控制内存的管理方式,如何使用机器的可用资源,如何优化代码,以及如何制定问题解决方案。与Go相比,这并非没有巨大的复杂性成本,Go的设计较少针对这种类型的精确手工操作,更多的是为了更快的探索时间和更快的周转时间。

“随着我们对 Rust 的经验的增长,它在另外两个方面也显示出了优势: 作为一种具有很强记忆安全性的语言,它是在边缘处理的一个很好的选择; 作为一种具有极大热情的语言,它成为了一种流行的从头开始的组件。”ー John Graham-Cumming,Cloudflare

总结

Go 的简单性、性能和开发人员的生产力使它成为创建面向用户的应用程序和服务的理想语言。 快速迭代允许团队快速转向以满足用户不断变化的需求,为团队提供了一种将精力集中在灵活性上的方法。

Rust 的精细控制允许更高的精度,这使得 Rust 成为底层操作的理想语言,这些操作可能不会发生大的改变,并且可以从Go性能的稍微改进中获益,尤其是在大规模部署的情况下。

虽然 Go 和 Rust 的设计有很大的不同,但它们的设计具有一系列兼容的优点,而且当它们一起使用时,灵活性和性能都很好。

建议

对于大多数公司和用户来说,Go是正确的默认选项。它的性能强大,易于采用,而且 Go 的高度模块化特性使其特别适用于需求不断变化或发展的情况。

随着产品的成熟和需求的稳定,可能会有机会从性能的边际增长中获得巨大的收益。在这些情况下,使用 Rust 来最大化性能可能是值得的初始投资。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

西京刀客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值