[

](javier-ramos.medium.com/?source=pos…)
6月5日
-
19分钟阅读
[
拯救
Rust与Scala
简介
我已经使用 斯卡拉几年了,构建了从流处理到数据管道的各种应用;与此同时,我一直听到很多关于 Rust,所以最近我决定花时间学习Rust。
这两种语言虽然是为了实现不同的目标而创建的,但也有一些相似之处。在过去的几个月里,我一直在做笔记,试图将我的注意力集中在每种语言更适合的用例上。这篇文章是这项研究的高潮。我的目标是从不同的角度和不同的观点来比较这两种语言,以便任何人,不管他们的角色是什么,都能对每种语言的异同有一个完整的了解。
这两种语言都是很好的语言,可以为并发应用实现很好的性能,但它们的设计却大不相同。Scala是一种更古老、更成熟的编程语言,在并发编程和大数据处理等领域找到了自己的定位。另一方面,Rust是一种较新的语言,是为了克服C++的批评而创建的,因为它是新的,所以它采用了许多其他语言的结构,同时修复了许多老语言的痛点。
Scala是基于JVM的,被认为是一个 通用编程语言. 拉斯特另一方面,Rust是一个 系统编程语言它是为了解决C++的内存安全问题和其他问题而创建的,同时保持了C++著名的惊人性能。
在这篇文章中,我将尝试给你一个关于这两种语言的快速概述,它们的优点和缺点,并回顾一些真实的文字使用案例,我们将推荐一种语言而不是另一种。
Scala 简而言之
Scala 是由学者们创造的一种编程语言,它是Java 的第一个替代品,运行在JVM上。 JVM.它将自己定义为。
Scala是一种现代多范式编程语言,旨在以简洁、优雅和类型安全的方式表达常见的编程模式[1] 。
Scala既是函数式的,也是面向对象的,提供了两个世界中最好的东西。 它有一种灵活的方式来定义你的程序,由你来决定如何描述它们:从纯粹的函数式编程到纯粹的面向对象编程。
和Java一样,Scala也是面向对象的。
它还提供了对函数式编程的支持和一个强大的静态 类型系统。与Java不同,Scala拥有Scheme、Standard ML和Haskell等函数式编程语言的许多特性,包括currying、类型推理、不可更改性、懒人评估和模式匹配。它还有一个先进的类型系统,支持代数数据类型、协方差和反方差、高阶类型(但不是高阶类型),以及匿名类型。
Scala也是一种函数式语言,即每个函数都是一个值。Scala为定义匿名函数提供了一种轻量级的语法,它支持高阶函数,允许函数嵌套,并且支持currying。
Scala的其他特性在Java中是不存在的,包括运算符重载、可选参数、命名参数和原始字符串。反之,Scala中没有的Java特性是检查异常,这一点已经被证明是有争议的。
Scala被大量用于大数据 和其他用例。像Twitter这样的公司转而使用Scala,特别是因为它有更好的并发性支持。Scala很强大,但很难学,而且与Java仍有一些兼容性问题。
Scala使用的两个关键驱动因素是 AkkaScala的两个主要驱动力是基于行为体系统的框架,用于并发编程和大数据处理引擎。 斯帕克大数据的处理引擎。由于Scala的学术性质,除了Akka或Spark之外,Scala在现实生活中并没有找到太多的应用。尽管它在金融机构中被大量使用。
Scala的优点
- 运行在 JVM.它带有多年来建立的所有JVM优化功能,并且与Java兼容。
- 非常简洁,与Java或GO相比,它需要更少的模板代码。
- 功能性和面向对象。
- 它的功能非常强大。 类型系统是非常强大的。你可以为你的库建立你的自定义DSL,在编译时强制检查等等。它还支持ADTs。
- 所有的 优点的函数式编程。
- Akka基于actor模型的生态系统使它成为并发系统的最佳选择。
- 强大的 建立工具。
- 多才多艺。Scala可以用来表达任何种类的问题。
Scala缺点
- 复杂。难以学习和掌握。通常由高级程序员使用。
- 太广泛了,有一百种方法来表达同样的事情,每个Scala开发者都有自己的风格,在一个大项目中很难保持代码的一致性。
- 与Java有一些兼容性问题;另外如果你需要使用Java库,就会失去Scala的优势。
- **编译器速度慢。**虽然有Bloop等工具可以缓解这些问题。
- 它继承了云端原生应用的JVM问题,如容器体积大、警告时间慢、难以调整、部署慢等。
- 虽然Scala的功能相当丰富,但它只是找到了某些利基,并没有被广泛采用。
使用案例
- 大数据和分析。由于其强大的类型系统和可扩展性,大数据领域的许多工具如 Spark使用Scala。它是数据工程师和大规模流媒体及批处理引擎的首选语言。
- 并发系统和实时应用。该 Akka框架以其对并发系统的可扩展性而闻名,广泛用于交易服务和其他使用JVM的高并发系统。
- 高并发的API。该框架 Play框架提供了一个高并发的网络框架,在Akka的支持下构建应用程序和API。
- 单片机。Scala是大型单片机应用的最佳选择,甚至是分布式应用。使用Akka集群,你可以在一个单一的应用程序中创建高度分布式的应用程序。
- 一般来说,Scala被用来构建特定领域的框架和库,比如Akka或Spark的情况。
Rust简而言之
Rust是一种新的 语言,早在2006年就开始在 Mozilla但它直到2015年才达到第一个稳定版本。Rust自发布以来越来越受欢迎,特别是在过去的5年里,许多公司如 AWS如微软、Facebook、Mozilla、Dropbox或Cloudfare。自2016年以来,Rust每年都被评为*"最受喜爱的编程语言"*。 Stack Overflow自2016年以来,Rust每年都被评为 "最受欢迎的编程语言",没有其他语言能做到这一点,因此它很受欢迎。
Rust是一种多范式的通用编程语言,旨在实现性能和安全,特别是安全并发。[12][13]Rust在语法上与C++相似,[14]但可以通过使用借贷检查器验证引用来保证内存安全。[15]Rust在没有垃圾收集的情况下实现了内存安全,而且引用计数是可选的。[16][17]Rust被称为系统编程语言,除了功能编程等高级功能外,它还提供了低级别的 内存管理机制。-维基百科
Rust最初是为了取代*C++*而开发的,使其更容易被开发人员所接受,同时保持相同的性能水平。C++已经存在了近50年,它被用于开发视频游戏、操作系统、实时系统等的低层次编程。C的问题是它很难使用,特别是它的内存不安全,造成了许多最著名的错误和安全漏洞。C语言的开发者需要确保程序的内存安全,这在生产级的应用程序中很难实现,这意味着在生产中经常发现错误,造成巨大的问题。这些限制催生了垃圾收集的通用语言,如Java,但却牺牲了控制和性能。

因此,在Rust之前,程序员不得不在古老而危险的语言(C++)和较慢的通用语言(如Java)之间做出艰难的选择。随着我们继续构建更大、更复杂的应用程序,垃圾收集语言在性能方面开始落后,因为它们不能从底层硬件中榨取所有的能量。随着多核处理器的引入,有必要在靠近硬件的地方优化代码,以使程序更快、更便宜。
那么,如果Rust是C++的替代品,为什么我们要把它与C++进行比较呢? Scala*?*好吧,在过去的10年里,Rust有了很大的发展,创建了许多库和工具,以改善开发人员的体验,使其更容易为开发人员所接受,并扩大Rust适用的用例数量。这意味着Rust已经从取代C++作为系统级编程的小众语言走向了能够与Go、Python或Scala竞争的高性能通用语言。与其他语言相比,Rust将性能、低资源消耗和小二进制文件提高到了一个新的水平。
在前端。 WebAssembly把Rust放在聚光灯下。WebAssembly试图通过创建一个在浏览器上运行的高性能应用程序来克服浏览器中的JavaScript限制,Rust是WebAssembly的主要语言。
源代码在Rust的帮助下被编译成本地代码。 LLVM因此,它可以在所有LLVM支持的平台上使用,这使得它的可移植性很强,但不如C语言。Rust是一个真正的开源 项目,有一个非常强大和开放的社区,这是它成功和快速扩张的关键。
Rust的特点
由于Rust是一种新的语言,它不像其他语言(如C++或Java)那样具有历史分量,这意味着它是按照其他语言的最佳实践和教训设计的。
Rust的功能非常丰富,它有丰富的语法和强大的结构,如traits、强大的类型系统、闭包、泛型、集合、模式匹配、组合器、选项等,这些都是你在Scala等其他强大语言中看到的。
除此之外,它还有很好的工具,开箱即用。 货物Rust可能是目前最好的软件包管理器,对mono仓库有很好的支持。它是快速、可靠和易于使用的。编译器非常棒,信息非常清晰,大部分时间它都能准确地告诉你你需要做什么。
我第二喜欢的功能是 零成本抽象它是非常强大的。这意味着你可以创建抽象来开发易于使用的API和库,同时保持相同的性能,编译器会解析你的代码并将其翻译成不产生任何开销的高效代码。这意味着你可以使用更高层次的编程概念,比如泛型、集合等等,但它们不会带来运行时的成本,只有编译器的时间成本,所以你可以保持你的代码干净和DRY,同时还能获得最大的性能。
Rust的类型系统也非常强大,与Scala相似。Rust支持代数数据类型( ADTs) ,这要归功于它强大的enums ,并且还支持提前 模式匹配.这些功能通常只在高水平的函数式编程语言中才有,而Rust将这些高级功能带到了低水平的编程中。
但是,使Rust有别于其他语言的最创新和独特的 功能是 所有权模式 这是允许Rust在编译时是内存安全的,允许你编写高效的代码,而这些代码是内存安全的,不需要显式分配和取消分配内存。
在Rust之前,你必须选择低级别的编程语言,在那里你负责管理内存并确保其安全,或者使用垃圾收集语言,如Java或Go,这将产生性能下降和较大的二进制大小。Rust在编译时为内存安全引入了一种新的范式。
产权是一套规则,规范Rust程序如何管理内存。所有程序在运行时都必须管理它们使用计算机内存的方式。有些语言有垃圾收集功能,在程序运行时不断寻找不再使用的内存;在其他语言中,程序员必须明确分配和释放内存。Rust使用了第三种 方法:内存是通过一个所有权系统来管理的,该系统有一套编译器检查的规则。如果违反了任何一条规则,程序就不会被编译。所有权的特点都不会在你的程序运行时拖慢它。-doc.rust-lang.org/book/ch04-0…
简而言之,这些是规则。
- Rust中的每个值都有一个变量,称为它的所有者。
- 在同一时间只能有一个所有者。
- 当所有者超出范围时,该值将被丢弃。
有了这3条简单的规则,Rust编译器就可以发挥它的 "魔力",确保你的程序是安全的,在生产中不会出现意外。
Scala/Java使用垃圾收集器来解决内存安全问题,而垃圾收集器会引入开销,Rust决定使用这种新模式,以创建更小更快的程序。
这个新模型的主要问题是 需要时间来适应它,作为一个开发者,你需要花时间来很好地理解这个模型,以避免无休止的挫折,这就是为什么Rust的学习曲线比Go等其他语言高得多,但与Scala类似。
Rust的优点
- 极其快速和高效。
- 功能丰富:闭包、模式匹配、集合、泛型等。
- 简洁、易读。
- 支持WebAssembly。
- 货物是一个优秀的软件包管理器。
- 它与C语言兼容,可以与现有的C程序交互。
- 真正的开放源码,有一个充满活力的社区。
- 能源消耗 低,成本低。
- 优秀的增长和普及率的提高。
- 伟大的错误处理。
Rust的缺点
- 不成熟,仍然很新。没有多少生产级的应用程序在生产中运行,尽管这正在快速增长。
- 有点难学,特别是所有权模型需要一些时间来适应它。
- 与Go等其他语言相比,编写Rust程序需要更长的时间,这是因为你需要遵循编译器设定的严格规则。
- 没有对并发性、异步编程和绿色线程的本地支持。这是设计上的问题,Rust对操作系统线程有基本的支持,但对于现实世界的异步编程,你需要使用库。该 未来-rs库包括零成本异步编程的基础。它包括关键的特征定义,如
Stream,以及实用程序,如join!,select!,以及各种期货组合方法,这些方法可以实现富有表现力的异步控制流。也有许多库和引擎可用于并发编程。 Tokio最著名和最强大的一个。
Rust的使用案例
- CPU 密集型应用,如游戏、操作系统等。
- 嵌入式系统
- 应用程序运行系统。例如,Node.js的创建者创建了 编码作为新一代的JavaScript运行时,它是用Rust编写的。
- 微服务。 REST端点等API。Rust有一些最快的网络框架,如 洛克菲勒.
- 网络汇编来在浏览器中执行高效的代码。它也可以用来在服务网中编写高效的过滤器,如 Istio.
- 网络开发
- 加密货币。
由于其复杂性,我不会用Rust来创建CLI和简单的脚本,但这是可能的。
Rust vs Scala
Bot编程语言是强 类型的,它们是安全的,高度并发的,可以每秒处理数百万条记录。
对于大数据/数据处理,Scala是最佳选择。在大数据领域,Rust仍然处于起步阶段;尽管有一些非常有趣的项目正在开发中,它正在迅速赶上。 数据融合是一个有趣的项目,旨在取代Spark,实现基于Apache Arrow的超快速并行数据处理。欲了解更多信息,请查看这个 文章.
对于流处理,Scala有一个更广泛的生态系统。 Akka本身就是一头猛兽,可以在没有任何依赖的情况下自行管理大量的请求,它还提供了更多的功能,比如背压。 在Rust中,你有 Tokio它也支持流处理,但没有同样的功能,因为它比基于行为体模型的Akka生态系统级别低。尽管如此,Tokio还是比Akka 快得多,因为它没有管理角色的额外开销。在Rust中,也有一个行为体库,叫做 Actix是其基于行为体的网络框架 Actix-web它是Rust中最知名的库之一,因为它是市场上最快的HTTP服务器之一,远远超过任何Scala HTTP服务器。
对于网络应用,Scala播放框架更适合于有状态的网络应用或长期存在的应用,因为有足够的时间让JVM对应用进行优化。Scala非常适用于小型服务或单体。如果你需要与Akka集成,它也是一个不错的选择。另一方面,Rust更适合于需要高性能的微服务和云原生应用,但由于其可扩展性,也可用于单体。 工作空间.. Rust火箭号或 Actix-web是非常强大且易于使用的。
Scala是一种在学术界创建的高级语言,它的创建不是为了解决任何特定的或具体的问题,而是为了从头开始创建一种非常丰富的语言,可以利用JVM的能力,包括其可移植性和性能优化,但它也带有JVM及其垃圾收集器的重量,影响性能。另一方面,Rust是一个 系统编程语言侧重于性能、低资源使用率和低层次的细节。Rust旨在通过创造一种更简单、更新颖的编程语言来完全取代C++。此外,Rust的零成本抽象功能和惊人的构建系统允许开发者创建易于使用但仍然高性能的库,用于通用任务,如REST APIs、流处理等,使Rust能够与Scala竞争。
Scala在多个方面都比Rust成熟,在函数式编程方面,Scala比Rust先进,但Rust也不落后,它只是缺少一些功能 更高类型的类型或尾部递归的检查,但它们很快就会出现。
Rust在概念上是纯粹的,而Scala已经被改造成了JVM,所以它有它的局限性,并给你的心理模型带来了额外的抽象层。WebAssembly是为了在网络和嵌入式系统中运行而建立的,它是现代、安全和轻量级的。它的目标不仅是取代JVM,而且是完全取代容器。Rust对WebAssembly有一流的支持,它是WebAssembly的主要语言。
Rust是系统编程、微服务、CPU密集型任务、网络等方面的更好选择。Scala更适合大数据 (Spark和Hadoop生态系统),主要是因为它的工具比Rust丰富和成熟。
性能方面
Rust在所有领域都会超过Scala,这是因为Rust是为速度而生的,是C语言的替代品,而Scala只是专注于语言本身。
对于某些应用,JVM的即时编译器(Just-In-Time (JIT)编译器可以在运行时进行优化,从而提高性能,而Rust是提前编译的,所以这种情况不可能发生。这意味着Scala可能需要时间来预热以达到一定的性能水平,而Rust从一开始就会有很好的性能,这在运行Serverless函数(FaaS).
在Rust中,编译器会指导你确保你写出安全的代码,同时也会提示你如何获得良好的性能,但相对来说,你还是很容易写出糟糕的Rust代码,其性能可能比Scala更差,这就是为什么要正确学习这门语言,了解所有权模型和内存的工作原理,这样你就不会陷入克隆数据的坏习惯中,因为克隆数据会增加内存的使用,降低性能;但一般来说, 只要用Rust重写代码,你应该能获得很大的性能提升。
Scala的优势在于使用JVM的优化和丰富的生态系统,例如 Akka框架在流处理和并发编程方面有很多功能和优化,而Rust缺乏这些功能和优化,这有助于你轻松构建高性能的应用程序。
最后,在Rust中,CPU、内存和二进制大小将大大降低,使得Rust成为一种更加节能和低成本的语言,这将减少你的云计算账单。
建议
如果你是一个开发人员...
- 如果你是一名资深的Java开发者,想转到更高级的语言,那么就学习Scala。
- 如果你已经在使用JVM和/或在企业内部运行,请学习Scala。
- 如果你正在寻找使用Akka和Spark的高薪工作,请学习Scala。
- 如果你在大数据方面有很大的投入,就学习Scala。
- 如果你想在金融机构等比较传统的行业工作,就学Scala。
- 如果你想进入加密货币领域,请学习Rust。
- 如果你是一名高级开发人员和/或C语言开发人员,请学习Rust。
- 如果你想找高薪工作,但又不多,那就学Rust吧。
- 如果你想从事嵌入式系统或WebAssembly和其他现代工具,请学习Rust。
- 如果你想用超快的代码来打动你的老板,学习Rust。
- 如果你想用ADT和高级类型来构建复杂的应用程序,就学习Rust。
- 如果你想在云中工作,在初创公司和很酷的项目中工作,那就学习Rust吧。
这两种语言都很复杂,而且有一定的学习难度。
Scala很有趣,很复杂,很有挑战性,但也很有回报,它的工资很高,而且它有更多的声望,特别是在大数据领域。
Rust很复杂,具有挑战性,但也很有成就感,它的报酬相当高,而且有声望。
Rust的发展速度比Scala快得多,趋势表明,由于Rust和Golang等其他语言接管了一些用例,以及Java增加了Scala的功能,Scala的使用率正在逐渐下降。
如果你是一个技术领导...
- 如果你依赖JVM或者你的开发团队已经熟悉Java,那么就使用Scala。
- 在利用JVM优化的高并发分布式系统中使用Scala。
- 在大数据方面使用Scala,特别是Spark。
- 如果你的Java应用有扩展问题,请使用Scala。
- 如果你的团队已经知道C语言,并且你想写更安全的代码,那么就使用Rust。
- 使用Rust来开发高并发的复杂分布式系统,充分利用每一点硬件资源并提供可预测的性能。
- 使用Rust来重写你的应用程序中需要高性能的部分,你可以把其他部分留在其他语言中。
- 使用Rust来远离C,它们是兼容的。
- 如果你在一个生产中的错误非常昂贵的公司工作,如医疗保健、航空等,请使用Rust。
- 如果你的问题可以用现有的成熟库来解决,如Tokio、Rocket、Actix等,就使用Rust。你会得到非常好的性能,而不需要付出很多努力。
- 使用Rust来生成最小的二进制文件以部署在边缘或嵌入式系统上。
- 将Rust用于大型项目或单一项目
- 在模块化是关键的大代码库中使用Rust
总而言之,这两种语言都可以用于单体和微服务,都可以用于并发编程,而且性能非常好。Rust更擅长运行并行任务和优化资源,使其效率更高、成本更低,它还能创建更小的二进制。对于Serverless和Kubernetes来说,Rust会更容易、更快、更高效。Scala有更成熟的库,特别是针对大数据。
如果你是一个管理者...
- 将Scala用于遗留 的关键并发应用、单片机或实时系统。
- 在大数据方面使用Scala。
- 如果你已经在使用Java,并且在你的组织中改变是困难的,需要时间,那么就使用Scala。
- 对于新的关键并发应用、单片机或实时系统,使用Rust。
- 使用Rust来构建 更绿色项目。
- 使用Rust或Scala来吸引高技能的开发人员。
- 在大型代码库和复杂项目中使用Rust或Scala。
- 在Kubernetes或Serverless中使用Rust进行微服务。
简而言之,Rust的运行成本更低,性能更好,同时Rust的程序员也非常优秀,如果你使用Rust,你会吸引人才。问题是,Rust开发人员不多,要找到他们可能非常困难。Scala对于更大的项目和大数据来说是非常好的。如果你在JVM上使用Java进行了大量的投资,Scala是一个常见的下一步,而不是Rust。
总结
Rust是我最喜欢的新语言,它是新的、令人耳目一新的、高性能的、丰富的和可扩展的。适应它需要一些时间,由于所有权模型,你可能会对编译器感到沮丧,但一旦你习惯了它并理解了规则,它就会变得更容易。
对我个人来说,Rust 最好的地方是它的 低能耗,JVM的消耗几乎增加了一倍。随着我们星球人口的增长和气候变化成为一个问题,我们应该以节能为目标**,减少我们的碳足迹**。软件简直无处不在,而运行软件所需的能量对地球有破坏性的影响;减少能源消耗将对我们的地球产生巨大的影响(同时也对你的云计算账单产生影响!),这一点非常重要。作为开发者,我们应该意识到这一点,并努力学习更多的节能语言 ,以便为创造一个更可持续的地球作出贡献。

与C语言一起,Rust是最高效的语言
作为一个开发者,我喜欢用Scala解决问题,它相当优雅、简洁、强大;使用起来也很愉快;然而对于现实世界的场景,我发现很难证明使用Scala是合理的,它和Rust一样难学,速度较慢,而且还背负着JVM的重任:垃圾收集导致性能不高、内存消耗大、安全漏洞、容器体积大等等。除此之外,Java也在迎头赶上,增加了许多Scala中可用的功能。这意味着,对于不太复杂的应用程序,Java将是一个很好的选择,而且你会有比Scala或Rust更大的可用开发人员库。对于高性能代码来说,Rust比Scala更胜一筹;所以我发现除了大数据项目之外,很难找到Scala成为新项目的首选的使用案例。
我相信 WebAssembly是未来的趋势,从长远来看,它可能完全取代容器。Rust + WebAssembly是一个强大的、可移植的轻量级解决方案。
我认为使用Rust的唯一风险是不成熟,仍然没有用于异步编程的官方API/Library,而且一些功能结构,如高类型类型,仍然是一项工作。除此之外,我认为 Rust已经找到了编程语言中的甜蜜点,这要归功于它的所有权模式,它创造了一种丰富但低水平/高性能的语言,人人都可以使用。
Rust正在以指数级的速度增长,特别是它的社区,在短短一年内增长了300%,成为增长最快的语言。
如果你正在使用Scala,并且你没有遇到性能瓶颈,那么就没有必要迁移到Rust。Scala是一门伟大的语言,特别是对于大数据来说,但对于新项目来说,确实可以考虑Rust。
我喜欢Rust的互操作性,所以你可以只迁移你的部分代码。使用不同的编程语言是可以的。许多公司将Rust用于性能重要的核心组件,而将其他编程语言用于其他用例。我想这是正确的做法。从用Rust重写核心组件开始,然后根据需要继续重构,记住,如果某样东西是有效的,就没有必要去改变它!"。
请记住 拍手 如果你喜欢这篇文章和 关注 我 或 订阅 以获得更多的更新!
订阅以在我发表文章时得到通知,并 加入Medium.com以获取数以百万计的或文章!