写点什么

Rust 是系统编程的未来,C 是新的 Assembly

2019 年 9 月 02 日

Rust是系统编程的未来,C是新的Assembly

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


原文链接:


“Rust is the future of systems programming, C is the new Assembly”: Intel principal engineer, Josh Triplett


2019 年 9 月 02 日 10:208386
用户头像

发布了 351 篇内容, 共 152.3 次阅读, 收获喜欢 776 次。

关注

评论 2 条评论

发布
用户头像
有没有大佬可以对比一下Rust和Go。
2019 年 09 月 03 日 09:28
回复
这个可以策划起来哈哈 有专家也说 Rust是C和C++的接班人 Go是Python和Ruby的接班人
2019 年 09 月 04 日 14:25
回复
没有更多了
发现更多内容

moon不讲武德!!!一个类加载机制给面试官说蒙了!!

moon聊技术

Java JVM 类加载 类加载器

云原生应用Go语言:你还在考虑的时候,别人已经应用实践

华为云开发者社区

go 微服务 云技术

什么是堡垒机?为什么需要堡垒机?

xcbeyond

运维

区块链应用场景有哪些?区块链应用开发

t13823115967

区块链应用场景有哪些 区块链应用开发

申通快递 双11 云原生应用实践

阿里巴巴云原生

阿里云 Kubernetes 运维 云原生 监控

快三走势分析判断技巧《走势图预测》

陈北

SELinux 安全上下文配置

在线K歌的发展和优势

anyRTC开发者

音视频 WebRTC RTC sdk

LeetCode题解:169. 多数元素,分治,JavaScript,详细注释

Lee Chen

算法 LeetCode 前端进阶训练营

快三大小最简单的方法倍投盈利

陈北

geohash

Web前端如何实现断点续传

QiyihaoLabs

Web 断点续传 upload pl

市值管理机器人、自动跑k线机器人开发

t13823115967

市值管理机器人 自动跑k线机器人开发

大厂经验:埋点数据质量之埋点验证

阿亮

埋点 数据验证

马士兵最新2020涵盖P5—P8Java全栈架构师学习路线,跟着老师学我已拿P7Offer!

Java架构追梦

Java 学习 架构 面试 马士兵

【薪火计划】05 - 坦诚是领导力的根基

brave heart

管理

英特尔与南京溧水经济技术开发区共同成立智能交通研究院

intel001

程序员面试的时候突然遇到答不上的问题怎么办?

Java架构师迁哥

我是面试官,我来分享一波面经!看看我的内心OS

比伯

Java 编程 架构 面试 技术宅

30分钟开发一款抓取网站图片资源的浏览器插件

徐小夕

Java chrome 前端 前端进阶 chrome扩展

如何用CSS实现图像替换链接文本显示并保证链接可点击

陈北

CSS小技巧

有奖话题 | 如果程序员和产品经理都会凡尔赛文学,将如何对话?

YourBatman

话题讨论 凡尔赛文学

【JAVA】List转换为array

莫问

市值管理软件,交易平台挂单机器人,做市机器人

WX13823153201

市值管理软件

双指针算法和位运算&离散化和区间合并

落曦

Python进阶——什么是元类?

Kaito

Python

面试JVM一问三不知??来看看这个

程序员的时光

JVM Java虚拟机

About Me

翎君

android

如何基于App SDK快速地开发一个IoT App?

IoT云工坊

App 物联网 sdk 智能家居

视频作品播放量低:自媒体作者如何走出新手村

石头IT视角

基于DAYU的实时作业开发,分分钟搭建企业个性化推荐平台

华为云开发者社区

华为 算法 数据 dayu

快三高手预测《走势技巧易懂教学》

陈北

jdk

彻底搞懂 IO 底层原理

vivo互联网技术

Java Netty 服务器 语法

演讲经验交流会|ArchSummit 上海站

演讲经验交流会|ArchSummit 上海站

Rust是系统编程的未来,C是新的Assembly-InfoQ