作者丨Bhagyashree R
译者丨平川
策划丨王文婧
在 2019 年开源技术峰会(OSTS)上,英特尔首席工程师 Josh Triplett 详细介绍了英特尔为将人们喜爱的 Rust 变成和 C 完全对等的语言所做的工作。在演讲“英特尔和 Rust:系统编程的未来”中,他还谈到了系统编程的历史,C 是如何成为“默认”的系统编程语言的,Rust 的特性可以使它胜过 C,等等。直到现在,OSTS 仍是英特尔的闭门活动,公司的业务负责人和技术负责人聚在一起,讨论各种有助于塑造开源生态系统的趋势、技术和创新的话题。然而,今年与往年不同,他们首次邀请了非英特尔的与会者,包括媒体、合作伙伴和开发人员。
大会举办了主题演讲,包括 50 多场技术会议、座谈会和演示,覆盖英特尔参与的所有开源技术,包括集成软件栈(边缘计算、 AI 、基础设施)、固件、嵌入式和物联网项目以及云系统软件等。
1 什么是系统编程语言系统编程是开发和管理作为其他软件构建平台的软件。为了获得必要的性能和抽象,系统软件与计算机硬件之间会存在直接或关系紧密的接口。与应用程序编程不同,它提供的软件不是向用户提供服务,而是生成为计算机硬件提供服务的软件。
Triplett 将系统编程宽泛地定义为“任何不是应用程序的软件”。这包括 BIOS、固件、引导加载程序、操作系统内核、嵌入式及类似的底层代码、虚拟机实现。Triplett 也将 Web 浏览器视为一个系统软件,因为它“不只是一个应用程序”,它们实际上是“网站和 Web 应用程序的平台”。
2 C 是如何成为“默认”的系统编程语言的以前,大多数系统软件包括 BIOS、引导加载程序和固件是用 Assembly 编写的。在 1960 年代,人们开始了在高级语言中支持硬件的试验,创建了 PL/S、BLISS、BCPL 和扩展 ALGOL 等语言。
在 1970 年代,Dennis Ritchie 为 Unix 操作系统创建了 C 编程语言。它源自无类型的 B 编程语言,C 打包了强大的高级功能和最适合编写操作系统的具体特性。多个 UNIX 组件包括其内核最终用 C 进行了重写。许多其他系统软件,包括 Oracle 数据库、很大一部分的 Windows 源代码、 Linux 操作系统,都是用 C 编写的。
在这一点上,C 被广泛地采用。但是,究竟是什么使开发人员可以舒服地迁移到 C?Triplett 认为,为了实现从一种语言到另一种语言的迁移,有两件事必须使开发人员觉得舒服:特性和对等性。
首先,语言应该提供“足够引人注目”的特性。“不能只是好一点点。它必须好很多,对得起迁移所需要付出的努力和工程时间,”他补充道。相比 Assembly,C 提供了更多的特性。它提供了一定程度的类型安全、可移植性、使用高级构造提高生产力、更可读的代码。
其次,语言必须提供对等性,就是说,开发人员必须能够相信其能力不亚于 Assembly。他说,“它不能仅仅是更好,还要不会更糟。”除了更快以及能够表示 Assembly 能够表示的任何数据类型外,它还具备 Triplett 所说的“逃生出口(escape hatch)”。这意味着你可以逐步迁移,如果需要,还可以结合 Assembly 一起使用。
Triplett 相信,C 现在正在变成几年前 Assembly 的样子。“C 是新的 Assembly,”他总结道。开发人员正在寻找一种高级语言,它不仅能解决 C 语言中无法解决的问题,而且还能利用这些语言提供其他令人兴奋的特性。这种旨在使开发人员从 C 语言迁移过去的语言应该是内存安全的,提供自动内存管理、安全等等。
“任何想要比 C 语言更好的语言,如果它真的是一个令人信服的替代方案,那么它必须提供的不仅仅是防止缓冲区溢出。人们关心可用性和生产力。他们关心的是编写自解释的代码,用更少的代码来完成更多的工作。它还需要解决安全问题。可用性和生产力与安全性密切相关。你完成工作所需要编写的代码越少,出现 bug 安全漏洞的机会就越小,”他解释说。
3 Rust 与 C 的比较早在 2006 年,Mozilla 员工 Graydon Hoare 开始编写 Rust,最初是作为一个个人项目。2009 年。Mozilla 开始赞助该项目,扩大了团队,进一步推动了这门语言的发展。
Mozilla 感兴趣的原因之一是 Firefox 是用 400 多万行 C++ 代码编写的,并且有很多非常严重的漏洞。Rust 构建时考虑到了安全性和并发性,因此,它是在 Quantum 项目下重写许多 Firefox 组件的最佳选择。他们还使用 Rust 开发 Servo,这是一个 HTML 渲染引擎,最终将取代 Firefox 的渲染引擎。许多其他公司也开始在他们的项目中使用 Rust,包括微软、谷歌、Facebook、亚马逊、Dropbox、Fastly、Chef、百度等等。
Rust 解决了 C 语言中的内存管理问题。它提供了自动内存管理,因此,开发人员不必对每个对象都手动调用 free。它与其他现代语言的区别在于,它没有任何类型的垃圾收集器或运行时系统。取而代之,Rust 有所有权、借用、引用和生命周期的概念。“Rust 有一个系统,它可以声明对某个对象的任何特定使用是该对象的所有者,还是只是临时借用该对象。如果你只是借用一个对象,编译器会跟踪它。只要你引用它,它就会保持原样。Rust 会确保对象的所有者在用完的时候释放它,它是在编译时插入 free 调用,不需要额外的运行时开销,”Triplett 解释道。
没有运行时也是 Rust 的一个优点。Triplett 认为,具有运行时的语言很难用作系统编程语言。他补充说,“你必须在可以调用任何代码之前初始化运行时,必须使用那个运行时调用函数,而且运行时本身可能在意想不到的时间在后台运行额外的代码。”
Rust 还旨在提供安全的并发编程。这和实现内存安全的特性是同一个特性,它会跟踪哪个线程拥有哪个对象,哪些对象可以在线程之间传递,哪些对象需要获取锁。
这些特性足够使 Rust 吸引开发人员选用它进行系统编程。然而,谈到第二个标准,Rust 尚无法做到与 C 对等。
4 Triplett:“为了实现与 C 对等,我参与了 Rust” 在 Rust 中引入兼容 C 的 unionTriplett 对 Rust 编程语言的第一个贡献是 RFC 1444 ,它始于 2015 年,并于 2016 年被接受。这个 RFC 提议在 Rust 中对兼容 C 的 union 提供原生支持,这将通过一个新的“上下文关键字”union 来定义。Triplett 想在 Rust 中构建虚拟机,而用于此目的的 Linux 内核接口 /dev/kvm 需要联合,他由此认识到了这份提案的必要性。
“我曾与 Rust 社区及语言团队一起将 union 引入 Rust,因为这项工作,我现在是 Rust 语言治理团队的一员,帮助评估和指导语言的其他变化,”他补充道。
2016 年,他在第一届 RustConf 大会上详细讨论了这个 RFC。
支持未命名结构和联合类型Triplett 研究的另一个特性是在 Rust 中支持未命名结构和联合类型。几十年来,这一直是一个广泛使用的 C 编译器扩展,并且也包含在 C11 标准中。这允许开发人员以任意方式对字段进行分组和布局,以匹配在外部函数接口(FFI)中使用的 C 数据结构。这个提议实施时,Rust 将能够使用与结构相同的名称表示此种类型,而不会人为地插入字段名,令使用现有平台完备接口的用户感到困惑。
在 Rust 中提供内联 Assembly 的稳定支持系统编程通常涉及底层操作,并且需要处理器的底层细节,比如特权指令。为此,Rust 支持通过“asm!”宏使用内联 Assembly。然而,只在编译器的每夜构建版本中提供,尚不稳定。Triplett 正在与其他 Rust 开发人员合作,编写一份提案,为内联 Assembly 引入更健壮的语法。要了解内联 Assembly 支持的更多细节,看看这个 pre-RFC 。
在 Rust 中加入 BFLOAT16 支持许多英特尔处理器包括 Xeon Scalable ‘Cooper Lake-SP’现在都支持 BFLOAT16,这是一个新的浮点格式。这是 32 位 IEEE 754 单精度浮点格式截断后的 16 位版本,主要用于深度学习。这种格式也用于处理大型数据集的机器学习库,如 Tensorflow 。这也使得与现有系统、功能和存储的互操作变得更加容易。这就是 Triplett 致力于在 Rust 中添加 BFLOAT16 支持的原因,那样开发人员就能够使用他们硬件的全部功能。
FFI/C 对等性工作组这是 Triplett 的重要声明之一。他启动了一个工作小组,将专注于实现与 C 的完全对等。在这个小组中,他的目标是与 Rust 社区和其他英特尔开发商合作制定剩余特性的规范,为了用于系统编程,这些特性需要在 Rust 中实现。这个小组还将专注于使用 Rust 的稳定版本支持系统编程,而不仅是试验性的编译器每夜构建版本。
在上周的 Reddit 讨论中,Triplett 分享了工作组的当前状态,“在回答问题之前,我先说明下:FFI /C 对等性工作组正在启动过程中,尚未完全启动。在完全启动时,我会在这里和其他地方发布相关信息及其初始目标。”
如有兴趣,您可观看 Josh Triplett 完整的 OSTS 视频演讲,了解更多英特尔对 Rust 的贡献。
原文链接:
https://hub.packtpub.com/rust-is-the-future-of-systems-programming-c-is-the-new-assembly-intel-principal-engineer-josh-triplett/
点个在看少个 bug 👇