rust做嵌入式开发_Rust:一个不再有 C/C++ 的,实现安全实时软件的未来

Rust作为新兴编程语言深受 Haskell 和 OCaml 等函数式编程语言的影响,使得它在语法上与 C++ 类似,但在语义上则完全不同。Rust 是静态类型语言,同时具有完整类型推断,而不是 C++ 的部分类型推断,它在速度上可与 C++ 媲美的同时,也保证了内存安全。

索引的故事

在详细介绍 Rust 之前,我们先举一个例子。想象你是一个为新房子搭建煤气管道的工人,你的老板想要你去地下室把煤气管连到街上的主煤气管道里,然而你下楼时却发现有个小问题,这个房子并没有地下室。所以,现在你要做什么呢?什么都不做,还是异想天开地妄图通过把煤气主管道连到隔壁办公室的空调进气口来解决问题?不管怎么说,当你向老板汇报任务完成时,你或许会在煤气爆炸的土灰中以刑事疏忽罪起诉。

这就是在某些编程语言中会发生的事。在 C 里是数组,C++ 里可能是向量,当程序试图寻找第 -1 个元素时,什么都有可能发生:或许是每次搜索的结果都不同,让你意识不到这里存在问题。这种被称作是未定义的行为,它发生的可能性并不能完全被杜绝,因为底层的硬件操作从本质上来说并不安全,这些操作在其他的编程语言里可能会被编译器警告,但是 C/C++ 并不会。

在无法保证内存安全的情况下,未定义行为极有可能发生。漏洞 HeartBleed,一个著名的 SSL 安全漏洞,就是因为缺少内存安全防护;Stagefright,同样出名的安卓漏洞,是因为 C++ 里整数溢出造成的未定义行为。

内存安全不止用来提防漏洞,它对应用程序的正确运行和可靠性同样至关重要。可靠性的重要性在于它可以保证程序不会突然崩溃。至于准确性,作者有一个曾经在火箭飞行模拟软件公司工作的朋友,他们发现传递相同的初始化数据,但是使用不同的文件名会导致不同的结果,这是因为有些未初始化的内存被读取,因此模拟器就不同文件名的原因而使用了垃圾数值做基础,可以说他们的这个项目毫无用处。

为什么不用 Python 或 Java 这些可以保障内存安全的语言呢?

Python和Java使用自动垃圾回收来避免内存错误,例如:

释放重引用(Use-After-Free):申请已经被释放的内存。

多次释放(double free):对同一片内存区域释放两次,导致未定义行为。

内存泄漏:内存没有被回收,导致系统可用的内存减少。

自动垃圾收集会作为 JVM 或者 Python 解释器的一部分运行,在程序运行时不断地寻找不再使用的模块,释放他们相对应的内存或者资源。但是这么做的代价很大,垃圾回收不仅速度缓慢还会占用大量内存,而你也永远不会知道下一秒你的程序会不会暂停运行来回收垃圾。

Python 和 Java 的内存安全牺牲了运行速度。C/C++ 的运行速度则是牺牲了内存的安全性。

这种让人无法掌控的垃圾回收让 Python 与 Java 无法应用在实时软件中,因为你必须要保证你的程序可以在一定时间内完成运行。这并不是比拼运行速度,而是保障你的软件在每次运行的时候都可以足够迅速。

当然,C/C++ 如此受欢迎还有其他方面的因素:他们已经存在了足够长的时间来让人们习惯他们了。但是他们同样因为运行速度与运行结果的保障而受到追捧。然而不幸的是,这样的速度是在牺牲内存安全的前提下。更糟糕的是,许多实时软件在保障速度的基础上同样需要注重安全性,例如车辆或者医用机器人中的控制软件。而这些软件用的仍然是这些并不安全的语言。

在很长的一段时间里,二者处于鱼与熊掌不可兼得的状态,要么选择运行速度和不可预知性,要么选择内存安全和可预知性。Rust 则完全颠覆了这一点,这也是它为什么令人激动的原因。

Rust 的设计目标

无需担心数据的并发运算:只要程序中的不同部分可能在不同的时间或者乱序运行,并发就有可能发生。众所周知,数据并发在多线程程序中是一个常见的危险因素,这一点我们稍后再详细描述。

零开销抽象:指编程语言提供的便利与表现力并不会带来额外的负担,也不会降低程序的运行速度。

不需要垃圾回收的内存安全:内存安全和垃圾回收的定义我们已经了解了,接下来我们将详细阐述 Rsut 是如何平衡速度与安

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值