【转自 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. 第七章 DevOps工具链

    DevOps工具生态圈 协同开发工具 敏捷开发 可视化 加强团队沟通协作 数据分析 协同开发 持续集成工具 Jenkins 自动化编译 自动化测试 自动化部署 丰富的插件库 版本管理工具 Git 简介 ...

  2. LINUX创建文件和目录的默认权限

    在linux中,一位用户在创建文件和目录时,对其具有的权限都是一样的,如需更改,需要chmod命令做相应的更改.为什么?其实是权限掩码起作用了. 权限掩码的作用就是规范初创文件和目录时候的权限设置,免 ...

  3. Java反射机制详情

    1.运行环境 JDK8+lntellij IDEA 2018.3 2.反射机制是什么 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个 ...

  4. gitlab使用URL导入远程仓库报错

    gitlab使用URL导入远程仓库报错Import url is blocked: Only allowed ports are 80,443, and any over 1024 报错内容为Impo ...

  5. 【pytest】使用parametrize将参数化变量传递到fixture

    分享一个关于在pytest中,如何将测试用例文件中的变量传递到fixture函数. 一.交代应用场景 目前组内的项目,在根目录下是有一个conftest.py文件的,这里有个生成api token的f ...

  6. 你是不是对MD5算法有误解?

    大家常听到"MD5加密"."对称加密"."非对称加密",那么MD5属于哪种加密算法? 面试问这样的问题,准是在给你挖坑. "MD5 ...

  7. MySQL 基础、安装、配置

    1. MySQL 基础 1.1 什么是数据库? 1.2 数据库的类型 1.3 关系型数据库的优点 1.4 MySQL 简介 1.5 MySQL 数据类型 1.6 Mysql 存储引擎 1.7 MySQ ...

  8. TensorFlow损失函数

    TensorFlow损失函数 正如前面所讨论的,在回归中定义了损失函数或目标函数,其目的是找到使损失最小化的系数.本文将介绍如何在 TensorFlow 中定义损失函数,并根据问题选择合适的损失函数. ...

  9. 孟老板 ListAdapter封装, 告别Adapter代码 (上)

    BaseAdapter封装(一) 简单封装 BaseAdapter封装(二) Header,footer BaseAdapter封装(三) 空数据占位图 BaseAdapter封装(四) PageHe ...

  10. JVM-gcRoots 和 强引用,软引用, 弱引用, 虚引用, 代码演示和应用场景

    什么是垃圾? 什么是gcRoots, 谈谈你对 强, 软, 弱 , 虚引用的理解, 他们的应用场景 jvm采用可达性分析法: 从gcRoots集合开始,自上向下遍历,凡是在引用链上的对象,都不是垃圾, ...