️前端研發的新基礎設施 - Rust

作者:伍林輝(五靈) 阿里交付技術團隊

最開始關注到 Rust ️,是因為 Atom 團隊放棄維護 Atom,轉身投入到一個新的輕量級、更快的編輯器 Zed 的開發,而這個編輯器最大的特點就是將全部基於 Rust 來構建。而為什麼基於 Rust 來開發可以更快呢,這成功吸引了我的好奇心,也是寫這篇文章的原因。

這兩年 Rust 正在快速佔領前端基礎設施領域,Webpack、Babel、Prettier 這些熱門工具都已有了 Rust 替代方案,且性能有着 10~100 倍的提升。亞馬遜和 FaceBook 都認可它是其系統中 C / C++ 的最佳替代品,微軟更是認為 Rust 作為工業級的開發語言,在雲的基礎設施領域應該是首選。Figma、Dropbox 也已經在客戶端中使用 Rust。甚至有說法:任何能夠用 Rust 實現的應用系統,最終都必將用 Rust 實現。

在今年的 StackOverflow 開發者調查中,Rust 連續 7 年成為最受開發者喜歡的語言。但是 Rust 並不止於此,在相關領域有更多的應用,讓我們先看看 Rust 在相關領域的應用,再來關注為什麼大家都不約而同地選擇了 Rust。

一、Rust 在相關領域的應用

1.1 前端基礎設施領域

  • SWC: (Speedy Web Compiler) 基於 Rust 的前端構建工具,可以理解為 Rust 版本的 Babel,但是性能有 10 倍提升。目前被 Next.js、Deno 使用。
  • Tauri:Tauri 是目前最流行的 Electron 替代方案,通過使用 Rust 和 Webview2 成功解決了 Electron 的包體積大和內存佔用高的問題。具體可以參見底部參考文章,微軟為什麼最終放棄了 Electron。相信 Atom 團隊也是看到了 Tauri 的成功,才決定基於 Rust 去做 Zed 編輯器。
  • Rome:可以理解為 Babel 作者的新作品,Rome 旨在取代許多現有的 JavaScript 工具,集代碼檢測、打包、編譯、測試等功能於一身。
  • Parcel:零配置構建工具,特點是快速編譯和不需要配置

1.2 數據可視化領域

  • Wgpu:是 WebGPU API 標準的 Rust 實現。WebGPU 是由 W3C 發布的規範,目標是讓網頁代碼能安全可靠地訪問 GPU 功能。其實現方式借鑒了 Vulkan API,會翻譯到宿主硬件所用的各式 API(如 DirectXMetalVulkan 等)上執行。
  • Bevy:基於 Rust 語言開發,數據驅動的遊戲引擎。同時支持 2D 和 3D 圖形渲染,以及圖可視化的渲染。
  • Cube.js: cube.js 是開源的 BI 分析工具框架,其中的 Cube Store 用於分析查詢的性能優化以及通過跨數據庫連接的數據聯合等附加功能,就是由 Rust 來實現的。

Rust 的高性能以及與 WebAssembly 結合,是非常適合用在需要大數據量處理的數據可視化領域的。

1.3 Rust 和 Node 生態

  • Deno:Deno 是一個簡單、先進且安全的 JavaScript 和 TypeScript 運行時環境,其基於 V8 引擎並採用 Rust 編程語言構建。
  • Napi-rs:用 Rust 和 N-API 開發高性能 Node.js 擴展,可以替代之前用 C++ 開發的 Node.js 擴展

1.4 Web3 領域

由於 Web3 協議在處理數千萬個不可信輸入時需要快速且強大的性能,Rust 具有明顯的優勢。可以以很好的性能處理功能複雜的任務,同時還減少了與內存、邊界、空變量、初始化變量或整數溢出相關的錯誤。
使用 Rust 創建更強大的 DApp(分布式應用),它可以減少許多常見的錯誤,使 DApp 在發布後按預期運行。Rust 的性能優勢和安全性,使得 Rust 成為 Web3 應用程序的理想選擇。其中幣安的撮合引擎就是以 Rust 作為主語言,Solana 社區更是有很多基於 Rust 開發的 DApp。

1.5 Rust 作為汽車軟件主語言探索

Rust 的硬實時性和完美的內存機制,同樣適合汽車場景的軟件開發,在 RustChinaConf 上就有國汽智控關於 Rust 在汽車軟件開發的探索分享。

二、Rust 的優勢

早在 2015 年,Mozilla 員工就發布了 Rust,它是一種專註於安全和性能的多範式編程語言,其構建考慮到了速度和效率,這意味着它可以提供零成本的抽象、繼承和功能特性。

Rust 幫助開發者開發節約內存的快速軟件。它是同樣關注代碼安全、簡潔語法的 C++ 或者 C 的一種現代的替換選擇。
Rust 和 JavaScript 非常不一樣。JavaScript 會去找到不用的變量和對象,然後自動清除它們。這個機制叫做垃圾回收,Rust 希望開發者自己去規劃手動的內存管理。

2.1 高性能

所有程序都必須管理其運行時使用計算機內存的方式。一些語言(比如:JavaScript)中具有垃圾回收機制,在程序運行時不斷地尋找不再使用的內存,在另一些語言中,程序員必須親自分配和釋放內存。
Rust 則選擇了第三種方式:通過所有權系統管理內存,編譯器在編譯時會根據一系列的規則進行檢查。如果違反了任何這些規則,程序都不能編譯。正是這種內存管理機制,使得 Rust 有驚人的內存利用率。

let s1 = String::from("hello");
let s2 = s1;   // s2 借用了 s1, s1 不再有效

println!("{}, world!", s1); // 這裡 Rust 會報錯,s1 是無效的引用

2.2 可靠性

Rust 豐富的類型系統和所有權模型保證了內存安全和線程安全,讓你在編譯期就能夠消除各種各樣的錯誤。

  • 內存安全:通常內存不安全的情況包含:空指針、野指針、懸空指針、使用未初始化的指針、非法釋放、緩衝區溢出、執行非法函數指針、數據競爭等。Rust 通過所有權系統管理內存,編譯器在編譯時會根據一系列的規則進行檢查,如果違反了任何這些規則,程序都不能編譯。
  • 線程安全:線程安全是程序設計中的術語,指某個函數、函數庫在多線程環境中被調用時,能夠正確地處理多個線程之間的共享變量,使程序功能正確完成。Rust 通過一整套基礎設施和類型檢查,強迫這些線程問題暴露在編譯階段,相比花費大量時間嘗試重現運行時並發 bug 出現的特定情況,Rust 會拒絕編譯不正確的代碼並提供解釋問題的錯誤信息。

三、Rust 陡峭的學習曲線

Rust 有一個陡峭的學習曲線,這也是目前 Rust 在大規模使用中面臨的困難。很多朋友會開玩笑說 Rust 入門並不難,我已經入門億次了。
網上流傳的一個段子,很形象的講述了 Rust 的技術複雜度。

小王是一個大型項目下的 C++ 工程師,今天他上班觸發了一個全量編譯便回家了,明天再來。
小張是一個深度神經網絡Python 工程師,今天他上班改了一個參數開始訓練便回家了,三天後再來。
小李是一名資深的 Rust 工程師,今天他上班只花了一小時就完成了需求的開發。
然後連續加班了三個晚上才使得編譯通過。

圖為 Rust 的學習曲線:

隨着前端基礎設施逐漸被Rust化,Rust在前端基礎設施的研發工作中愈發重要,招聘時也會越來越看重 Rust。
在前端工具的各項對比中,使用 Rust 改造都得到了 10 倍以上的性能提升。Rust 成為前端研發的基礎設施已經是不可阻擋的趨勢,可以從現在開始學習,一起吃 Rust 這隻螃蟹 ️。

附錄鏈接

[01] 微軟關於雲安全性的文章,最佳工業級應用產品:Microsoft: Rust Is the Industry’s ‘Best Chance’ at Safe Systems Programming – The New Stack

[02] Rust 是 JavaScript 基礎設施的未來 Rust 是 JavaScript 基礎設施的未來

[03] 僅僅過去 4 年,微軟最終放棄了 Electron 僅僅過去 4 年,微軟最終放棄了 Electron

[04] Solidity、Go、Haskell、Rust,Web3 開發者掌握哪種編程語言更具優勢?Solidity、Go、Haskell、Rust,Web3 開發者掌握哪種編程語言更具優勢? - Foresight News

[05] Rust是未來前端基礎設施:GitHub - i5ting/rust-fe: Rust是未來前端基礎設施