过滤机

Rust与GO语言比较

发布时间:2023/3/13 1:59:28   
白癜风治好大概要多少钱 http://pf.39.net/bdfyy/bdfal/150527/4630319.html

杰伊·海克(JayHeike

)在

Unsplash

上拍摄的照片

介绍

我已经使用Go构建了广泛的应用程序已有一段时间了;同时,我听到了很多关于Rust的好消息,所以最近我决定花时间学习Rust。两种语言虽然是为了实现不同的目标而创建的,但有许多相似之处。在过去的几个月里,我一直在做笔记,试图围绕每种语言更适合的用例进行总结。这篇文章是这项研究的结晶。我的目标是从不同的角度和不同的角度比较两种语言,以便任何人,无论其角色如何,都可以全面了解每种语言的异同。

Go和Rust都是相对较新的语言(Rust是新出现的语言),它们试图克服对C++的批评,虽然共享相似的语法,但它们的创建都考虑了不同的设计目标。

简而言之,Go旨在简化开发,使其对任何开发人员都具有吸引力和可访问性,无论他们的经验如何。它在设计时考虑了多核处理器,以简化并发程序的并行执行,同时仍被视为通用编程语言。

另一方面,Rust是一种系统编程语言,旨在解决C++的内存安全问题和其他问题,同时保持C++著名的惊人性能。

两者都是出色的语言,可以为并发应用程序和流处理实现出色的性能,但它们的设计目标却截然不同。在本文中,我将尝试快速概述这两种语言及其优缺点,并回顾一些真实的单词用例,在这些用例中,我们将推荐一种语言而不是另一种语言。

简而言之

Go是由Google创建的,它在语法上类似于C。它的目标是通过添加内存安全、垃圾收集和结构类型来克服C++中存在的不安全操作。它非常容易学习和使用。它是为多核机器构建的,以最大限度地提高并发程序的并行性。它使用称为GoRoutines的非常轻量级的绿色线程进行并发编程。

Go可以快速编译为机器码,但具有垃圾收集的便利性和运行时反射的强大功能。它是一种快速、静态类型的编译语言,感觉就像是一种动态类型的解释语言。[2]

Go的占用空间很小,但它涵盖了许多用例,例如微服务、流处理、CLI等等。Golang为为不同平台生成二进制文件提供了出色的支持,而无需在目标上安装Go。由于它小巧而高效的二进制大小,非常适合打包在容器中的云原生应用程序。您的应用程序容器可以打包到一个微型容器(~8–15MB)中,只需几秒钟即可部署,这使其成为比JVM语言更好的微服务选择。有关更多信息,请查看我关于在Kubernetes中部署Go微服务的文章。

去专业人士

超快的编译器,感觉就像是一种解释性语言。很棒的开发者体验。快速的开发过程和提高的生产力。

简单而安全,我喜欢GO的地方在于,通常只有一种表达问题的方式,这加快了开发、代码审查以及整个开发过程。

非常适合初级和高级开发人员。它非常容易学习和采用,因为它不需要虚拟环境。

云原生应用和Kubernetes的完美选择。由于体积小,没有预热时间和速度。

多亏了GoRoutines,并发变得容易。

很棒的标准库,其中包括一个Web服务器。

GO可用于广泛的用例:CLI、Web应用程序、流处理等。

资源使用率低。您可以在单个服务器上运行数百万个GoRoutines。与JVM相比,它使用的RAM和CPU非常少,因此运行起来要便宜得多。

去缺点

它不简洁,很难保持代码干燥。

太简单了,像泛型这样的基本东西在Go中是不可用的,尽管它们很快就会被添加。

它是一种相对较新的语言,没有多少库或教程。

依赖管理有点反直觉且难以管理,但自从添加gomod.好消息是,它gomod是语言的一部分,而不是像sbtScala那样的单独项目,尽管sbt它更强大。

错误处理很麻烦。

不像Rust那样优雅、强大和灵活。

与C++相比有点不成熟。

去用例

CLI和脚本:像kubectl这样的大多数CLI都使用Go。

网络应用程序。由于它是高并发且不需要太多资源的,因此非常适合处理HTTP请求。

流应用程序。Go可以使用Go例程非常快速地处理数百万个事件。它是Scala中Akka流的竞争对手。

微服务。由于体积小、速度快、监控能力强,Go是云原生微服务的绝佳选择。

无服务器和云应用程序。Go是无服务器功能的完美选择,尤其是在GoogleCloud中。

简而言之,Rust

Rust也是一种新语言,它于年在Mozilla中启动,但直到年才达到第一个稳定版本。Rust自发布以来越来越受欢迎,特别是在过去5年中,许多公司如AWS、微软、Facebook、Mozilla、Dropbox或Cloudfare。自年以来,Rust每年都在StackOverflow开发者调查中被评为“最喜爱的编程语言”,没有其他语言能做到这一点,因此它很受欢迎

Rust是一种多范式、通用编程语言,旨在提高性能和安全性,尤其是安全并发性。[12][13]Rust在语法上类似于C++,[14]但可以通过使用借用检查器来验证引用来保证内存安全。[15]Rust在没有垃圾收集的情况下实现了内存安全,并且引用计数是可选的。[16][17]Rust被称为系统编程语言,除了函数式编程等高级特性外,它还提供低级内存管理机制。—维基百科

Rust最初的开发目的是取代C++,让开发人员更容易使用它,同时保持相同的性能水平。C++已经存在了将近50年,它用于低级编程来开发视频游戏、操作系统、实时系统等等。C的问题在于它难以使用,尤其是它不是内存安全的,因此会产生许多最著名的错误和安全漏洞。C开发人员需要确保程序是内存安全的,这在生产级应用程序中很难实现,这意味着在生产中经常会发现错误,从而产生巨大的问题。这些限制导致了以控制和性能为代价的垃圾收集通用语言(例如Java)。

因此,在Rust出现之前,程序员必须在古老而危险的语言(C++)或较慢的通用语言(如Java)之间做出艰难的选择。随着我们继续构建更大、更复杂的应用程序,垃圾收集语言在性能方面开始落后,因为它们没有从底层硬件中榨取所有的力量。随着多核处理器的引入,需要优化接近硬件的代码,以制作更快、更便宜的程序。

那么,如果Rust是C++的替代品,我们为什么要将它与Go进行比较呢?好吧,在过去的10年里,Rust有了长足的发展,并且创建了许多库和工具来改善开发人员的体验,让开发人员更容易使用它,并扩大了Rust适用的用例数量。这意味着Rust已经从一个小众市场取代C++作为系统级编程转向能够与Go、Python或Java竞争的高性能通用语言。与Go相比,Rust将性能、低资源消耗和小型二进制文件提升到了一个新的水平。

在前端,WebAssembly将Rust放在了聚光灯下。WebAssembly试图通过创建在浏览器上运行的高性能应用程序来克服浏览器中的JavaScript限制,Rust是WebAssembly中的主要语言。

Rust源代码在LLVM的帮助下被编译为本机代码,因此它在所有LLVM支持的平台上都可用,这使得它非常便携,但不如C。Rust是一个真正的开源项目,拥有一个非常强大和开放的社区这是其成功和快速扩张的关键。

Rust特征

由于Rust是一种新语言,它没有C++或Java等其他语言的历史分量,这意味着它的设计遵循了其他语言的最佳实践和经验教训。

Rust功能非常丰富,它具有丰富的语法和强大的构造,例如特征、强大的类型系统、闭包、泛型、集合、模式匹配、组合器、选项等,这些在其他强大的语言(如Scala)中都可以看到。

Rust还可以编译成一个非常小的二进制文件,比Go更小,因为它没有垃圾收集器。您可以在小于10Mb的小容器中创建Rust应用程序,比Go还小。

最重要的是,它具有开箱即用的出色工具。Cargo可能是最好的包管理器,它对单声道存储库有很好的支持。它快速、可靠且易于使用。编译器很棒,消息非常清晰,并且大多数时候它会准确地告诉您需要做什么。

我第二喜欢的功能是非常强大的零成本抽象。这意味着您可以创建抽象来开发易于使用的API和库,同时保持相同的性能,编译器将解析您的代码并将其转换为不会产生任何开销的高效代码。这意味着您可以使用更高级别的编程概念,如泛型、集合等,但它们不会带来运行时成本,只有编译器时间成本,因此您可以保持代码干净和干燥,同时仍然获得最佳性能。

Rust类型系统也非常强大,类似于Scala等其他语言。由于其强大的功能,Rust支持代数数据类型(ADT)enums,并且还支持高级模式匹配。这些特性通常只在高级函数式编程语言中可用,而Rust将这些高级特性带到了低级编程中。

但是将Rust与其他语言区分开来的最具创新性和独特性的功能是所有权模型,它允许Rust在编译时是内存安全的,允许您编写内存安全的高效代码,而无需显式分配和取消-分配内存。

在使用Rust之前,您必须在负责管理内存并确保其安全的低级编程语言之间进行选择,或者使用诸如Java或Go之类的垃圾收集语言,这会导致性能下降和更大的二进制文件大小。Rust在编译时引入了一种新的内存安全范式。

所有权是一组程序如何管理内存的规则。所有程序都必须管理它们在运行时使用计算机内存的方式。一些语言有垃圾收集,在程序运行时不断寻找不再使用的内存;在其他语言中,程序员必须显式分配和释放内存。Rust使用第三种方法:内存通过所有权系统进行管理,该系统具有一组编译器检查的规则。如果违反任何规则,程序将无法编译。所有权的任何功能都不会在您的程序运行时减慢它的速度。——

转载请注明:http://www.aideyishus.com/lkcf/3723.html

------分隔线----------------------------