蜜月后的锈迹

2020-10-12 07:07:11

两年前,我有一篇博客文章描述我爱上了铁锈。当然,与技术的关系就像任何其他关系一样:随着新鲜感和迷恋逐渐消退,它可以建立在更长期的基础上(通常更现实和温和),也可以开始破裂。所以,人们可能会问:“铁锈”度完蜜月后怎么样?通过回答这个问题,我应该指出,大约一年前(以及我与铁锈关系的一年),我们开始了氧化剂。一方面,这个名字不是偶然的-我们看到铁锈在我们的未来扮演着重要的角色。但另一方面,我们还没有开始认真构建,所以这实际上是一个比断言更尖锐的问题:Rust在从固件内部延伸到虚拟机管理程序和控制平面,再到RESTAPI的高度的堆栈中应该放在哪里?从氧化物的角度来看,简短的答案是铁锈已经被证明是非常合适的-老实说,非常合适-或多或少地在堆栈的所有层上都是如此。在这一点上,你可以期待来自Oxide的更多、更多的东西(我们打算或多或少地开源我们正在构建的一切),但是对于范围的一个预告片,你可以在Oxide工程师的工作中看到:参见Cliff的博客,Adam和Dave关于Dropshot的讨论,Jess关于在Oxide中使用Dropshot的讨论,Laura关于Rust宏的讨论,Steve Klabnik关于他加入Oxide的原因。(撇开必备条件不谈:我们正在招聘!)。所以Rust在Oxide上进展得非常好,但目前我想专注于更私人的事情-这是我个人喜欢在Rust中实现的原因。这些都是范围:有些是微小但美丽的细节,让我沉浸在工艺的乐趣中;有些是更深刻的功能,代表了最先进的技术;还有一些是由Rust社区开发的软件实体,除了工件本身,还有一些值得注意的是它们反映了谁会被Rust吸引(以及为什么)。还应该说,我绝对坚持我两年前说的每一句话;这不是作为对该清单的替代,而是对它的补充。最后,这个列表非常不完整;关于Rust有很多值得喜爱的地方,这不应该被认为是详尽的!当为嵌入式系统进行开发时-尤其是对于围绕着我们在Oxid上构建的服务器上的主机CPU的微控制器舰队-内存的使用是至关重要的。从历史上看,C语言之所以最适合这些应用程序,仅仅是因为它非常精简:除了作为语言本身的可移植汇编器之外,它基本上什么都没有提供,从而避免了复杂运行时的隐含假设(和周长)。但是,C语言提供的东西比极简主义更多地反映了历史;它不是优雅的东西,而是一种考虑不周的东西,让那些构建嵌入式系统的人自己有效地构建一切-而且用一种几乎没有帮助他们编写正确软件的语言。同时,高级语言和环境通常是围绕资源看似无限的现代机器设计的,功能过于齐全,无法适应(比方说)数万字节或微控制器(高度)受限的环境。即使人们可以诱使这些其他语言进入嵌入式用例,它通常也是作为一种重新实现,给开发人员留下了一个不一定从底层语言的开发中获益的分叉。Rust采取了一种不同的方法:一个丰富的默认标准库,但也是一种让程序选择退出该标准库的一流机制。通过将自己标记为no_std,程序将自己限制在libcore中的功能。反过来,该功能不做任何系统假设-尤其是不执行堆分配。这对系统来说并不容易;它需要开发人员的非凡纪律(他们必须不断区分核心功能和标准功能),并对嵌入式软件的限制有广泛的同情心。Rust兼具这两个优点,其结果是不同寻常的:一种安全、强大的语言,可以在微控制器高度受限的环境中运行-其二进制代码与C生成的二进制代码一样小。这使得no_std-正如Cliff所说的那样-成为Embedded Rust的杀手级功能,没有真正的优先或类似之处。两年前,我提到我喜欢Format!,特别是{:?}格式说明符。我花了更长时间才发现的是{:#?},它格式化了一个结构,但也美化了它(即,使用换行符和缩进)。这可以与{:#x}结合产生{:#x?},它可以漂亮地打印十六进制的结构。因此:变成这样:正在转储区域{daddr:Some(0x4db8,),base:0x10000,大小:0x8000,attr:RegionAttr{Read:True,Write:False,Execute:True,Device:False,DMA:False,},TASK:TASK(0x0,),}。

我的手指现在按De键入{:#x?}