21CTO 导读:微软进一步加大和增加Rust 在自己研发团队与相关产品线的资金与资源投入。
很多年来,我们一直在观察微软如何开发平台以及如何向外部用户推出技术。有一点很明确:对微软内部来说重要的任何事情,很快就会对任何在 Windows 或 Azure 上构建应用程序的人们表现得非常重要。
从内部工具过渡到外部工具,通常意味着Visual Studio和Visual Studio Code中新增一些功能。这些功能往往已经在微软内部使用了多年,你可以立即在自己的软件工程中使用。我们之前已经多次看到这种情况,例如 C# 和 TypeScript 的开发。
9月10号,微软首席工程师 Victor Ciura 将 Rust 列为公司内部开发的一级语言,与 C++、C# 和 TypeScript 并驾齐驱。他还在 Rust 基金会的客座文章中详细介绍了对 Rust 的支持,涵盖工具、安全性和生产工作流程等各个方面。
一级语言的地位的保障在于它们会拥有完整的工具链支持(从编辑器到编译器);通过原生 SDK 和优化库与 Windows 和 Azure 集成;以及符合微软内部的软件开发生命周期要求。当你的软件面向十几亿用户时,这些优势绝非可有可无,而是必不可少的。
现在, Rust 语言正式加入了微软顶级语言行列。
这一点其实并不令人意外,因为 Azure 首席技术官 Mark Russinovich 在前几年曾多次谈到微软对 Rust 的投入,以及Rust 的内存安全特性如何成为微软安全战略的关键组成部分。
此外,微软也是 Rust 基金会的创始成员,并对 Rust 的 Windows 工具和作为微软构建平台一部分的 Rust 编译器进行了大量投资。如今,Rust 在微软内部正式享有顶级的开发工具和工作流程。
Rust 基金会网站最近发布的一篇文章详细介绍了微软如何致力于将 Rust 与现有的 Microsoft Visual C++ (MSVC) 平台集成。
这种方法将使微软能够确保两种语言之间实现博文中所说的“无缝互操作性”,Rust 可以继承 Visual C++ 的各项功能。将 Visual C++ 与 Rust 结合使用,将使 Rust 能够用于构建底层 Windows 服务,从驱动程序到内核本身。
我们已经在Coreutils 的 Windows 版本中看到了这一点,Coreutils 本质是用 Rust 重写的 UNIX 核心命令。Coreutils 允许你在 Windows 终端中使用某些 UNIX 命令,从而可以轻松地在 Windows 和 WSL(Windows 子系统 Linux 版)托管的 Linux 发行版之间切换。
现在 Rust 已经跨越一级门槛,我们可以期待看到更多基于 Rust 的 Windows 开发工具,这些工具让我们能够在避免内存泄漏的同时访问底层功能。
使用 Rust 构建生产级 Windows 软件的关键之一是为 Rust 编译器开发新的代码生成工具rustc。
rustc 旨在支持除默认的LLVM之外的不同代码生成后端。目前已有支持GCC和Cranelift的版本。
如果你还不了解 Cranelift,它是字节码联盟 (Bytecode Alliance)的代码生成器,也是wasmtime框架的一部分。
添加新的代码生成器意味着构建一个工具,该工具连接到 Rust 编译器的 API,获取其字节码输出,生成本地代码,并将其传递给您选择的构建流程。
这便是微软 rustc_codegen_utc 工具的作用。它旨在与现有的 MSVC 技术栈协同工作,使 Rust 能够访问 Windows 开发平台中成熟、经过充分测试和验证的部分,而无需对代码进行任何更改(兼容性已内置)。这使其直接连接到 Visual C++ 编译器的后端,后者是由微软构建系统提供的一组工具,用于处理混合了代码和库的复杂项目。
微软将这个后端称为 UTC,即通用元组编译器(Universal Tuple Compiler)。不过,你不会在任何地方看到这个名称;实际的代码是一个 DLL 文件,名为 C2.DLL。代码以 .OBJ 文件的形式生成和交付,然后可以传递给 MSVC 链接器,最终生成二进制可执行文件。这使得 Rust 工具能够利用微软数十年来在编译器和构建工具方面积累的经验。微软无需重复这些工作,从而确保现有的安全性和弹性特性能够延续到 Rust 编译器链中。而且,生成的代码与经过同一后端处理的 C 和 C++ 代码兼容。
仅管理一个编译器后端也能降低 Rust 的支持成本,无需运行两个独立的编译器团队,从而避免彼此之间以及与 Windows SDK 和内核开发不同步的情况。降低 Rust 的经济影响将加快过渡速度,并支持 Rust 和 C++ 应用的长期混合交付模式。
这种方法也使得微软的 Rust 开发与使用 GCC 和 LLVM 编译器的平台处于同一水平,这些平台已经能够将 GCC 和 Clang 后端与 Rust 结合使用,从而充分利用了在 Linux 和 macOS 应用开发方面的投入。无论最终面向哪个平台,用 Rust 开发的代码都将获得相同的互操作性。
遗憾的是,对于我们这些普通用户来说,rustc_codegen_utc 目前仅供内部使用,不像其他 Rust 编译器代码生成工具那样都是开源项目。微软称其“已可用于生产环境”,并且已被一百多个微软 Rust 项目使用——这有力地表明了微软对 Rust 的采用规模。它并非唯一一款目前处于“隐藏”状态的 Rust 工具,因为微软完整的 Rust 工具链还包括其自行构建的核心 rustc 编译器和标准库。
在 Rust 编译器论坛的帖子里,微软表示将首先把测试和后端基础设施的工作成果整合到更广的 Rust 项目中。
这表示着距离公开发布可能还需要一段时间,但也表明微软显然已经将开源该项目提上了日程。将 rustc_codegen_utc 公开发布至关重要——采用 Rust 构建第三方设备驱动程序将有助于提高 PC、服务器和云虚拟机的稳定性,并降低安全风险。
目前,微软提供有与 Visual Studio Code 集成的 Rust 工具,以及在 Windows 上使用 Rust 进行开发的指南。要使用微软为 VS Code 开发的 Rust 语言扩展rust-analyzer,你仍然需要MSVC C++ 生成工具来编译和构建代码,以及一个微软开发的 Windows crate ,该 crate可让你直接访问 Windows API。一个自动化流程会从 Windows API 收集元数据,以确保它们始终保持最新。微软还提供了关于如何将 Windows API 调用和结构转换为 Rust 的文档。
现在就开始使用现有的 Rust 工具来熟悉这门新语言的 Windows 开发是很有必要的。这样你就可以开始利用 Rust 的内存安全特性,了解这门语言的工作原理以及需要对你的编程风格做出哪些改变。
然后,当微软开始向我们以及其他人发布新的内部工具时,你就可以开始使用它来构建底层代码,例如需要与微软自家的 C++ 互操作的驱动程序或库。
作者:洛逸
本篇文章为 @ 场长 创作并授权 21CTO 发布,未经许可,请勿转载。
内容授权事宜请您联系 webmaster@21cto.com或关注 21CTO 微信公众号。
该文观点仅代表作者本人,21CTO 平台仅提供信息存储空间服务。
请扫描二维码,使用微信支付哦。