Rust 与 Golang - 何时使用它们?
【转自 Fizer Khan的《Rust Vs Golang - When to use them?》(翻译)】
在过去的十年中,Rust 和 Go 两种新的编程语言主要为企业开发而开发和出现。Go 于 2009 年由世界知名的 Google 创建,其次是 Rust,后者于 2010 年由 Mozilla 创建。
尽管这两种编程语言可能看起来很相似,因为它们提供了诸如内存安全、开源开发模型等关键特性,但它们之间却有很大的不同。
Go主要设计用于构建 Web API(应用程序编程接口)和易于扩展的小型服务,特别是具有 goroutines 的强大功能。
相比之下,Rust主要设计用于处理 CPU 密集型操作,例如执行算法和大量数据。因此,消耗和需要高性能的项目通常使用 Rust over Go。
本文将讨论 Rust 和 Go 之间的基本区别,以及何时使用这两种新兴且重要的编程语言中的哪一种。
Rust 与 Go:简要比较和主要差异
什么时候应该使用 Rust?
什么时候应该使用 Go?
Rust 与 Go:简要比较和主要差异
让我们在性能、并发性、速度等方面比较 Rust 和 Go,以了解这些编程语言的要点。但首先,让我们以表格的形式简要地看一下这两者之间的比较:
语言 | Go | Rust |
---|---|---|
发布时间 | 2009 | 2010 |
开发组织 | Mozilla | |
关键工作负载 | Web 应用程序、API、网络、DevOps、CLI 应用程序、云应用程序、数据处理 | 物联网(物联网、云应用、安全敏感应用、处理引擎、系统组件 |
用语言编写的软件 | language Docker, Kubernetes, Ethereum, Hugo, Caddy, Github CLI, Drone, Terraform, Syncthing | Ripgrep, Firefox, Habitat, Deno, alagritty |
主要的主要区别是:
- 性能
- 并发
- 内存安全
- 开发速度
- 开发经验
#1 性能
Google 引入 Go 作为 C++ 语言的替代品,后者更易于编码和学习。Go 提供并允许您轻松使用 goroutines(协程),通过它您可以通过简单地添加 go 语法将函数作为子进程运行。但是,尽管有这些可行的特性和多核 CPU 支持,Rust 还是胜过 Go。
Rust 高效地执行算法和资源密集型操作。根据benchmarks game(基准游戏),Rust 在测试算法时快了 30%;并且在二叉树计算的情况下至少快 1000%。对于内存处理和处理,Rust 使用零成本运行时抽象。
因此,在绝对需要性能的情况下或某些项目中,Rust 比 Go 更受欢迎。
#2 并发
Go 支持并发并在这方面压倒 Rust。Go 的并发模型使开发人员能够跨多个 CPU 内核部署工作负载,从而使 Go 成为一种高效的语言。
在您运行 Web 服务器处理 API 请求的情况下,Go 的goroutines允许您将每个请求作为子进程运行。这个过程极大地提高了效率,因为它将任务卸载到所有可用的 CPU 内核。
相比之下,为了支持并发,Rust 只有原生的 await/sync 语法。因此,虽然 Rust 保证了内存安全,但在并发方面,开发人员更喜欢 Go。
#3 内存安全
Go 和 Rust 都优先考虑内存安全。但是出于性能原因,Go 存在数据竞争的可能性。正如上一点所见,Rust 的主要关键点和优势是它提供了内存安全性。为了启用内存安全并发,Rust 采用了类型安全。Rust 严格的编译器会检查您引用的每个内存地址和您使用的每个变量。此功能会在出现任何未定义的行为时通知您,并最大限度地避免任何数据竞争条件。
它确保开发人员不会在数据竞争条件或缓冲区溢出的情况下运行。尽管内存安全是 Rust 的一个基本特性,但它也有其自身的缺点。在编写代码时,需要非常注意并注意内存分配。总是很难让您的内存安全得到保护。
#4 开发速度
在某些情况下,开发速度比程序速度或性能更重要。Go 的简单性和直接性使其成为一种具有快速开发过程的语言。Go 有更短的编译时间和更快的运行时间。现在,尽管 Go 提供了速度和简单性,但代价是缺少许多重要功能。为了使 Go 语言更容易,Google 省略了 Go 中其他编程语言中的许多功能。
另一方面,Rust 提供了比 Go 更多的功能。但是 Rust 的编译时间较长,尤其是对于那些依赖树较大的应用程序。
因此,如果一个项目的优先级是开发速度和快速开发周期,那么 Go 是一个更好的选择。但是,如果您不太关心开发速度而更关心执行速度和内存安全,那么 Rust 是您的首选。
#5 开发经验
由于 Go 的设计考虑了简单性和易用性,因此大多数开发人员经常发现它是一种“无聊的语言”或“直截了当的语言”。Go 有限的内置功能集使其易于学习和采用。它是 C++ 语言的一种更简单的替代方案,但在内存分配和内存安全等特性上有所妥协。
相比之下,Rust 提供了高内存安全特性,使代码更复杂,开发人员的工作效率更低。传递指针的能力和所有权的概念使 Rust 成为许多人不希望和没有吸引力的选择。
与 go 相比,Rust 有更陡峭的学习曲线。然而,同样重要的是要注意 Go 比其他语言(如 JavaScript 和 Python)具有更陡峭的学习曲线。
什么时候应该使用 Rust?
当性能很重要并且是重中之重时,Rust 是开发人员的绝佳选择,尤其是在处理和处理大量数据时。Rust 还对线程之间如何共享资源以及线程的行为方式进行了细粒度的控制。
但不利之处在于内存安全的额外复杂性;Rust 减慢了开发速度,导致学习曲线更加陡峭。重要的是要记住,这不一定是 Rust 的缺点,因为它还保证开发人员不会遇到任何内存安全错误,因为编译器会编译并检查每个数据指针。这种保证总是有益的,并且在复杂系统中派上用场。
因此,您应该在以下情况下选择和使用 Rust:
- 性能是您的首要任务
- 您更喜欢内存安全而不是简单
- 您更喜欢对线程进行细粒度控制
- 您更喜欢运行时的正确性
- 您更喜欢硬件级代码
什么时候应该使用 Go?
Go 是 Node.js 创建 Web API 的最佳替代品,它适用于广泛的用例。Go 提供了 goroutines,它的并发模型非常适合用于处理多个独立请求的服务器端应用程序。
Go 还提供对HTTP(超文本标记语言)网络协议的内置支持。它允许开发人员快速轻松地开发一个小型 API 并将其作为微服务运行。因此,Go 非常适合微服务架构,可以轻松满足 API 开发人员的需求。
因此,如果您更喜欢语法简单性而不是性能和价值开发速度,那么 Go 是您的选择。
因此,您应该在以下情况下选择和使用 Go:
- 你更关心代码的可靠性和简单性
- 您想要高级别的执行速度
- 您更喜欢简单的语法和直接的代码来快速编写代码
- 您希望使用更灵活的语言来支持大型 Web 开发
结论
您是否应该为您的项目单独选择 Rust 或 Go,完全取决于该项目的需求和要求。Rust 和 Go 有一些相似之处,比如两者都是开源的,旨在支持并行计算环境和微服务架构。这两种编程语言都通过并发过程优化了可用的 CPU 内核利用率。
您决定选择 Rust 还是 Go 取决于您希望构建的应用程序类型及其要求。如果您希望创建API和 Web 应用程序,则必须使用 Go 来利用其内置的并发功能,支持微服务架构。
Rust 还允许并帮助您设计 Web API,但这并不是创建这种编程语言的主要用例。Firefox 的 Rust 主要侧重于内存安全,这增加了其开发时间和代码复杂性,即使对于非常简单易用的 Web API 也是如此。但是,如果您的首要任务是对代码有更多的控制,那么 Rust 应该是您的选择。更好地控制您的代码还允许开发人员编写内存高效、优化程度高、精确且高性能的代码。
因此,当关于这两种编程语言中的哪一种比另一种更好的问题时,它仅取决于安全性与简单性的问题。虽然有些人喜欢 Go 的简单性,但有些人喜欢 Rust 的安全性。Go 和 Rust 这两者的设计有很大的不同,这就是为什么一些开发者利用它们二者的设计获得简便性,灵活性,安全性和性能,以及全部。
Rust 与 Golang - 何时使用它们?的更多相关文章
- c、rust、golang、swift性能比较
mac 计算速度视觉判断是(由好到差):c > rust > swift > golang 内存开销在mac上是(由好到差):c > rust > golang > ...
- Rust语言
Rust语言 https://doc.rust-lang.org/stable/book/ http://www.phperz.com/article/15/0717/141560.html Rust ...
- vlang module 使用
vlang 支持module,概念以及使用类似rust 以及golang 的gopath(从当前的文档以及使用来说),但是还不完整 以及是够用,但是有问题 v module 试用 项目结构 ├── ...
- vlang 试用
vlang 是最近出来的一门编程语言,集成了rust,golang, 等语言的特性,轻量.简洁.编译 快速,详细的比价参数可以参考官方文档 安装 目前尽管官方提供了linux以及mac 的二进制文件, ...
- 如何在国产龙芯架构平台上运行c/c++、java、nodejs等编程语言
高能预警:本文内容过于硬核,涉及编译器原理.cpu指令集.机器码.编程语言原理.跨平台原理等计算机专业基础知识,建议具有c.c++.java.nodejs等多种编程语言开发能力,且实战经验丰富的资深开 ...
- 【GoLang】转载:我为什么放弃Go语言,哈哈
我为什么放弃Go语言 作者:庄晓立(Liigo) 日期:2014年3月 原创链接:http://blog.csdn.NET/liigo/article/details/23699459 转载请注明出处 ...
- Golang哲学思想
Golang是一门新语言,经过几年发展,慢慢地也已经被许多大公司认可.最大的特点是速度快,并发性好,与网络的功能结合好,是一门服务端语言,号称“网络时代的新语言”:另外还是一个编译型的Python.不 ...
- Golang全接触
满打满算, 从好友推荐Golang至发文时, 使用Golang已经有1年多了. 这种时间对于C/C++ Java这些老者来说, 简直是菜鸟级别的经验 但作为新生代语言的特点就是实战. Golang这一 ...
- 2017年的golang、python、php、c++、c、java、Nodejs性能对比(golang python php c++ java Nodejs Performance)
2017年的golang.python.php.c++.c.java.Nodejs性能对比 本人在PHP/C++/Go/Py时,突发奇想,想把最近主流的编程语言性能作个简单的比较, 至于怎么比,还是不 ...
随机推荐
- SpringBoot + WebSocket 实现答题对战匹配机制
概要设计 类似竞技问答游戏:用户随机匹配一名对手,双方同时开始答题,直到双方都完成答题,对局结束.基本的逻辑就是这样,如果有其他需求,可以在其基础上进行扩展 明确了这一点,下面介绍开发思路.为每个用户 ...
- Google I/O 2021 Android精华内容
Google I/O 2021结束了, 都有什么精彩内容呢? Android部分的Playlist附上: Android & Play at Google I/O 2021 Developer ...
- 重新整理 .net core 实践篇————配置系统之盟约[五]
前言 在asp .net core 中我们会看到一个appsettings.json 文件,它就是我们在服务中的各种配置,是至关重要的一部门. 不管是官方自带的服务,还是我们自己编写的服务都是用它来实 ...
- CoSky-Mirror 就像一个镜子放在 Nacos、CoSky 中间,构建一个统一的服务发现平台
CoSky 基于 Redis 的服务治理平台(服务注册/发现 & 配置中心) Consul + Sky = CoSky CoSky 是一个轻量级.低成本的服务注册.服务发现. 配置服务 SDK ...
- 向pom.xml中配置Maven使用JDK8编译
maven项目会用maven-compiler-plugin默认的jdk版本来进行编译,如果不指明版本就容易出现版本不匹配的问题,可能导致编译不通过的问题. 解决办法:在pom文件中配置maven-c ...
- 学习Python中出现的错误集合(不定时更新)jupyter平台
出现的问题:1. 本图的错误,一个是line 7 init的两侧应该是是双下划线"__"导致所示错误 2. 本图的错误是 line 12 Student.student_tatal ...
- 201871030132-熊文婷 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告
项目 内容 课程班级博客链接 https://edu.cnblogs.com/campus/xbsf/2018CST 这个作业要求链接 https://www.cnblogs.com/nwnu-dai ...
- ADAS感知算法观察
ADAS感知算法观察 如果把一台ADAS车辆比作一个人的话,那么激光雷达.毫米波雷达.摄像头.IMU及GPS等等部件就相当于人的眼睛.鼻子.耳朵.触觉及第六感等器官或系统. 环境感知作为无人驾驶的第一 ...
- Caffe实现概述
Caffe实现概述 目录 一.caffe配置文件介绍 二.标准层的定义 三.网络微调技巧 四.Linux脚本使用及LMDB文件生成 五.带你设计一个Caffe网络,用于分类任务 一.caffe配置文件 ...
- MindSpore模型精度调优实践
MindSpore模型精度调优实践 引论:在模型的开发过程中,精度达不到预期常常让人头疼.为了帮助用户解决模型调试调优的问题,为MindSpore量身定做了可视化调试调优组件:MindInsight. ...