rust golang_Rust vs. Go:如何选择


比较Rust和Go并不是关于哪种语言“客观上更好”,而是关于哪种语言最适合给定的编程任务。考虑到这一点,让我们看一下Rust和Go不同的主要方式,以及每种最适合的工作类型。

Rust vs. Go:性能

上锈的主要优点列表,表演权,在符合安全和轻松雄居榜首,并可能 成为 头号项目。 由于Rust对内存处理和处理的零成本运行时抽象,Rust程序被设计为以C和C ++或接近C和C ++的速度运行。

总是可以编写一个缓慢的Rust程序,但是至少可以确保Rust不会为了安全或方便而抢先牺牲性能。 什么 生锈成本是开发商的部分努力学习和掌握语言的抽象的内存管理。 (有关内存管理的更多信息,请参见下文。)

相比之下,Go确实为了开发人员的方便而牺牲了一些运行时速度。 内存管理由Go运行时处理(同样,在下面更多内容),因此不可避免地存在与运行时相关的开销。 但是在许多情况下,这种折衷可以忽略不计。 默认情况下,Go比其他便利语言(例如Python)快许多倍。

简而言之,Rust总体 速度更快,但是对于大多数工作日使用案例,Rust和Go之间的速度差异将是微不足道的。 在绝对需要性能的情况下,Rust可以以Go不能做到的方式脱颖而出。

Rust vs. Go:内存管理

Rust和Go中的内存管理与两种语言的性能行为都密切相关。

Rust通过零成本抽象将编译时所有权策略用于内存管理。 这意味着在Rust程序上线之前可以解决绝大多数内存管理问题。 如果Rust程序不是内存安全的,则它不会编译。 考虑到我们的世界是建立在通常由于不良的内存管理而被认为不安全的软件之上的,Rust方法已经过时了。

如上所述,这种安全性是以Rust更具挑战性的学习曲线为代价的:程序员必须知道如何正确使用Rust的内存管理习惯用法,这需要时间和实践。 来自C,C ++,C#或Java世界的开发人员必须重新考虑当他们坐在Rust时如何编写代码。

与Rust一样,Go也是内存安全的,但这是因为内存管理是在运行时自动处理的。 程序员可以编写数千行Go代码,而无需再考虑分配或释放内存。 程序员在运行时确实可以控制垃圾收集器。 您可以手动更改垃圾收集阈值或触发垃圾收集,以防止垃圾收集周期干扰操作。

程序员还可以在Go中执行 一些 手动的内存管理,但是该语言故意将其堆叠起来。 例如,可以使用指针访问变量,但是除非使用unsafe软件包,否则就不能执行指针算术来访问内存的任意区域,这对于在生产环境中运行的软件来说是不明智的选择。

如果手头的编程任务需要您手动分配和释放内存(例如,针对低级硬件或最佳性能的情况),Rust旨在满足这些需求。 但是,不要以为Go的自动内存管理会使它失去为您的任务创建强大的软件的资格。

Rust vs. Go:开发速度

有时,开发速度比程序速度更重要。 Python的职业不是运行速度最快的语言,而是 编写 软件的最快语言之一。Go具有相同的吸引力。 它的直接性和简单性可以加快开发过程。 编译时间短,并且Go运行时比Python(以及其他解释性的,对开发人员友好的语言)快几个数量级。

简而言之,Go提供了简单性和速度。 那还缺少什么呢? 其他语言(例如通用语言)中的某些功能已被省略,以使该语言更易于学习,更易于掌握和维护。 不利的一面是,没有大量的样板就无法完成某些编程任务。

与Go相比,Rust具有更多的语言功能,而且学习和掌握所需的时间更长。 Rust的编译时间也往往比同等的Go程序更长,特别是对于具有大依赖树的应用程序。 即使在Rust项目共同努力以缩短编译时间之后,情况依然如此。

如果快速的开发周期和快速吸引人们参与项目的需求是当务之急,那么Go是更好的选择。 如果您不太关心开发速度,而更关心内存安全性和执行速度,请选择Rust。

Rust vs. Go:并发和并行

现代硬件是多核的,现代应用程序是联网和分布式的。 不能为这些现实计划的语言已经落后了。 程序员需要能够独立运行任务(无论是在单个线程上还是在多个线程上),并且能够在任务之间共享状态,而不会冒数据损坏的风险。 Rust和Go都提供了实现此目的的方法。

并发从一开始就通过goroutines(轻量级线程)和channel(goroutines的通信机制)融入了Go语言的语法中。 这些原语使编写应用程序(例如网络服务)变得很容易,这些应用程序必须同时处理许多任务,而不会冒竞争条件之类的常见问题。 Go不会使竞争条件变为 不可能 ,但是Go提供了本机测试机制来警告程序员是否可能在运行时发生竞争条件。

Rust仅在最近才async/ .await关键字的形式获得了本机并发语法。 在async / .await之前,并发是通过用于Rust的板条箱或程序包(称为futures 。 尽管Rust的并发性缺乏Go并发性背后的多年开发人员经验,但它继承了Rust的内存安全性优势-也就是说,可能暴露竞争条件的Rust代码根本无法编译。 由于Rust的语法规则,并发或异步操作将很难在Rust中编写,但从长远来看,它将是持久的。

Rust vs. Go:与遗留代码的互操作性

诸如Rust和Go之类的新语言旨在通过早期语言无法理解的方式来确保内存安全和程序员便利。 但是,新事物总是必须与旧事物在某种程度上共存。 为此,Rust和Go都可以与旧版C代码互操作,尽管在每种情况下都有不同的限制。

Rust可以通过extern关键字和libc “ crate”(包的Rust名称)直接与C库对话,但是对此类库的所有调用都必须标记为不安全。 换句话说,Rust无法保证其内存或线程安全。 您需要手动确保C代码接口是安全的 。 另一方面,根本不支持调用C ++代码(至少现在还不支持),除非该代码具有与C兼容的接口。 可以在Rust FFI Omnibus网站上找到许多有关如何使用Rust的FFI(外来功能接口)包装代码(针对C和其他语言)的示例。

围棋提供了cgo包与C.工作的cgo包可以让你调用到C库,使用C头文件在你的Go代码,并转换成C和围棋(例如,字符串)之间的通用数据类型。 但是,由于Go是内存管理的并且是垃圾回收的,因此必须确保正确处理传递给C的所有指针

简而言之,Rust在C互操作方面比Go稍微友好一些,因此任何对现有C有重大依赖性的事情都可能使Rust的规模扩大。 但是,在Rust和Go中,与C的互操作性都会给开发人员带来一定的成本:概念上的开销更多,编译时间更慢,工具更复杂,调试更困难。

请注意,Rust和Go始终可以与更高级别的其他代码进行交互(例如,通过网络套接字或命名管道交换数据,而不是通过函数调用),但是这些替代方法要以牺牲速度为代价。

Rust vs. Go:总结

在软件开发项目的Rust和Go之间进行选择主要是关于选择具有该项目最需要的素质的语言。 对于Rust and Go,您可以将这些品质总结如下。

防锈优点:

  • 运行时正确(常见错误根本无法编译)
  • 顶级执行速度
  • 内存安全,无垃圾收集
  • 硬件级代码

优势:

  • 快速的开发周期
  • 高层执行速度
  • 通过垃圾收集实现内存安全
  • 开发者便利
  • 简明代码

rust golang_Rust vs. Go:如何选择介绍到这里,更多go学习请参考编程字典go教程 和问答部分,谢谢大家对编程字典的支持。


原文链接:https://blog.csdn.net/cxu0262/article/details/107260714?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163599231616780274182818%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=163599231616780274182818&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_v2~rank_v29-13-107260714.pc_v2_rank_blog_default&utm_term=go&spm=1018.2226.3001.4450