將 Rust 編譯成 WASI

https://benw.is/posts/compiling-rust-to-wasi

最近我一直在休息一下,暫停建立和使用 Rust 編譯成 Webassembly 目標 wasm32-unknown-unknown,而是花了很多時間工作於 Rust 編譯成 WASI,或者 wasm32_wasi 目標。

你可能會被原先的兩者的區別搞混,它們兩者都是 Webassembly 對吧?答案是是,但它們在幾個關鍵的方面是不同的。我喜歡把 wasm32-unknown-unknown 比擬為沒有標準函式庫。它無法訪問 Webassembly 虛擬機之外的任何東西。文件訪問、網絡請求或者核心的標準呼叫在傳統方式下都將不可用。這個目標受到瀏覽器的支持,Leptos 就是用於客戶端互動的。

wasm32-wasi 是 wasm32-unknown-unknown 加上缺失的傳統功能。它重新實現了像讀( read() )之類的傳統系統呼叫,並提供了 C 所需的事物,例如 File*物件。它還修復了和 wasm32-unknown-unknown 之間關鍵的 ABI 不相容性,因為 wasm-bindgen 使用的 ABI 出現了一個錯誤,這已經成為了 Rust 的標準。如果你想知道更多關於這個,可讀下去,否則你可以略過到下一節。我花了太多時間來弄清楚這個問題,所以你們也必須知道。

很久以前,當 Rust 的 Webassembly 支持尚在起步階段時,負責開發的 Rust 開發者在對待 structs 中的問題時犯了一個錯誤。LLVM 和 Clang 認為通過值傳遞的 struts 應該是內聯的欄位,而對於 Rust 來說,它應該通過指針來傳遞。當你的 Rust 代碼與 C 互動並進行這一點時,這就成了問題。無論是否與 Rust 一起編譯或作為單獨的 C Webassembly 模塊編譯到 emscripten,這個問題就會出現。

這也是為什麼 Rust 代碼編譯成 wasm32_wasi 和 wasm32-unknown-emscripten 可能會難以互相通信的原因之一。

在某個時刻,這個問題被解決了,為了 Rust 的 C ABI,但是修復 wasm32-unknown-unknown 目標將會破壞與使用 wasm-bindgen 編譯成 webassembly 的 Rust 應用程序的兼容性。這讓我們陷入了一個困境。wasm-bindgen 現在對新 ABI 具有了前向兼容性,這意味著它不再存在問題,但如何在 Rust 生態系統中引入這一點一直是爭論的焦點。你應該創建一個新的目標,比如 wasm32-unknown-unknown2 嗎?某一天切換它?在版本邊界上切換它?

至少目前,Rust 已經決定將來會納入一個不穩定的標識來通過切換到現有的 C ABI 來修復這個 ABI。它的 PR 在這裡, MCP 已經批准,所以它可能會在將來的某個時間內納入語言中。這是個好消息。避免通過 ABI 邊界傳遞任何 structs 是另一個選項,但需要編輯所有相關方的內容。我個人對於編輯所有可能要使用的 C 依賴並不感興趣,但你可以自行決定。

作爲一個有趣的事實,wasm32-wasi 和 wasm32-unknown-emscripten 目標已經解決了這種不相容性。我想第一個是足夠新,第二個是未知/專門建造的,所以認爲這樣做是合適的。對於 wasm32-wasi,這就是解決的方法。

Webassembly 和 WASI 的一個賣點是,編譯到這樣的東西應該是可移植的,但是每種語言的 ABI 規範都由語言本身決定。也許是因為 C 是最大/最古老的語言,我們似乎圍繞著 C/Clang/llvm 的決定。這可能會有其他影響,正如這篇有意思的文章所描述的現有系統。無論如何,Rust 的人似乎尚未完全地承諾這一點,Rust 編譯成 Webassembly 的 “wasm” ABI 選項正在酝酿中,關於其他語言,我不確定是什麼樣的。

現在你們已經學到了關於 Webassembly 和 Rust 中的 Webassembly 的許多知識(或者直接跳轉到這裡),讓我們談談構建一個包。我的旅程是出於我想在我的博客上寫更好的編輯器開始的。為此,我使用了 femark,這是一個我結合了 treesitter 和 pulldown-cmark 的 crate,用於將 markdown 編譯為帶有語法高亮的 HTML。唯一的問題是,treesitter(以及它的解析器)是用 C/C++ 編寫的。

在歷史上,我一直在服務器上進行 HTML 轉換,這樣 crate 就可以很容易地被 Rust 編譯。這一次我意識到,為了獲得預覽體驗,我必須在瀏覽器中運行它。我很高興地說,在經過了很多操縱之後,我終於做到了這一點,得益於 Joel Dice 和 WASI Zulip 上的幾位可愛的人。

via Hacker News

March 20, 2024 at 07:50PM

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *