摘要:rust-analyzer 是一個尚處於試驗階段的 IDE/ 面向延遲的編譯器。Rust Analyzer 是一個實驗性的 IDE(面向延遲的 Rust 編譯器)。

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

相關文章