LWN:Rust 与 GCC 的两个开发方案!
共 3076字,需浏览 7分钟
·
2021-10-16 02:10
关注了就能看到更多这么棒的文章哦~
Rust and GCC, two different ways
By Jonathan Corbet
October 4, 2021
LPC
DeepL assisted translation
https://lwn.net/Articles/871283/
使用 C 或 C++ 等语言的开发者,一般来说使用两个相互竞争的编译器(GCC 和 LLVM)之一就都能完成工作。然而,Rust 的开发者目前只能使用基于 LLVM 的 rustc 编译器。虽然 rustc 可以正常工作,但开发者想要一个替代方案,这也是合理的需求。目前看来,有两种不同的方式可以实现利用 GCC 编译 Rust,虽然目前都还没有完全准备好。这两种方法的开发者都来到了 2021 年的 Linux Plumbers 大会,介绍了他们自己方案的当前状况。
rustc_codegen_gcc
首先是 Antoni Boucher,他介绍的是 rustc_codegen_gcc 项目。他的开场白提到 rustc 编译器是基于 LLVM 的,这一点会有很多影响,其中之一就意味着它不能支持 GCC 所支持的所有架构。LLVM 有的,Rustc 也都有,因此它就具有了一个 API,可以用来插入(plugging in)另一个代码生成器(alternative code generator)。这个 API 可以用来通过 libgccjit 来将 GCC 的代码生成机制利用起来。这就是 rustc_codegen_gcc 所采取的方法。
这个做法为什么会有需求呢?Boucher 说,因为 Rust 语言越来越受欢迎,但它除了 LLVM 所支持的那些体系架构之外,还需要能支持更多架构。尤其是 Rust for Linux 这个工作更加突出了这个问题,但此外也还是有很多其他有需要的场景的。支持更多体系架构的话,嵌入式系统开发者能从中受益,此外 Firefox 浏览器也可以受益。
rustc_codegen_gcc 现在支持了 Rust 的许多特性,包括基本类型、聚合类型(aggregate types)、变量、函数、原子操作(atomics)、线程本地存储(thread-local storage)、内联汇编、许多 intrinsics 等等。该编译器在 Compiler Explorer 中已有支持。libcore 测试已经完成,并且也完成了大部分的用户界面测试。这个编译器也在被实验着用来为 m68k 架构构建 Rust 代码,不过按 Boucher 的说法,这项工作仍处于早期阶段,但它确实表明是有可能为 LLVM 不支持的平台构建 Rust 程序的。
这里仍然有一些问题需要解决。需要支持一些属性(attributes),还有要支持生成调试信息。并且生成的代码质量目前有时候不是最优的。还需要做更多的工作来支持新的体系结构。此外还不支持链接时优化(link-time optimization)功能等等。这项工作也需要对 libgccjit 进行一系列的修改,其中大部分改动仍在 review 过程中。
还有一些其他问题,包括需要使用 GCC 的一个 patch 版本,直到所有的修改都被合并到 upstream 之后才可以使用正式版。即便如此,也还需要 backport 这些 patch 才能使用较早的 GCC 版本,因为这对于编译内核是很重要的。
尽管如此,这个项目的进展似乎已经很不错了。Boucher 指出,曾经有一个很活跃的 pull request 打算把 rustc_codegen_gcc 添加到 rustc 编译器中,但现在情况已经变了,在 9 月 29 日就完成了这个 merge。
Native GCC
Philip Herron 接着介绍了 Rust 在 GCC 前端这边的直接支持,也就是 gccrs。这个编译器不是 LLVM 和 GCC 的混合体,而是在 GNU toolchain 中完整实现对 Rust 语言的支持。这项工作是用 C++ 编写的(他认为这样可以更容易达到 bootstrap 需求),并打算成为 mainline GCC 的一部分。它利用了现有的 binutils,并重用了官方的 Rust 库(如 libcore、libstd 和 libproc)。
演讲者再次提出了 "为什么?"的问题。他回答说,他喜欢大项目,所以这个项目看起来很有吸引力。它与 LLVM 中的问题解决方式形成了有趣的对比,这也是一个很好的机会可以用来了解 GCC 是如何处理一种现代的高级语言的。等这个工作完成之后,在 code size、寄存器分配(register allocation)和功耗效率(energy efficiency)方面进行一下对比,这会很有价值。
他说,如果能有一个独立的 Rust 实现,就会有很多好处。与 GCC 紧密结合在一起,这样对于那些希望使用 GCC plugins 的项目来说会很有好处。基于 GCC 的 Rust 编译器将可以使 rustc 在新平台上的 bootstrap 会更加容易。对链接时优化(LTO)的支持也需要得到改善,而这种优化方式如果是使用混合编译器的场景的话,往往效果不怎么好。当然,GCC 也会带来对更多目标架构的支持。
Herron 说,GCC 支持 Rust 的工作早在 2014 年就开始了,但后来停滞不前。该语言的发展速度太快,GCC 的开发者跟不上它的发展。这项工作后来在 2019 年重新启动了,最近对 Rust for the kernel 项目的兴趣正在帮助推动其严谨。而包括 Open Source Security 和 Embecosm 在内的多家公司正在支持基于 GCC 的 Rust 编译器的开发。已经有了一个详细的计划,要在 2022 年底前发布一个 "最小可行产品(minimum viable product)" 编译器。
到目前为止,已经支持了核心数据结构以及大多数的控制流(control-flow),尽管还有一些 control-flow 的工作仍在进行中。泛型(Generics)和特性(trait)解析已经可以生效了。未来的工作包括有 macro、import、不稳定特性和 intrinsics 的支持。有趣的是,目前的编译器已经可以构建 "hello world" 了,但它需要使用所谓的 unsafe code,因为缺乏 macro 支持意味着无法使用 println!(),必须调用 C 语言的 printf() 函数来代替。
计划在未来进一步开展的工作包括有 borrow checker,这将与 Polonius 项目来合作完成;增量编译也在计划中,还有需要将这个前端的支持移植到旧 GCC 版本上去。长远来说,希望这项工作能够帮助推动 Rust 编译器的兼容性测试。
这些会谈的视频可以在 YouTube 上找到。
全文完
LWN 文章遵循 CC BY-SA 4.0 许可协议。
长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~