【转自 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 之间的基本区别,以及何时使用这两种新兴且重要的编程语言中的哪一种。

  1. Rust 与 Go:简要比较和主要差异

  2. 什么时候应该使用 Rust?

  3. 什么时候应该使用 Go?

Rust 与 Go:简要比较和主要差异

让我们在性能、并发性、速度等方面比较 Rust 和 Go,以了解这些编程语言的要点。但首先,让我们以表格的形式简要地看一下这两者之间的比较:

语言 Go Rust
发布时间 2009 2010
开发组织 Google Mozilla
关键工作负载 Web 应用程序、API、网络、DevOps、CLI 应用程序、云应用程序、数据处理 物联网(物联网、云应用、安全敏感应用、处理引擎、系统组件
用语言编写的软件 language Docker, Kubernetes, Ethereum, Hugo, Caddy, Github CLI, Drone, Terraform, Syncthing Ripgrep, Firefox, Habitat, Deno, alagritty

主要的主要区别是:

  1. 性能
  2. 并发
  3. 内存安全
  4. 开发速度
  5. 开发经验

#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:

  1. 性能是您的首要任务
  2. 您更喜欢内存安全而不是简单
  3. 您更喜欢对线程进行细粒度控制
  4. 您更喜欢运行时的正确性
  5. 您更喜欢硬件级代码

什么时候应该使用 Go?

Go 是 Node.js 创建 Web API 的最佳替代品,它适用于广泛的用例。Go 提供了 goroutines,它的并发模型非常适合用于处理多个独立请求的服务器端应用程序。

Go 还提供对HTTP(超文本标记语言)网络协议的内置支持。它允许开发人员快速轻松地开发一个小型 API 并将其作为微服务运行。因此,Go 非常适合微服务架构,可以轻松满足 API 开发人员的需求。

因此,如果您更喜欢语法简单性而不是性能和价值开发速度,那么 Go 是您的选择。

因此,您应该在以下情况下选择和使用 Go:

  1. 你更关心代码的可靠性和简单性
  2. 您想要高级别的执行速度
  3. 您更喜欢简单的语法和直接的代码来快速编写代码
  4. 您希望使用更灵活的语言来支持大型 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 - 何时使用它们?的更多相关文章

  1. c、rust、golang、swift性能比较

    mac 计算速度视觉判断是(由好到差):c > rust > swift > golang 内存开销在mac上是(由好到差):c > rust > golang > ...

  2. Rust语言

    Rust语言 https://doc.rust-lang.org/stable/book/ http://www.phperz.com/article/15/0717/141560.html Rust ...

  3. vlang module 使用

    vlang 支持module,概念以及使用类似rust 以及golang 的gopath(从当前的文档以及使用来说),但是还不完整 以及是够用,但是有问题 v module 试用 项目结构   ├── ...

  4. vlang 试用

    vlang 是最近出来的一门编程语言,集成了rust,golang, 等语言的特性,轻量.简洁.编译 快速,详细的比价参数可以参考官方文档 安装 目前尽管官方提供了linux以及mac 的二进制文件, ...

  5. 如何在国产龙芯架构平台上运行c/c++、java、nodejs等编程语言

    高能预警:本文内容过于硬核,涉及编译器原理.cpu指令集.机器码.编程语言原理.跨平台原理等计算机专业基础知识,建议具有c.c++.java.nodejs等多种编程语言开发能力,且实战经验丰富的资深开 ...

  6. 【GoLang】转载:我为什么放弃Go语言,哈哈

    我为什么放弃Go语言 作者:庄晓立(Liigo) 日期:2014年3月 原创链接:http://blog.csdn.NET/liigo/article/details/23699459 转载请注明出处 ...

  7. Golang哲学思想

    Golang是一门新语言,经过几年发展,慢慢地也已经被许多大公司认可.最大的特点是速度快,并发性好,与网络的功能结合好,是一门服务端语言,号称“网络时代的新语言”:另外还是一个编译型的Python.不 ...

  8. Golang全接触

    满打满算, 从好友推荐Golang至发文时, 使用Golang已经有1年多了. 这种时间对于C/C++ Java这些老者来说, 简直是菜鸟级别的经验 但作为新生代语言的特点就是实战. Golang这一 ...

  9. 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时,突发奇想,想把最近主流的编程语言性能作个简单的比较, 至于怎么比,还是不 ...

随机推荐

  1. 启动kafaka失败了,提示zk保存kafka的ids已经在使用。

    FATAL [Kafka Server 1], Fatal error during KafkaServer startup. Prepare to shutdown (kafka.server.Ka ...

  2. 为何不选择lunix AIO

    对于块设备而言,linux可以使用同步IO.POSIX IO.linux AIO.io-uring,前俩者是linux的同步IO接口,后者是linux内核提供的异步io接口,linux AIO只支持直 ...

  3. 拉仇恨!webhook + 企业微信给同事做了个代码提交监听工具

    本文案例收录在 https://github.com/chengxy-nds/Springboot-Notebook 大家好,我是小富~ 最近接个任务,用webhook做了个代码提交监听功能,就是有人 ...

  4. GO学习-(18) Go语言基础之并发

    Go语言基础之并发 并发是编程里面一个非常重要的概念,Go语言在语言层面天生支持并发,这也是Go语言流行的一个很重要的原因. Go语言中的并发编程 并发与并行 并发:同一时间段内执行多个任务(你在用微 ...

  5. 并发编程-Condition

    Condition 一个Lock中应该绑定一个Condition对象.Condition是Java提供用来实现等待/通知的类. 我们知道Object对象提供了wait.waitAll.notify.n ...

  6. TensorRT 数据和表格示例

    TensorRT 数据和表格示例 TensorRT 7.1在绑定索引方面比其前身更加严格.以前,允许错误配置文件的绑定索引.考虑一个网络,该网络具有四个输入,一个输出,以及在其中的三个优化配置文件 I ...

  7. CUDA 9中张量核(Tensor Cores)编程

    CUDA 9中张量核(Tensor Cores)编程 Programming Tensor Cores in CUDA 9 一.概述 新的Volta GPU架构的一个重要特点是它的Tensor核,使T ...

  8. 深度学习Dropout技术分析

    深度学习Dropout技术分析 什么是Dropout? dropout是指在深度学习网络的训练过程中,对于神经网络单元,按照一定的概率将其暂时从网络中丢弃.注意是暂时,对于随机梯度下降来说,由于是随机 ...

  9. 所有处理都走向AI

    所有处理都走向AI All Processing Bends Toward AI 旧金山--谷歌正在试验机器学习(ML)来执行集成电路设计中的位置和路径,并取得了很好的效果.上周在ISSCC会议上宣布 ...

  10. TinyML设备设计的Arm内核

    TinyML设备设计的Arm内核 Arm cores designed for TinyML devices Arm推出了两个新的IP核,旨在为终端设备.物联网设备和其低功耗.成本敏感的应用程序提供机 ...