为什么选择Rust作为物联网的编程语言? - Ash Moosa

19-06-21 banq
              

为新产品选择编程语言是一项重要的战略决策。它影响很多事情,对招聘,培养甚至产品的可行性都有长期影响。

首先要考虑的是语言是否适用于您要解决的特定问题陈述。重要的问题是:

  • 您的特定用例的语言是否合适?
  • 它会性能表现吗?
  • 它会在目标平台上运行吗?

这些应该是主要问题。但是还有其他因素可能影响您的决定,例如:

  • 如何选择特定语言会影响您从理念到现实的周转时间?
  • 使用特定语言有哪些成本优势?
  • 解决你可能偶然发现的新问题有多容易?

牢记这些问题,本文将尝试解释我们为新产品选择Rust的原因。

用例

我们正在创建一种设备,用于使用来自各种传感器的数据,并通过Web和移动应用程序提供实时分析和智能帮助。我们需要一种语言,其速度足以允许最小的实时延迟并使用SoC设备的有限资源。

以下是我们评估项目编程语言的方法。

1.性能

比较实际应用程序的跨语言性能是棘手的。我们通常没有对多种语言拥有相同的专业知识,并且性能受到程序员选择使用的算法和数据结构的影响。但人们普遍认为Rust的表现与C ++相当。并且比其他解释器或基于JIT的语言(如Lua或Python)执行得更好。资源

2.并发

如上面的用例所述,我们希望从多个传感器实时处理数据。我们的目标平台SoC设备使用基于ARM的CPU,通常有4个以上的内核。我们想要利用所有CPU内核,这意味着拥有多线程支持非常重要。

Lua没有本机多线程支持。虽然有第三方解决方法,但这些方法的性能和可靠性值得怀疑。另一方面,Rust内置了对多线程的支持,它的所有权和借用规则帮助我们编写非常安全的并发代码。

3.记忆安全

动态类型语言为您提供了很大的灵活性。类型更改不需要通过程序手动传播。它还为您提供了更多的心理灵活性,因为您可以在转换,操作和算法方面进行更多思考。灵活性使您可以更快地移动,快速更改内容,并以更快的速度进行迭代。但它需要付出代价。错过潜在问题要容易得多,这些问题通常很难调试。此外,这些功能通常会带来性能损失。

另一方面,在静态类型语言中,在开发过程的早期阶段捕获了大量错误,静态类型通常会导致编译代码执行得更快,因为当编译器知道正在使用的确切数据类型时,它可以生成优化的机器代码。静态类型也可用作文档。

Rust超越了这些点。Rust非常严格且迂腐的编译器会检查您使用的每个变量以及您引用的每个内存地址。它避免了可能的数据竞争条件,并通知您未定义的行为。

下图右侧部分显示了并发和内存安全问题。这些是最复杂和不可预测的错误类,从根本上不可能进入Rust的安全子集。此外,所有这些类型相关的错误都是危险的,并导致各种安全漏洞。

类型安全是Rust最大的卖点之一,也是Rust在StackOverflow调查中连续3年成为最受欢迎的语言的原因

Rust实现这一壮举的方式是使用变量所有权的概念。在Rust中,每个值都具有“拥有作用域”,并且传递或返回值意味着将所有权转移到新作用域。您可以访问您调用的函数,这称为“借用”。Rust确保这些租约不会超过借来的对象。这不仅使它非常安全,而且还可以帮助您正面解决并发问题,因为内存安全和并发错误通常会导致代码访问数据时不应该这样做。

4. 开发经验

Rust有一个陡峭的学习曲线。其中大部分是由于我们上面讨论过的“所有权”和“借用”概念。与使用Lua或Python等语言相比,这使得Rust难以学习并且更耗时。它需要人们非常了解有关内存分配和并发性的基本计算原则,并且它要求您在实现时牢记这些原则。这应该是任何语言的情况,但特别是在Rust中,编译器明确强制您编写最佳的内存安全代码。

尽管您正在使用C ++进行手动内存管理,但Rust有许多功能和便利,几乎让它感觉像是一种高级语言。而且Rust有很多抽象,不再让它感觉像是手动内存管理。

低级别控制和高级别安全性使开发人员能够更好地控制性能,而无需承担学习C / C ++的负担,或承担错误的风险。 

Rust还通过其强大的库(如货物测试)促进在程序内编写测试。与Bitbucket Pipelines相结合,可以非常轻松地设置持续集成和发货代码。

结论

基于以上所述,Rust是我们项目的不错选择。当您想要实现资源占用较少的高性能并发系统时,编程语言的选择是有限的。基于解释器的语言往往在高并发和低资源环境中表现不佳。系统编程语言是此类用例的理想候选者。

但是,当您没有资源约束并且不需要高并发性或使用其他机制(如事件循环)实现时,基于解释器的语言可能会更好。 

C / C ++是系统编程语言的圣杯。但是,在StackOverflow Surveys中, C&C ++也是最可怕的语言之一。对于来自其他更高级语言的新程序员来说,接近C / C ++很难。学习曲线非常陡峭。大约有74种不同的构建系统和28个不同包管理器的拼凑框架,其中大多数只支持某个平台/环境,并且在它之外是无用的。经过30多年的发展,新的程序员对他们投入太多了。

另一方面,Rust相对容易接近,拥有相当大的社区,没有数十年的技术债务,但却提供了相对的表现。内存安全性和简单的并发性只是增加了好处。

              

1