Rust 是一個快速、可靠、節約內存的編程語言。在過去六年的 stackoverflow 的最受喜愛的編程語言(2016,2017,2018,2019,2020,2021)中,連續得到榜首的位置。Mozilla 創造了 Rust,Facebook、Apple、Amazon、Microsoft 和 Google 都使用 Rust 去開發系統基礎設施、加密、虛擬化以及其他的層級較低的軟體。
為什麼 Rust 開始替換 Javascript 的 Web 生態系統的重要組成部分包括壓縮(Terser)、編譯(Babel)、格式化(Prettier)、打包(webpack)、代碼檢查(ESLint)、以及更多其他的庫?
Rust 是什麼?
Rust 幫助開發者開發節約內存的快速軟體。它是同樣關注代碼安全、簡潔語法的 C++ 或者 C 的一種現代的替換選擇。
Rust 和 JavaScript 非常不一樣。JavaScript 會去找到不用的變數和對象,然後自動清除它們。這個機制叫做垃圾回收(Garbage Collection)。Rust 則希望開發者自己去規劃手動的內存管理。
通過使用 Rust,開發者對於內存可以有更大的控制權,使用上則比 C++ 或者 Go 要少一些痛苦。
Rust 使用了一種非常獨特的內存管理手段,其核心理念基於 「所有權」(owernership)。基本上,Rust 會追蹤「誰」在讀和寫具體的一塊內存。Rust 知道一塊內存是誰在使用,也知道這塊內存是否已經沒人使用,這時可以立即釋放這塊內存。Rust 在編譯時強制內存規則,這個機制讓內存 bug 幾乎不會存在於運行時(runtime)。你不需要手動追蹤內存,編譯器會幫你處理好。 –Discord
Adoption
除了在上面提到過的使用 Rust 的公司,Rust 也被很多流行的開源庫使用:
- Firecracker (AWS)
- Bottlerocket (AWS)
- Quiche (Cloudflare)
- Neqo (Mozilla)
Rust 讓我們力量倍增,使用 Rust 是我們做的最好的決策之一。除了性能,Rust 關注正確性的工程哲學幫助我們更好的掌控複雜度。我們可以使用 Rust 的類型系統編寫複雜的變數,然後讓 Rust 的編譯器幫我們做檢查。 –Dropbox
從 JavaScript 到 Rust
JavaScript 是最廣泛應用的編程語言,在每一台有瀏覽器的設備上運行著。在過去十年,圍繞著 JavaScript 建立了一個非常巨大的生態系統。
- Webpack: 幫助開發者把多個 JavaScript 文件打包成一個。
- Babel: 幫助開發者使用現代 JavaScript 語法編寫支持老式瀏覽器的程序。
- Terser: 幫助開發者壓縮生成的代碼(用以節省流量和混淆)。
- Prettier: 幫助開發者統一格式化所有的代碼。
- ESLint: 幫助開發者在編寫代碼時自動找出潛在的問題。
像這樣的庫還有很多,成千上萬的代碼以及更多的被修復的 Bug,都成為了當今 Web 應用程序得以順利運行的基石。這個工具都使用 JavaScript 或者 TypeScript 編寫。這個機制運行的是 OK 的,但是我們遇到了 JS 的優化峰值。新一代工具使用了更高效的設計,影響著以前的工具。
SWC
SWC,創建於 2017 年,目標是提供一個可擴展的基於 Rust 的致力於製造下一代快速開發工具的平台。這個工具被一些知名項目使用,比如 Next.js、Parcel 和 Deno,還有一些公司也在使用他,包括 Vercel, ByteDance, Tencent, Shopify。
SWC 可以用來編譯、壓縮、打包,還可以使用插件提供的功能。你可以用這些功能來做代碼變換。上面提到的高級工具,比如 Next.js 也在跑著這些變換。
Deno
Deno,創建於 2018 年,是一個簡單、現代、安全的 JavaScript 和 TypeScript 的運行時。Deno 使用了 V8 以及使用 Rust 開發。Deno 的創始人是 Node.js 的創始人,它企圖替換 Node.js。Deno 在 2020 的五月發布了 1.0 版本。
Deno 的代碼審查器、代碼格式器、文檔生成器都使用 SWC 建造。
esbuild
esbuild,創建於 2020 年 1 月,它是一個用 go 編寫的 JavaScript 打包器,比現存的其他工具快 10-100 倍。
我在嘗試建造一個建造工具:A)在特定的使用場景(打包 JavaScript、TypeScript、也許還有 CSS)使用良好 B)重置開發者社區對於 JavaScript 建造工具速度的期望值。我們現在的工具實在太慢了。 –Evan, esbuild 作者 (Source)
使用系統編程語言、例如 Go 或者 Rust,來建造 JavaScript 的工具,在 esbuild 發布時,還是比較稀少的。個人觀點,esbuild 啟發了非常一大批工具開發者使用系統編程語言,讓這些工具變得更快。Evan 選擇使用 go:
用 Rust 編寫的話,如果給予一定的努力,應該可以運行的也挺好。但是在一個更高的層級,Go 使用起來更有舒服。這個項目對我來說只是一個副業項目,所以它必須有趣。 – Evan, esbuild 作者(Source)
有一些人認為,Rust 可以表現的更好,但是兩者都可以實現 Evan 的目標,以及去影響社區:
即便使用非常基本的優化,Rust 也能比 Go 優化最好的表現要好。用 Rust 寫高性能程序比研究非常高深 Go 要簡單得多。 –Discord
Rome
Rome, 創建於 2020 年 8 月,是一個可以用來針對 JavaScript、TypeScript、HTML、JSON、Markdown 和 CSS 的代碼檢查器、編譯器、打包器、測試器、以及更多的功能。Rome 的願景是替換和統一前端開發的工具鏈。它的作者叫Sebastian,他也開發了 Babel。
為什麼要開發所有東西?
為了讓 Babel 可以作為其他工具的底層基石,要做一些必要的改變,這些改變基本上要完全調整 Babel 的架構。Babel 的架構是我在 2014 年正在學習解析器、語法樹、編譯器的時候做的。 – Sebastian (Source)
Rome 使用 TypeScript 編寫,可以跑在 Node.js 上,但是現在正在用 Rust 重寫。
Rust + WebAssembly
WebAssembly(WASM)是一種 Rust 可以編譯到的便攜低級語言。WASM 跑在瀏覽器里,可以和 JavaScript 互相調用,幾乎所有現代瀏覽器都支持。
WASM 比 JS 快的多,但是沒有原生開發速度快。我們測試來看,Parcel 使用 WASM 比原生開發慢 10-20 倍。 –Devon Govett
WASM 還不是目前最完美的方案,但是依然可以幫助開發者提供更快的體驗。Rust 官方已經承諾更高質量的 WASM 實現。對於開發者來說,意味著你可以享受到 Rust 的性能(相比於 Go),即便你仍然編譯到 Web 上(使用 WASM)。
以下是目前比較早期的庫和框架:
- Yew
- Percy
- Seed
- Sycamore
- Stork
這些基於 Rust 的 web 框架,雖然編譯到 WASM 但是並不計划去替換 JavaScript,而是選擇與 JavaScript 共生。這是我們樂意見到的:Rust 即讓 JavaScript 的功能更快,也能實現面向未來的編譯到 WASM。
一路都是 Rust。
為什麼不用 Rust?
Rust 有非常陡峭的學習曲線。Rust 的抽象層級要比絕大部分 Web 語言低。
Rust 讓你思考你的代碼的方方面面,這對於系統開發是極為重要的。Rust 強制你思考內存是如何共享和拷貝的。Rust 強制你思考少見但是真實的邊緣場景,以確保這些邊緣場景也被控制住了。在任何能提升你效率的地方,Rust 都會幫你。 – Tom MacWright (Source)
Rust 在 Web 社區的使用還是很稀少的。還沒被大規模應用。儘管對於 JavaScript 的工具製造者們,學習 Rust 是一個障礙。但是有趣的是,開發者們寧願使用更快的工具,哪怕他們更難去貢獻代碼(因為 rust 更難)。更快的軟體最終獲得勝利。(天下武功唯快不破)
目前,還是很難找到 Rust 的庫去做大家喜歡的服務(比如鑒權、資料庫、交易等等)。但是我認為,當 Rust 和 WASM 大規模應用以後,這些問題會自己解決的。但是不是現在。我們需要 JavaScript 工具幫助我們搭建一個橋樑,然後慢慢改進性能問題。
JavaScript 工具的未來
我相信,Rust 是 JavaScript 工具的未來。Next.js 12 開始全面使用 SWC 和 Rust 替換 Babel(編譯器)和 Terser(代碼壓縮器)。為什麼呢?
- 擴展性: SWC can be used as a Crate inside Next.js, without having to fork the library or workaround design constraints.
- 性能: 通過使用 SWC,我們獲得了 3 倍的刷新速度和 5 倍的打包速度,而且性能提升仍然有很大的空間。
- WebAssembly: Rust 支持 WASM,對於所有平台都可以支持,也可以帶 Next.js 到任何地方。
- Community: Rust 社區和生態系統非常驚人,還在持續增長。
不僅是 Next.js 使用 SWC,還有:
- Deno』s 的代碼審查器、格式器、文檔生成器都使用 SWC。
- Rome 正在使用 Rust 重寫,計劃使用SWC。
- dprint, 使用 SWC創建,比 Prettier 快 30x 倍。
- Parcel 使用 SWC,改善了 10x 的性能。
Parcel 使用 SWC 就像用一個庫。之前,我們使用 Babel 的解析器,用 JS 編寫。現在我們使用 SWC 的解析器,用 Rust 編寫。包括作用域提升的實現,依賴收集,還有其他。這個和 Deno 製造在 SWC 上面的原理一樣。 –Devon Govett
雖然這是 Rust 的早期使用,有一些重要的點還要在這裡指出來:
- 插件: 用 Rust 寫插件對於大部分 JS 開發者還是比較難的事兒。用 JS 來製造插件體系,會有性能問題。這個問題目前還沒有太好的解決方案。
- 打包: 目前我們感興趣的是 swcpack,這個是 webpack 的替代工具。雖然現在還在開發階段,但是未來可期。
- WebAssembly: 雖然使用 Rust 和編譯到 WASM 看起來很誘人,但是目前還有大量工作需要做。
不管怎樣,我對 Rust 會持續加大影響 JavaScript 生態圈這件事是無比自信的。想像一下全世界使用 Next.js 的項目在打包時已經得到 Rust 帶來的性能好處。然後,你可以像其他 NPM 包一樣,使用 Next.js。
這是我想生活(和開發)的世界。
原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/207921.html
微信掃一掃
支付寶掃一掃