在 2019 年开源技术峰会(OSTS)上,英特尔首席工程师 Josh Triplett 详细介绍了英特尔为将人们喜爱的 Rust 变成和 C 完全对等的语言所做的工作。在演讲“英特尔和Rust:系统编程的未来”中,他还谈到了系统编程的历史,C 是如何成为“默认”的系统编程语言的,Rust 的特性可以使它胜过 C,等等。
直到现在,OSTS 仍是英特尔的闭门活动,公司的业务负责人和技术负责人聚在一起,讨论各种有助于塑造开源生态系统的趋势、技术和创新的话题。然而,今年与往年不同,他们首次邀请了非英特尔的与会者,包括媒体、合作伙伴和开发人员。
大会举办了主题演讲,包括 50 多场技术会议、座谈会和演示,覆盖英特尔参与的所有开源技术,包括集成软件栈(边缘计算、AI、基础设施)、固件、嵌入式和物联网项目以及云系统软件等。
什么是系统编程语言
系统编程是开发和管理作为其他软件构建平台的软件。为了获得必要的性能和抽象,系统软件与计算机硬件之间会存在直接或关系紧密的接口。与应用程序编程不同,它提供的软件不是向用户提供服务,而是生成为计算机硬件提供服务的软件。
Triplett 将系统编程宽泛地定义为“任何不是应用程序的软件”。这包括 BIOS、固件、引导加载程序、操作系统内核、嵌入式及类似的底层代码、虚拟机实现。Triplett 也将 Web 浏览器视为一个系统软件,因为它“不只是一个应用程序”,它们实际上是“网站和 Web 应用程序的平台”。
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 安全漏洞的机会就越小,”他解释说。
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 对等。
Triplett:“为了实现与 C 对等,我参与了 Rust”
在 Rust 中引入兼容 C 的 union
Triplett 对 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 的贡献。
原文链接:
评论 2 条评论