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 尚且只具备内部测试品质,需要从源代码构建:

复制代码

$gitclonehttps://github.com/rust-analyzer/rust-analyzer
$cdrust-analyzer
$cargo xtask install

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

原文链接:

Rust Moving Towards an IDE-Friendly Compiler With Rust Analyzer

我来评几句
登录后评论

已发表评论数()

相关站点

+订阅
热门文章