【ArchSummit架构师峰会】基于大模型的基础框架、中台、应用层等专题全覆盖 >>> 了解详情
写点什么

谷歌“新宠” Rust

  • 2021-04-09
  • 本文字数:2654 字

    阅读完需:约 9 分钟

谷歌“新宠” Rust

近日,谷歌宣布 Android 开源项目(AOSP)现已支持使用 Rust 编程语言来开发 OS。这一举动让正火的 Rust 语言热度再次上涨。

 

要用 Rust 解决什么问题?

 

目前,Android 项目主要用两种语言构建。Java(以及最近出现的与 jvm 兼容的语言,如 Kotlin)已被用于操作系统的上层部分,如 UI 部分;在内核、驱动程序等 OS 的基础层面,则通常用 C 编写,有时也会使用 C++。

 

为了更适合 OS 的底层编程,这些语言在设计时,考虑到了可控和可预测性等特性,可以提供对底层系统资源和硬件的访问。同时,它们的资源需求相对轻量,可预测性更强。

 

因此,C 语言,甚至 C++,都被认为非常适用于系统级编程,因为它们某种程度上提供了接近底层硬件的功能,这是一些高级语言都很难实现的。


但这种灵活性是一把双刃剑。目前,C 和 C++ 的内存安全问题仍然很难解决。由于没有可依赖的垃圾收集,看似简单的内存管理,经常导致严重的安全问题,如缓冲区溢出等。有分析指出,内存安全漏洞占 Android 开源项目中发现的所有严重安全漏洞的 70%。

 

Rust 由 Mozilla 推出,最初是被设计为 C 和 C++更安全的替代语言。尽管 Rust 并没有被广泛用于应用开发,但它已经迅速成为最受青睐的系统开发语言之一。Rust 不像 C 那样依赖手动内存管理,但也缺少带有 Java 风格的垃圾收集器。

 

谷歌方面认为,Rust 使用编译时检查(强制执行对象生命周期 / 所有权)和运行时检查(确保内存访问有效)的组合来提供内存安全保证。提供这种安全性的同时,Rust 的性能表现足以匹敌 C 和 C++。

 

除了 Rust 编程语言的安全性能外,谷歌认为使用 Rust 也可以减少成本投入。

 

据悉,目前所有 Android 进程均已沙箱化。它们通过遵循“三选二”规则(Rule of 2)来确定功能是否需要额外的隔离和特权。这种规则很简单:给定三个选项,开发人员只能选择以下三个选项中的两个。



对 Android 来说,这意味着如果代码是用 C/C++ 编写并解析了不可靠的输入,则应将其放入一个严格受限和无特权的沙箱中。

 

虽然这个规则可以有效降低安全漏洞的严重性和暴露程度,但 IPC(进程间通信) 和额外的内存占用,也会使其需要的新进程带来额外的开销并引入延迟。同时,高漏洞密度会降低其有效性,让攻击者可以将多个漏洞连接在一起。

 

像 Rust 这样的内存安全语言,可以降低代码中错误的密度,提高当前沙箱的效率,并且可以减少谷歌对沙箱的需求,从而引入更安全、更省资源的新特性。

 

Rust 的核心理念是所有权。简而言之,每个值都有一个所有者。当该所有者超出范围时,该值将被删除。这限制了基于内存的安全漏洞风险,同时也限制了为确保安全而需要编写的代码数量。

 

根据谷歌的分析,大多数内存错误出现在新的或最近修改的代码中,大约 50%的错误出现时间还不到一年。谷歌方面认为,在内存安全语言方面,最好是专注于新开发的代码,而不是重写成熟的 C/C++ 代码。


 “当然,引入一种新的编程语言并不能解决现有 C/C++ 代码中的错误问题。即便我们重新分配 Android 团队中所有软件工程师的工作,重写几千万行代码也是不可能的。”谷歌表示,旧代码并不是亟需改进的。

 

该消息宣布后,一些开发者表示希望可以做 NDK,但据 Android 开发者关系团队的一名成员透露,谷歌目前没有发布 Rust NDK 的计划,支持应用程序开发的语言将继续是 Kotlin、Java、C 和 C++。

 

Rust,谷歌“新宠”

 

在过去的 18 个月中,谷歌一直在 Android 开源项目中添加 Rust 支持,但将 Rust 扩展到更多的 OS 会是一个艰巨且耗时很久的项目。除了要维护一些工具链和依赖关系,测试基础设施和工具必须同步更新,开发人员也需要接受培训。

 

去年 7 月,Android 平台安全负责人 Sudhi Herle 表示,将继续在 Rust 上进行投资,看看哪些系统组件用 Rust 编写会更好。“我们相信,Rust 将最终从根本上让我们所有的用户都能安全地使用这个平台。”

 

目前,Android 的新蓝牙堆栈重写代码“ Gabeldorsche ”已经使用 Rust 编写。Gabeldorsche 的研发工作始于 Android 11,但至今仍未投入使用。Android 的 Keystore 2.0 模块是用 Rust 编写的,Android 的 IPC 驱动程序 binder 的用户空间部分也是如此。

 

Rust 正在成为谷歌“新宠”,不仅表现在 Android 开发上。

 

今年 2 月,Rust Core 团队宣布了新成立的 Rust 基金会,创始成员中就包括谷歌。同月,谷歌宣布与 Internet Security Research Group 合作用 Rust 语言重新实现安全组件,包括用 Rust 为 curl 开发 HTTP 和 TLS 后端,为 Apache httpd 项目开发 TLS 库。

 

谷歌有望取代 Android 的全新操作系统 Fuchsia 的新网络栈也使用了 Rust 编写。此外,ChromeOS 中使用的crosvm虚拟机监视器和驱动程序、用于支持 FIDO 安全密钥的固件等都在使用 Rust。谷歌还对 Rust 开源项目Mercurial的控制系统也作出了贡献。

 

谷歌高级软件工程师兼 Rust 核心团队成员 Manish Goregaokar 表示,谷歌选择 Rust 语言,部分原因是它能够与其他语言轻松集成。

 

过去几个月,谷歌、Amazon、Facebook、微软以及等科技巨头正疯狂吸纳人才市场上的 Rust 语言程序员,各方都在着力筹备组建 Rust 团队。

 

去年 8 月的一轮裁员之后,Mozilla 遣散了约 250 名员工,其中包括不少原 Rust 团队的活跃开发人员,谷歌聘请了此轮裁员中的 Mozilla 前员工 Lars Bergstrom 担任工程技术总监。Goregaokar 也来自 Mozilla,他目前主要任务是构建一套国际化 Rust 库,并有意继续在该语言的开源项目开发中投入精力。

 

开发者表示欢迎

 

对于谷歌的这一决定,很多开发者表示很兴奋。在Hacker News上,一位开发者留言表示:

 

我很高兴看到 Rust 在越来越多的项目中发挥作用。我在几周前开始学习,感觉与 C++相比,Rust 更加简单,快速,它有一个熟悉的注册表。它适用于嵌入式、web,、Wasm、一些快速脚本,CLIs。我的背景主要是 JavaScript、Dart 和 Java,但现在我很兴奋地尝试一些更低层次的东西,唯一的问题是我需要找到一种方法过渡到一个好的 Rust 项目。

 

另外,也有开发者提出了一个疑问:在 Java/Kotlin 应用程序中添加 Rust 代码,应用程序将不断地在 Java 和本机代码之间切换,虽然可以但对性能不是很友好。但值得庆幸的是,Chrome 和 Firefox 并没有完全编译成字节码,JIT 和渲染代码是用本机代码编写的。Mozilla 在浏览器中使用了 Rust,这意味着至少 Android 上已经有一个相当大的 Rust 运行库了。

 

Kotlin 和 Java 都很棒,在这一点上,开发者们几乎没有什么分歧,但有开发者表示“Java 太沉重了,使用 Rust 会带来新体验。”随着 Rust 的应用越来越广,已经有开发者讨论,谷歌将来会不会发布一个可以用来写 Rust 的应用程序。

 

参考链接:

 

https://security.googleblog.com/2021/04/rust-in-android-platform.html

2021-04-09 15:566003

评论

发布
暂无评论
发现更多内容

感恩,改变世界的开发者们!

京东科技开发者

开发者 程序人生

监控之美——Prometheus云原生监控

华章IT

运维 云原生 监控 Prometheus

LeetCode题解:17. 电话号码的字母组合,队列,JavaScript,详细注释

Lee Chen

算法 大前端 LeetCode

最详细的Linux TCP/IP 协议栈源码分析

linux大本营

Linux 后台开发 网络编程 C/C++ TCP/IP

Linux 服务器开发学习路线总结(配图 c/c++ )后台开发、Golang后台开发、后端技术栈

Linux服务器开发

Linux 后台开发 后端 Linux服务器 Go 语言

基于 GraphQL 的信息聚合网关的实现与展望

QiLab

高并发系统设计 graphql

收藏 | 阿里程序员常用的 15 款开发者工具(2020 版)

阿里巴巴云原生

阿里云 程序员 开发者 云原生 Java 25 周年

没想到我费劲心力学的kafka,还不如阿里大佬整理的这份学习手册,真的是差距啊

小Q

Java kafka 学习 架构 面试

接口测试和性能测试的区别

测试人生路

软件测试 性能测试 接口测试

红外遥控接收发射原理及ESP8266实现

IoT云工坊

人工智能 物联网 esp8266 红外遥控 pwm

甲方日常 58

句子

工作 随笔杂谈 日常

Linux笔记(二): vim 基本操作

Leo

Linux 学习 大前端

技术实践丨基于MindSpore框架Yolov3-darknet模型的篮球动作检测体验

华为云开发者联盟

AI 华为云 modelarts

索引为什么能提供查询性能...

小林coding

MySQL 索引 数据结构与算法 B+树

Windows环境下如何进行线程Dump分析

Java老k

Java dump

区块链可信数据服务平台搭建解决方案

t13823115967

区块链 可信区块链

前嗅教你大数据:常见的网站反爬策略与解决方案

前嗅大数据

大数据 数据采集 代理IP 网站反爬 反爬策略

支付宝阿牛整合Netty+Redis+ZooKeeper「终极版」高并发手册

Java架构追梦

Java redis zookeeper 面试 Netty

【领福利啦】广受欢迎的人工智能实战课程+“智能音箱”教程免费领!

小冬

人工智能 技术 福利 项目实战 智能音箱

Week1 命题作业

J

极客大学架构师训练营

看了 5 种分布式事务方案,我司最终选择了 Seata,真香!

程序员小富

Java 分布式事务 seata

GitHub 标星 1.3k+,一款超赞的用于字符串处理的 Java 8 库,附带源码分析

沉默王二

Java GitHub 字符串

广电总局严打劣迹主播:净化行业环境迫在眉睫

石头IT视角

高德最佳实践:Serverless 规模化落地有哪些价值?

阿里巴巴云原生

阿里云 Serverless 云原生

继linux命令之后,我又给你们整理了网络命令归纳,快给我来收藏

北游学Java

Linux 网络协议 网络 网络层

秋招offer收割机——后台服务器开发方向(专业学习路线图总结)

程序员小灰

c++ Linux 后台开发 架构师 服务器端开发

谈谈持续集成、持续交付和持续部署三者究竟是什么,有何联系和区别呢!

ShenDu_Linux

Linux 持续集成 架构师 持续交付 持续部署

Spring 源码阅读环境的搭建

程序员小航

spring 源码 环境安装 源码阅读 spring 5

微前端架构初探

徐小夕

Java 大前端

CPU虚拟化系列文章1——x86架构CPU虚拟化

华章IT

云计算 Linux cpu 操作系统 虚拟化

11.11数据可视化大屏设计揭秘

京东科技开发者

大数据 AI 数据分析 数据可视化 交互设计

谷歌“新宠” Rust_语言 & 开发_褚杏娟_InfoQ精选文章