Rust vs Go摘要

0 评论
/ /
1088 阅读
/
8252 字
31 2019-07

安娜于2019年4月3日

Rust vs. Go?今天哪种语言提供简单和强大的神奇组合? Rust和Go似乎都是系统编程语言,它们都编译为机器代码,并且都提供了出色的性能。那么,您如何确定哪种语言最适合您的需求?

Rust

Rust在2010年上市,尽管它可能早在很早就开始构思。 Rust通常被视为ML系列语言的扩展。 Mozilla是Rust的原始承销商,而Servo浏览器引擎(由Mozilla赞助)是使用Rust构建的。利用Rust的并发性和所有权优势的Servo项目的一些目标是:(i)改进的并行性(ii)更好的安全性(iii)增加模块性(iv)卓越的性能。

Rust 1.0于2015年5月上映.Rust 1.33.0在2019年2月出现。最新版本中最大的两个功能是“对const fns的重大改进,以及新概念的稳定化:钉扎”。

Rust提供强大的社区支持。社区项目的一些例子包括redox,一个用Rust编写的操作系统; cgmath,一个线性代数和计算机图形库;和Iron,一个并发的Web框架。

为什么选择Rust?

  • 良好的运行速度(与C / C ++相当) - 在测试中,它的性能优于Go(在某些情况下,速度提高了一个数量级)
  • 减少运行时间开销,减少垃圾收集暂停
  • 适用于并发性,安全性和/或性能至关重要的任务
  • 代码的复杂性,可实现细粒度的系统控制,例如:
    • 丰富的模式:切片和范围模式
    • 新颖的嵌入:postgres和python扩展,加密库,生锈内核
    • 丰富的语法扩展:编译时正则表达式,SQL语句,docopt
    • 移动语义的新结果:静态冻结/解冻,消耗其容器的迭代器
    • 它被称为“开发人员最喜爱的语言”,73%的开发人员表示他们希望继续使用它
    • 可与C,FFI和其他语言互操作
    • 零成本抽象
    • 大型支持社区
    • 以特征的形式支持泛型
    • Go本身支持线程之间的通道和强大的编译时线程安全检查机制(意味着无论使用哪种数据共享机制,都不存在并发错误的风险)
    • 使用Cargo进行简单的包管理,可以轻松访问一系列有用的库,并为每个项目提供内置版本控制和完全分离
    • 安全 -  Rust在这个领域提供各种保证,包括:

不会容忍不安全的内存访问

  • 可预测的运行时行为(没有垃圾收集器,没有成本抽象)
  • 针对低级威胁(如空指针和竞争条件)的安全性
  • 几乎完全控制硬件,包括内存布局和处理器功能
  • Rust节省了测试,调试和崩溃的时间

为什么不?

Rust比Go更陡峭的学习曲线

  • Rust并不简单,需要大量投入大量的时间来学习和掌握它,然后大多数人才能有效地处理它;工程师马蒂亚斯·恩德(Matthias Ender)将鲁斯特描述为“艰难”,这使他“花了好几个月”才变得“有点富有成效”
  • 在学习新概念之前,可能不得不学习旧习惯
  • Go提供了更直接的面向actor的并发性,而在Rust中,这需要程序员来处理
  • Rust因编译速度慢而闻名
  • 标准库中缺少一些异步网络功能
  • 在类似的情况下,Rust可能比C和C ++略慢

可用文档

https://doc.rust-lang.org/book/second-edition/

Golang(Go)

       Golang(Go)于2007年在谷歌构思,作为公司在开发软件基础架构时遇到的一些问题的反击。诸如网络系统,网络编程模型和大规模计算集群引入的问题正在通过解决方法处理,而不是直接解决。服务器程序需要数百或数千个程序员才能包含数千万行代码,因此规模问题也发生了巨大变化。建设时间也在不断增加。

       根据Google的Rob Pike的说法,Go的设计和开发是为了让在这种环境中工作更有成效。除了内置并发和垃圾收集等众所周知的方面外,Go的设计考虑因素还包括严格的依赖关系管理,软件架构随系统增长的适应性以及跨组件边界的稳健性“。

       它于2009年11月上市,并继续成为一个开源项目。事实上,谷歌进口公共存储库而不是相反。有影响力的前辈包括Hoare的CSP,Alef和Pike的Newsqueak。它在2012年达到了1.0的状态。去2019年2月发布了1.12。最新功能的亮点包括“选择支持TLS 1.3,改进模块支持(准备成为Go 1.13的默认设置),支持windows / arm ,以及改进的macOS和iOS向前兼容性。“

Go已在全球数千个系统中使用;其中一个最大的成功案例是Docker是使用Go构建的。

为什么选择Go?

速度 - 它是一种快速,静态类型的语言,可以快速编译为机器代码

虽然并不总是以比Rust更快的速度进行测试,但Go比许多其他语言(如Java,C#,JavaScript,Python)更快

简单的代码

Go简洁,务实,高效

  • Go的明确重点是帮助简化编码。在其文档中,它被描述为“使程序员更高效的开源项目”
  • 解决问题的方法侧重于整个软件开发周期中的程序员生产力
  • 灵活性 -  Go独特的类型系统允许灵活和模块化的程序构建
  • 并发 -  Go专注于并发作为一流的概念
  • 简单安全 - 不会容忍不安全的内存访问
  • 擅长编写微服务和简单​​的“DevOps”任务
  • 包含电池的标准库
  • 与C和其他语言的一些互操作性
  • 传言的目标是取代C和C ++
  • IDE支持
  • 简单的错误处理

为什么不?

  • Go不是一种系统编程语言
  • 去牺牲一些表现元素,专注于简约和正交的目标
  • Go允许通过cgo实现一些互操作性,但是,这不是Go程序编写的预期方式
  • Go缺乏泛型
  • 除少数本地类型外,它缺乏不变性
  • 它是垃圾收集,会损害性能并使编译时错误检查功能不那么强大
  • 有人说Go客观上是一种“坏语言”,Sylvain Wallez,软件架构师和开发人员说,虽然Go允许“出色的性能和减少的内存/ CPU /磁盘占用空间”,但它的设计似乎“发生在并行的宇宙中” (或他们的Plan9实验室?)在90年代和2000年的编译器和编程语言设计中发生的大部分事情从未发生过“。

可用文档

https://golang.org/doc/

Rust vs. Go案例研究 - 试验部门

让我们看一下Rust vs. Go的一个案例研究,其中有一个简单的问题:使用试验部门检查数字是否为素数。 用于确定素数的试验除法涉及将数字除以任何较小的自然数以查看是否没有余数。 如果没有找到,则为素数。

这是你在Golang中的表现:

func IsPrime(n int) bool {
   if n < 0 {
       n = –n
   }
   switch {
   case n < 2:
       return false
   default:
       for i := 2; i < n; i++ {
           if n%i == 0 {
               return false
           }
       }
   }
   return true
}
This is how you do the same thing in Rust:
pub fn is_prime(n: u64) -> bool {
   match n {
       0…1 => false,
       _ => {
           for d in 2..n {
               if n % d == 0 {
                   return false;
               }
           }
           true
       }
   }
}

解决方案在很多方面类似,但有一些关键的区别,即:

Go中使用了一个简单的switch-case语句; 在Rust中,使用匹配语句,这显然更强大

一个简单的for循环用于迭代Go中的数字2到n; 在Rust中,使用范围表达式(2..n)

Go使用两个return语句; 在Rust中只有一个返回表达式。 Rust中的大多数内容都是表达式,可以返回并分配给变量。 表达式的结构决定了执行的结构。

Rust总体上比Golang更具功能性。 上面的代码可以使用任何方法而不是Range来重写,例如:

fn is_prime(n: u64) -> bool {
   match n {
       0…1 => false,
       _ => !(2..n).any(|d| n % d == 0),
   }
}

示例由Rosetta Code提供(此处还有更多可用)。

结论

如果您正在设计需要处理大量流量的Web服务,那么这两种语言都可以正常工作,您希望能够纵向和横向扩展。根据业内许多人的说法,Go速度更快,因此如果您拥有大型开发团队或许多可编写的服务,那么它可能是更好的语言选择。 Go和Rust都不容忍不安全的内存访问。

Rust被描述为“Go in的一种优秀语言,非常简单,每一种可能的方式”和“与任何其他编程语言并排比较时几乎是防弹的”。然而,Go更受欢迎,部分原因在于其相对简单和低启动时间。

这两种语言被视为竞争对手,部分原因是它们大约在同一时间出现,但正如我们所看到的,这并不一定如此。 Go始终关注简单性和一致性,使开发人员能够更轻松地进行编程。它通过严格的简单应用使大型编程团队更高效。同时,Rust允许开发人员从粒度级别控制,从控制线程与系统其余部分的行为方式到变量的生命周期。

Rust为C ++和D竞争空间,即存在于更复杂的领域,对于准备接受更复杂的语法和语义以换取最佳可能性能的程序员,例如微控制器,AAA游戏引擎和Web渲染引擎。

与此同时,Go更像是2006年后互联网2.0版公司的竞争者,他们想要比基于JVM的语言更简单的解决方案,并且已经超越了Ruby,Python和Node.js(v8)。