Rust Analyzer:一款旨在带来优秀IDE体验的编译器

Rust Analyzer是一个实验性的IDE(面向延迟的Rust编译器)。这是Rust生态系统的一次新的尝试,旨在带来优秀的Rust IDE体验。

编译器性能一直是Rust工具开发的主要关注点编译时间在各个版本中都在稳步改善。然而,正如Igor Matuszewski在Rust Belt Rust Conference大会演讲中所说的那样,Rust IDE支持是一个活跃的工作领域

尽管在过去的三年中,情况发生了很大的变化,包括新工具的大量出现和工具间集成的改进,但总是感觉 Rust IDE的故事还没有结束。

这项工作是在RLS 2.0工作组的指导下进行的,其中包括主要组件Rust Analyzer。为了了解更多信息,InfoQ借机采访了该项目的主要贡献者Aleksey Kladov,以及Rust核心团队成员Steve Klabnik。

InfoQ:Rust最近引起了很多人的兴趣,并且该语言的生态系统/工具一直在以非常快的速度演进和发展。Rust目前的成熟度如何?未来几年我们可以期待什么?

Steve Klabnik:“成熟”可以有很多含义。在我看来,衡量的标准是公司在真正的产品中使用Rust,像Facebook、亚马逊、谷歌、微软等公司那样。FAANG五大科技公司占了三家,已经不错了。 一般来说,Rust的发展速度正在变慢,新特性较少,更多的是对现有特性的改进。例如,async/await现在已经发布了,更多的工作放在了诸如诊断之类的事情上。在接下来的几年里,Rust将会获得更多的重要特性,但是与async/await主要适用于网络应用程序一样,这些特性也是对特定的领域非常有价值,但并非对所有的Rust程序员来说都很重要。例如,“const generics”允许你编写整数上的泛型代码,而不仅仅是类型,这对于数值类库来说非常好。但总的来说,这些特性的添加速度比以前的主要特性要慢。

InfoQ:您能简要解释一下当前的Rust编译器在IDE集成方面的局限吗?Rust Analyzer项目的目标是什么?

Aleksey Kladov:这里的局限并不是Rust语言所特有的,在比较命令行与IDE编译器时,它们都比较常见。 主要的问题是,命令行(或批处理)编译器主要针对吞吐量进行优化(每秒编译N千行代码),而IDE编译器针对延迟进行优化(在用户键入新代码片段后,在M毫秒内显示正确的补全变量)。吞吐量与延迟这两个目标需要的优化(甚至高级架构)差别很大。一般来说,对于开发时只考虑大吞吐量的编译器,很难针对低延迟要求进行改进。 另一个不同的地方是无效代码的处理。传统的编译器前端通常是按阶段组织的,每个阶段接受一个非结构化的输入,检查输入的有效性,如果输入确实有效,则在上面添加更多的结构。具体来说,早期阶段(如解析)的错误通常意味着后期阶段(如类型检查)根本不会运行这段代码。换句话说,“正确的代码”是一种很好的情况,其他的一切都可以看作是错误条件。相反,在IDE中代码总是被破坏,因为用户不断地修改它。一旦代码有效,IDE的工作就结束,批编译器的工作就开始。因此,面向IDE的编译器应该能够容纳不完整和被破坏的代码,并为这些代码提供IDE特性,比如补全。 Rust -analyzer项目的首要目标是提供一个在延迟和吞吐量方面都表现优异的Rust编译器。实现这一目标的道路是漫长的,我们目前所处的阶段实际上有两个前端:

  • rustc是一个非常成熟的批编译器;
  • rust-analyzer是一个尚处于试验阶段的IDE/面向延迟的编译器。

这些前端目前共享一小段代码,当前的战术目标是在它们之间共享更多容易共享的代码。

InfoQ:这个项目会取代Rust LSP实现吗?

Kladov:现在还不行;rust-analyzer是一个实验,我们还没有准备好推荐它作为正式的LSP实现。然而,目前的初步计划是,在不久的将来,rust-analyzer将取代RLS。

InfoQ:关于编译器重构将会朝哪个方向发展,您能分享一些细节吗?

Kladov:其主要思想是使编译器更加懒惰。IDE用来实现低延迟的一个最重要的技巧是尽可能多地避免工作。例如,要提供代码补全,你通常会需要分析屏幕上的代码及其直接依赖项;你不关心在你的项目中其他500万行代码编写了什么。这个想法很简单,但是让编译器不去查看额外的代码实际上是相当棘手的,这里有大量的工作要做。我们计划做的一些更具体的事情是:

  • 转换为全保真语法树表示,其中包括空白和注释;
  • 添加“multi-crate”模式,其中单个编译器实例可以同时处理多个编译单元;
  • 使编译器进程持久化,并增加向编译器发送输入文件差异的能力。

所有这些东西都已经在rust-analyzer中实现了,但是是以一种概念验证的方式实现的。有一点比较棘手,就是在不破坏用户代码的情况下,将它们全部移到生产编译器中。

Rust Analyzer尚且只具备内部测试品质,需要从源代码构建:

$ git clone https://github.com/rust-analyzer/rust-analyzer
$ cd rust-analyzer
$ cargo xtask install

感兴趣的读者如果希望开始试验这个新工具,可以查看Rust Analyzer手册

原文链接:

Rust Moving Towards an IDE-Friendly Compiler With Rust Analyzer

  • 发表于:
  • 本文为 InfoQ 中文站特供稿件
  • 首发地址https://www.infoq.cn/article/lvLv4lmcMzTDg7ZTOMdY
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券