選單

【Linux Plumbers 大會總結】Rust 和 GCC 整合的兩種方式

原文:  Rust and GCC, two different ways[1]

作者:

Jonathan Corbet

在或等語言中工作的開發者可以使用兩種相互競爭的編譯器: 和。它們中的任何一種通常都可以完成工作。不過, 的開發者目前只能使用基於的編譯器。雖然工作得很好,但開發者也有合理的理由希望有一個替代品。事實證明,有兩種不同的方法可以使用編譯,雖然目前都還沒有準備好。這兩種方法的開發者都來到了2021年的 Linux Plumbers 大會[2],介紹他們的工作狀況。

是為 Rust 編譯器新增 GCC 後端; ,是為 前端 新增語言實現。

rustc_codegen_gcc

首先是 Antoni Boucher,他講述了rustc_codegen_gcc[3]專案。他開始說,編譯器是基於的,除此之外,這意味著它不支援所支援的所有體系結構。有的,也有,但它有一個,可以插入一個替代的程式碼生成器。這個可以用來透過`libgccjit`[4]插入的程式碼生成機制。這就是 所採取的方法。

為什麼這會是一件有用的事情呢?Boucher說, 語言越來越受歡迎,但它需要對所能提供的更多架構的支援。特別是的工作突出了這個問題,但也有很多其他使用者在那裡。嵌入式系統的開發者會從更好的架構支援中受益,瀏覽器也是如此。

現在支援許多特性,包括基本和聚合型別、變數、函式、原子型別、執行緒本地儲存、內聯彙編、許多內部函式等等。該編譯器在Compiler Explorer[5]中得到了支援。測試通過了,大部分的使用者介面測試也通過了。作為一個實驗,這個編譯器已經被用來為架構構建程式碼;這項工作仍處於早期階段,Boucher 說,但它表明確實有可能為不支援的平臺構建程式。

仍然有一些問題需要解決。一些屬性仍然需要支援,除錯資訊的生成也是如此。生成的程式碼質量並不總是最好的。必須做更多的工作來支援新的體系結構。還不支援連結時最佳化(),等等。這項工作也需要對進行一系列的修改,其中大部分仍在審查中。

還有一些其他的問題,包括需要使用的補丁版本,直到所有的修改都被合併到上游。即便如此,也需要回傳這些補丁,以允許使用較早的版本,這對於編譯核心是很重要的。

即便如此,這個專案似乎已經取得了合理的進展。Boucher 指出,曾經有一個活躍的Pull Request[6],要把新增到rustc編譯器中, 它已經在 9月29日被合併了。

Native GCC

Philip Herron 接著談到了 的本地前端,也就是。這個編譯器不是和的混合體,而是工具鏈中語言的完整實現。這項工作是用編寫的(更容易啟動,他說),並打算成為主線的一部分。它使用現有的,並重新使用官方的庫(如libcore、libstd和libproc)。

演講者再次提出了 “為什麼?”的問題。他說,他喜歡大專案,所以這個專案看起來很有吸引力。它與中的問題解決方式形成了有趣的對比,也是一個很好的機會,可以看到是如何處理一種現代的高階語言。一旦工作完成,在程式碼大小、暫存器分配和能源效率方面對結果進行比較將會很有幫助。

他說,有一個獨立的實現,會有很多好處。與的緊密結合將對一些專案很有幫助,這些專案也將能夠從外掛中受益。基於的編譯器將使在新平臺上的啟動更加容易。對連結時最佳化的支援應該得到改善,這種最佳化在混合編譯器的情況下往往效果不佳。當然,也會帶來對更多目標架構的支援。

Herron 說,支援的工作早在 2014 年就開始了,但後來停滯不前;該語言的發展速度太快,的開發者無法跟上它。這項工作後來在 2019 年重新啟動;最近對用於核心的興趣正在幫助推動這個專案。包括開源安全和Embecosm 在內的多家公司正在支援以為基礎的編譯器的開發。有一個詳細的計劃,即在 2022 年底前釋出一個 “最小可行產品(MVP) ”編譯器。

到目前為止,對核心資料結構和大多數控制流都有工作支援,儘管一些控制流的工作仍在進行中。泛型和特質解析工作。未來的工作包括宏、匯入、未穩定的特性和內部函式。有趣的是,目前的編譯器可以構建 “hello world”,但它需要使用Unsafe 的程式碼;缺乏宏意味著不可用,必須呼叫語言的函式來代替。

計劃在未來進一步開展的工作包括借用檢查器,這將與`Polonius`[7]專案合作完成。增量編譯也在列表中,還有將前端移植到舊的版本。從長遠來看,希望這項工作能夠幫助推動編譯器的相容性測試。

這些會談的影片可以在YouTube[8]上找到。

參考資料[1]

https://lwn。net/SubscriberLink/871283/c437c1364397e70e/:https://lwn。net/SubscriberLink/871283/c437c1364397e70e/

[2]

2021年的 Linux Plumbers 大會:https://linuxplumbersconf。org/

[3]

rustc_codegen_gcc:https://github。com/antoyo/rustc_codegen_gcc

[4]

:https://gcc。gnu。org/onlinedocs/jit/

[5]

Compiler Explorer:https://godbolt。org/

[6]

活躍的Pull Request:https://github。com/rust-lang/rust/pull/87260

[7]

:https://github。com/rust-lang/polonius

[8]

YouTube:https://www。youtube。com/watch?v=ORwYx5_zmZo&t=1h27m48s