作者丨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 的 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 的贡献。

原文链接:

https://hub.packtpub.com/rust-is-the-future-of-systems-programming-c-is-the-new-assembly-intel-principal-engineer-josh-triplett/

点个在看少个 bug

C++和Rust_Rust 是系统编程的未来,C 是新的 Assembly相关推荐

  1. 系统编程(ISP)与应用编程(IAP)的区别!

    系统编程(ISP)与应用编程(IAP)的区别! 1.定义 (1)系统编程(ISP) ISP在系统编程是指电路板上的空白器件可以编程写人最终用户代码,而不需要从电路板上取下器件.已经编程的器件也可以用I ...

  2. 微软解释为什么Rust是系统编程的最佳选择

    上周,MSRC(微软安全响应中心)透露出拥抱 Rust 的打算,随后他们将这个话题扩展为一个系列,进一步阐述了使用安全的系统编程语言的的必要性,以及选择 Rust 的原因. 在该系列最新一篇文章中,M ...

  3. 快速理解编程结构_为什么系统编程全都用英文而不用中文?听完专家的解释恍然大悟!...

    全球博弈(quanqiuboyi)--不一样的观点,不一样的解读,8000万人订阅的超级微信大号.不关注时事,你将会被这个世界抛弃,点击标题下蓝字"全球博弈"关注,我们将为您提供有 ...

  4. 开放式系统编程技术_使用开放式硬件构建更好的辅助技术

    开放式系统编程技术 对于许多人来说,技术可以帮助并改善我们的生活,使某些任务变得更容易,可以进行长距离沟通,并为我们提供了一个了解周围世界的机会. 但是,对于许多残疾人来说,技术不是辅助,而是生活独立 ...

  5. 微软解释为什么 Rust 是系统编程的最佳选择

    上周,MSRC(微软安全响应中心)透露出拥抱 Rust 的打算,随后他们将这个话题扩展为一个系列,进一步阐述了使用安全的系统编程语言的的必要性,以及选择 Rust 的原因. 在该系列最新一篇文章中,M ...

  6. Wolfram 语言之父 Stephen Wolfram :编程的未来

    以后说到编程,我们想到的不单单是程序员了.未来的生活与计算机紧密相连,编程的未来与我们息息相关.用计算机完成我们所有感兴趣的事可能成为现实. 作者 |Nick Heath 译者 |弯月,责编 | ma ...

  7. linux学习笔记 -- 系统编程

    系统编程 相关概念 概念 简易cpu结构 mmu内存管理单元 环境变量 PATH SHELL HOME LANG TERM getenv setenv unsetenv 进程控制 fork函数 get ...

  8. 资深程序员带你攻克 Linux 系统编程

    作者简介:宇文拓,近十年 Linux C/C++ 开发经验,现就职于某创业公司,负责服务器架构与系统设计.曾就职于某通信业知名美企,负责核心网和防火墙产品研发.在 GitHub 上发布了开源项目 An ...

  9. linux服务器开发二(系统编程)--线程相关

    线程概念 什么是线程 LWP:Light Weight Process,轻量级的进程,本质仍是进程(在Linux环境下). 进程:独立地址空间,拥有PCB. 线程:也有PCB,但没有独立的地址空间(共 ...

最新文章

  1. python整数类型-Python整数类型(int)详解
  2. Caffe学习系列(18): 绘制网络模型
  3. 运维基础(15) Linux 应急响应
  4. 什么是BS结构、CS结构、RIA结构程序
  5. 【示例】Lucene创建索引库编程步骤
  6. Markdown的常用语法
  7. Nginx动静分离实现负载均衡
  8. 如何保持自己 fork 的项目和原始项目同步
  9. 【JanusGraph入门】(第一天,下载项目)
  10. 共识算法PBFT和Raft
  11. ckplayer 如何在PC上完美支持 m3u8播放
  12. NVIDIA vGPU应用
  13. 有没有一点像selina呢?
  14. 蚂蚁森林自动收能量之AutoJs实现
  15. Java集合概览、实现细节、数据结构
  16. GitLab允许开发人员推送到master分支
  17. 服务器接显示器显示不支援,Win10专业版显示器输入不支援怎么办?如何解决?...
  18. Appium+python自动化3-启动淘宝app(转)
  19. Rust(9):枚举类型
  20. 3D游戏引擎系列十一

热门文章

  1. 浏览器如何显示页面(二)
  2. rman本机复制数据库
  3. 《七周七语言:理解多种编程范型》书评整理
  4. 喜欢一个讨厌的人_为什么我们喜欢讨厌漫画无人
  5. 【PhD Debate-9】浅谈自然语言处理中的泛化性
  6. 期货投机原理(专业投机原理期货篇)
  7. 信息安全相关术语(行话)
  8. 如何恢复丢失的桌面文件
  9. PHP反序列化魔术方法
  10. 生物网络中基于节点相似度的链路预测图卷积