写点什么

2024 年的 Rust 与 Go,看完你悟了吗?

  • 2024-01-31
    福建
  • 本文字数:3111 字

    阅读完需:约 10 分钟

2024年的Rust与Go,看完你悟了吗?

Go 和 Rust 都旨在帮助你编写正确的程序,但方式不同:例如,Go 提供了出色的内置单元测试框架和丰富的标准库,而 Rust 则专注于利用其借用检查机制(borrow checker)消除运行时错误。

我可以说些什么而不让大家生气吗?

Rust 和 Go 哪个更好?你应该为下一个项目选择哪种语言,为什么?两者在性能、简单性、安全性、功能特性、规模化(scale)和并发性等方面如何比较?它们有什么共同点,又有什么根本区别?让我们通过 Rust 和 Go 的友好且公平的比较来找到答案。

1. Rust 和 Go 都很棒

首先,非常重要的是,Go 和 Rust 都是绝对优秀的编程语言。它们现代、强大、被广泛采用,并提供卓越的性能。

Rust 是一种低级静态类型多范式编程语言,专注于安全性和性能 -- Gints Dreimanis[2]

然而:

Go 是一种开源编程语言,可以轻松构建简单、可靠且高效的软件 -- golang.org[3]

在本文中,我将尝试简要概述我认为的哪种场景下 Go 是理想的选择,以及哪种场景下 Rust 可能是更好的选择。

2. 相似之处

两种语言的共同目标是什么?

2.1 内存安全

从历史来看,软件错误和安全漏洞的最大原因之一是不安全或不正确地访问内存。

Rust 和 Go 以不同的方式处理这个问题,但两者的目标都是比其他语言在管理内存方面更智能、更安全。

2.2 快速、紧凑的可执行文件

它们都是编译语言,这意味着你的程序将被直接编译为可执行的机器代码,以便你可以将程序部署为单个二进制文件。与 Python 或 Ruby 等解释语言相比,这也使得 Rust 和 Go 程序拥有极快的执行速度。

2.3 通用语言

Rust 和 Go 都是功能强大、可扩展的通用编程语言,你可以使用它们来开发各种现代软件。两者都拥有优秀的标准库和蓬勃发展的第三方生态系统,以及强大的商业支持和庞大的用户群。

2.4 务实的编程风格

虽然 Go 和 Rust 都具有与函数式和面向对象编程 (OOP) 相关的功能特性,但它们都是实用语言(pragmatic languages),旨在以最合适的方式解决问题。

2.5 适于规模化的开发

Rust 和 Go 都有一些有用的功能特性,使它们适合大规模编程,无论是大型团队,还是大型代码库,或两者兼而有之。

例如,Rust 和 Go 都使用标准代码格式化工具(Go 的 gofmt,Rust 的 rustfmt),这结束了关于括号放置位置的无用争论。

两者还具有优秀的内置高性能标准构建和依赖管理工具;不再需要与复杂的第三方构建系统搏斗,也不必每隔几年学习一个新系统。

3. 差异

虽然 Rust 和 Go 有很多共同点,但在某些领域,理性的人可能会更喜欢一种语言而不是另一种语言,以满足项目的特定需求。

3.1 性能

Go 和 Rust 都非常快。然而,Go 的设计更有利于快速编译,而 Rust 则是针对快速执行进行了优化。

Rust 的运行时性能也更加一致,因为它不使用垃圾回收机制。另一方面,Go 的垃圾回收器减轻了程序员的一些负担,使其更容易专注于解决主要问题,而不是内存管理的细节。

对于执行速度胜过所有其他考虑因素的领域(例如游戏编程、操作系统内核、Web 浏览器组件和实时控制系统),Rust 是更好的选择。

3.2 简单

从设计上来说,Go 是一种小型语言:它的语法、关键字和语言结构都非常少。你可以快速学习 Go 的基础知识并使用该语言提升工作效率。

这使得 Go 在时间跨度短的项目中或需要快速引入大量新程序员的团队中具有优势,尤其是在他们相对缺乏经验的情况下。

3.3 功能特性

另一方面,Rust 几乎拥有你能想象到的编程语言的所有功能特性,还有一些你可能无法想象的功能特性。这使得它成为一种强大且富有表现力的语言,可以通过多种不同的方式来完成同一件事。

如果你是从其他语言过渡到 Rust 的,你可能可以找到你习惯的大多数功能的 Rust 等效项。当大型项目需要从 C++或 Java 等传统语言迁移时,这给 Rust 带来了优势。

3.4 并发

与大多数语言不同,Go 语言的设计内置了对并发编程的支持,例如 goroutine(线程的轻量级版本)和通道(在并发任务之间通信数据的安全有效的方法)。

这些使得 Go 成为网络服务器和微服务等大规模并发应用程序的完美选择。

3.5 安全

Rust 经过精心设计,以确保程序员无法做一些他们不想做的不安全的事情,例如覆盖共享变量。编译器要求你明确在程序的不同部分之间共享数据的方式,并且可以检测许多常见的错误和 bug。

因此,所谓的“与借用检查器(borrow checker)战斗”是新 Rust 程序员的常见抱怨。用安全的 Rust 代码实现程序通常意味着从根本上重新思考其设计,这可能会令人沮丧,但当可靠性是你的首要任务时,这样做的好处是值得的。

3.6 规模化(scale)

Go 旨在让你轻松扩展项目和开发团队。它的极简设计带来了一定的一致性,并且明确定义的标准风格的存在意味着任何 Go 程序员都可以相对快速地阅读和理解新的代码库。

当谈到大型软件开发时,清晰胜于聪明。对于大型组织,尤其是许多分布式团队来说,Go 是一个不错的选择。其快速构建时间也有利于快速测试和部署。

4. 权衡取舍

Rust 和 Go 的设计团队做出了一些截然不同的选择,所以让我们看看这些权衡取舍使这两种语言彼此截然不同的一些领域。

4.1 垃圾回收

一般来说,具有垃圾回收和自动内存管理功能的语言(如 Go)可以快速轻松地开发可靠、高效的程序,对于某些人来说这是最重要的。

但是垃圾回收由于其性能开销和停止世界(Stop-The-World)的暂停,可能会使程序在运行时的行为变得不可预测,有些人发现这种不一致是不可接受的。

程序员必须明确负责分配和释放每个字节内存的语言(例如 Rust)更适合实时或超高性能应用程序。

4.2 抽象

计算机编程的历史是一个日益复杂的抽象的故事,它让程序员可以解决问题,而不必过多担心底层机器的实际工作方式。

这使得程序更容易编写并且可能更可移植。但对于许多程序来说,访问硬件以及精确控制程序的执行方式更为重要。

Rust 的目标是让程序员“更接近金属”,拥有更多的控制权,而 Go 抽象了架构细节,让程序员更接近问题。

4.3 速度

Rust 进行了许多设计权衡,以实现最佳的执行速度。相比之下,Go 更关心简单性,并且愿意为此牺牲一些(运行时)性能。

在这一点上你是喜欢 Rust 还是 Go 取决于你是愿意花更多的时间等待程序构建,还是等待程序运行。

4.4 正确性

Go 和 Rust 都旨在帮助你编写正确的程序,但方式不同:例如,Go 提供了出色的内置单元测试框架和丰富的标准库,而 Rust 则专注于利用其借用检查机制(borrow checker)消除运行时错误。

公平地说,用 Go 编写给定的程序更容易,但结果可能比 Rust 版本更容易包含错误。Rust 对程序员施加了纪律约束,但 Go 让程序员选择他们想要对特定项目采取的纪律程度。

5. 结论

我希望这篇文章能让你相信 Rust 和 Go 都值得你认真考虑。你应该拒绝这种错误的困境:你只能学习其中之一。事实上,你了解的语言越多,你作为软件开发人员的价值就越高。

你学习的每一种新语言都会给你思考问题的新方法,这只能是一件好事。任何软件项目的质量和成功最重要的因素不是语言的选择,而是程序员的技能。

当使用最适合你的语言时,你变得最熟练,并且你也能享受到最多的编程带给你的乐趣。因此,如果问题是“我应该学习 Rust 或 Go 吗?”,唯一正确的答案是“是的”。

技术前沿拓展

前端开发,你的认知不能仅局限于技术内,需要发散思维了解技术圈的前沿知识。细心的人会发现,开发内部工具的过程中,大量的页面、场景、组件等在不断重复,这种重复造轮子的工作,浪费工程师的大量时间。

介绍一款程序员都应该知道的软件JNPF快速开发平台,很多人都尝试用过它,它是功能的集大成者,任何信息化系统都可以基于它开发出来。

这是一个基于 Java Boot/.Net Core 构建的简单、跨平台快速开发框架。前后端封装了上千个常用类,方便扩展;集成了代码生成器,支持前后端业务代码生成,实现快速开发,提升工作效率;框架集成了表单、报表、图表、大屏等各种常用的 Demo 方便直接使用;后端框架支持 Vue2、Vue3。如果你有闲暇时间,可以做个知识拓展。

看完本文如果觉得有用,记得点个赞支持,收藏起来说不定哪天就用上啦~

用户头像

还未添加个人签名 2023-06-19 加入

还未添加个人简介

评论

发布
暂无评论
2024年的Rust与Go,看完你悟了吗?_伤感汤姆布利柏_InfoQ写作社区