笔者最近在了解嵌入式 Rust 开发方面的知识,网络搜索中,阅读到了 Pawan Bisht 于 2021 年 5 月 4 日发表在 knoldus 博客的文章 Why Rust for Embedded Development?。此文阐述了将 Rust 用于嵌入式的诸多优势,特此分享。
Rust 是一门系统编程语言,专注于三个要素:安全性、并发性,以及高性能。在语法上,Rust 类似于 C ,但具有内存安全性。
今天,我们将尝试理解:为什么我们应当将 Rust 用于嵌入式开发?以及在嵌入式开发领域,Rust 比其它编程语言更合适、更重要的几个原因。
较少的内存管理问题
众所周知,70% 的安全漏洞,都是由于内存错误而造成的。在防止内存安全问题方面,Rust 语言自身有其机制发挥着重要作用。Rust 语言中,有一个名为借用检查器(borrow checker)的组件,该组件旨在强制执行内存和资源的所有权(ownership),确保在编译时,捕获对内存的任何滥用。Rust 迫使开发者思考,让开发者意识到他们到底在做什么。
以前的开发中,面临的问题是:开发人员要么可以获得低层次的控制,要么可以获得更安全的权限。
例如:在 C/C 中,当程序员进行低层次的控制时,必须多加谨慎,他们必须考虑很多事情,以确保内存安全。
但是,在 Rust 出现之后,程序员进行低层次控制时,语言自身和编译器确保了内存安全。
高性能
Rust 语言中,性能提升的主要原因之一是:没有垃圾收集器。在编译时,确定何时不再需要内存,并且清理内存。与其它编程语言不同,Rust 没有运行时(runtime)检查。也就是说,Rust 所有的检查,都仅在编译时验证。
因为我们可以直接访问硬件和内存,所以 Rust 是嵌入式和裸机式(bare-metal)开发的理想程序设计语言。并且可以对我们的程序进行优化,使之接近机器硬件的最大理论性能。
跨平台支持
使用 Rust,我们可以在各种操作系统上,轻松构建完美工作的跨平台解决方案。此外,在 Rust 中有一些 web 框架可用,我们可以编写前端应用程序,如 Rocket、Actix 等。
丰富的生态系统
在软件的生产环境中,需要更多方面的因素,以保持其质量。Rust 具有丰富的生态系统:软件包管理器 Cargo、软件包社区站点 crates.io、文档中心站点 doc.rs 等等。当然还有更多生态工具,包括 Clippy,其提供的编译器扩展工具 lint 和 rustfmt,可自动进行语法检查、代码分析,以及格式化代码。
此外,Rust 还有一些官方和非官方的帮助渠道,比如聊天室、用户论坛、reddit 网站的 Rust 子站点、Stack Overflow 和其开设的 Rust 交谈频道。类似其它技术,Rust 也有许多全球交流研讨会议,如 RustConf、Rust Belt Rust、RustFest、RustCon Asia 等等。因此,我们可以说,Rust 有一个充满活力和受欢迎的社区。
好吧!我们已经介绍了使用 Rust 进行嵌入式开发的部分优点。现在我们来讨论:Rust 能否满足嵌入式系统的一些需求?
上述优势分析,是关于在嵌入式开发中,使用 Rust 的原因。然而,嵌入式开发中还有一些条件,使得 Rust 语言更值得选择。
可移植性
简而言之,可移植性即是“系统独立性(system Independence)”。在嵌入式系统中,如果一个产品能够在不同的环境中运行,那么,它可以被称为便携式产品。实现可移植性的一种方法,是通过硬件抽象层(HAL,Hardware Abstraction Layer)。
硬件抽象,是指软件中的一组类和例程,用于模拟某些特定于平台的细节。换句话说,硬件抽象提供了对硬件资源的直接访问。
那么,Rust 是如何满足这种重要需求的呢?在 Rust 中,具有嵌入式硬件抽象层(embedded-hal),其是一组 traits
,定义了硬件抽象层(HAL)的:实现、驱动程序、应用程序,以及固件)之间的实现契约。
互操作性
软件的互操作性,是为了有效地交换和处理信息,而相互通信的能力。
Rust 语言实现了在和 C 语言的互操作性。关于此互操作方式,Rust 标准库 stdlib
中有两个专用的模块:std::ffi
、std::os::raw
。另外,Rust 还支持与其它构建系统的互操作性。目前,RTOSs 正在进行中。
谢谢您的阅读,欢迎交流。