1. Rust VS JS,Rust 已開始滲入前端~

        共 9473字,需瀏覽 19分鐘

         ·

        2021-11-22 21:40

        本文翻譯自:Rust Is The Future of JavaScript Infrastructure – Lee Robinson[1] ,已獲得作者授權(quán),原文略做修改以符合中文語境。

        (圖片鎮(zhèn)樓,與原文無關(guān))

        Rust[2] 是一種快速、可靠、內(nèi)存高效的編程語言。它已經(jīng)連續(xù)六年被評為最受 [3] [4][5] [6] [7] [8] 。它由 Mozilla 創(chuàng)建,現(xiàn)在被 Facebook[9] 、 蘋果[10] 、 亞馬遜[11]微軟[12]谷歌[13] 用于系統(tǒng)基礎(chǔ)設(shè)施、加密、虛擬化和更多底層(low-level)的編程中。

        為什么Rust現(xiàn)在被用來取代 JavaScript 成為 Web 生態(tài)系統(tǒng)的一部分,如壓縮(Terser)、編譯(Babel)、格式化(Prettier)、打包(webpack)、linting(ESLint),以及其他場景?

        什么是Rust?

        Rust 幫助開發(fā)人員編寫運(yùn)行快并高效利用內(nèi)存的軟件。它是 C++ 或 C 等語言的現(xiàn)代替代品,聚焦在代碼安全和簡潔的語法。

        Rust 與 JavaScript 有很大不同。JavaScript 采用的是 垃圾回收[14] 機(jī)制,會(huì)試圖清除不再使用的變量和對象。JavaScript 將開發(fā)者從對手動(dòng)內(nèi)存管理的思考中抽離出來。

        有了 Rust,開發(fā)者對內(nèi)存分配有了更多的控制,而不像 C++ 或 Go 那樣令人痛苦。

        Rust 使用了一種相對獨(dú)特的內(nèi)存管理方法,包含了內(nèi)存“所有權(quán)”的概念?;旧?,Rust 會(huì)記錄誰可以讀取和寫入內(nèi)存。它知道程序什么時(shí)候在使用內(nèi)存,一旦不再需要就立即釋放內(nèi)存。它在編譯時(shí)執(zhí)行內(nèi)存規(guī)則,使得運(yùn)行時(shí)的內(nèi)存錯(cuò)誤幾乎不可能出現(xiàn)。你不需要手動(dòng)跟蹤內(nèi)存。編譯器會(huì)照顧到這一點(diǎn)。

        —— Discord[15]

        Adoption

        在上面提到的公司之外,Rust 還被用于流行的開源庫,比如:

        • Firecracker[16] (AWS)

        • Bottlerocket[17] (AWS)

        • Quiche[18] (Cloudflare)

        • Neqo[19] (Mozilla)

        Rust 一直是我們團(tuán)隊(duì)的力量源泉,押注Rust是我們做出的最好決定之一。除了性能之外,它的人機(jī)工程學(xué)( ergonomics )和對正確性的關(guān)注也幫助我們控制了同步的復(fù)雜性。我們可以在類型系統(tǒng)中對系統(tǒng)的復(fù)雜不變性進(jìn)行編碼,讓編譯器為我們檢查。

        —— Dropbox[20]

        從 JavaScript 到 Rust

        JavaScript 是使用最廣泛的編程語言,存在于每個(gè)有瀏覽器的設(shè)備上。在過去的十年中,圍繞著 JavaScript 已經(jīng)建立了一個(gè)龐大的生態(tài)系統(tǒng):

        • Webpack :開發(fā)者希望將多個(gè) JavaScript 文件 bundle 成一個(gè)文件。

        • Babel :開發(fā)者希望在支持舊版瀏覽器的同時(shí)編寫現(xiàn)代 JavaScript 。

        • Terser :開發(fā)者希望生成盡可能小的文件。

        • Prettier :開發(fā)者希望有一個(gè)有自帶規(guī)則(opinionated)的代碼格式化器,剛好可用就行。

        • ESLint :開發(fā)者希望在部署前發(fā)現(xiàn)他們的代碼存在的問題。

        數(shù)以百萬計(jì)的代碼被編寫出來,甚至更多的 bug 被修復(fù),從而為今天的 Web 應(yīng)用提供了基礎(chǔ)。所有這些工具都是用 JavaScript 或 TypeScript 編寫的。目前已經(jīng)做的很不錯(cuò)了,但我們對 JS 的優(yōu)化已經(jīng)達(dá)到頂峰。因此,這激發(fā)了一類新的工具們的誕生,旨在極大地提高 Web 構(gòu)建的性能。

        SWC

        SWC[21] 創(chuàng)建于 2017 年,一個(gè)下一代快速開發(fā)的工具,是一個(gè)基于 Rust 的可擴(kuò)展平臺(tái)。Next.js、 Parcel 和 Deno 等工具,以及 Vercel、字節(jié)跳動(dòng)、騰訊、Shopify 等公司都在使用它。

        SWC 可用于編譯(compilation)、壓縮(minification)、打包(bundling)等 —— 并且被設(shè)計(jì)成可擴(kuò)展的。你可以調(diào)用它來執(zhí)行代碼轉(zhuǎn)換(無論是內(nèi)置的還是自定義的)。這些轉(zhuǎn)換由更高維度的工具來運(yùn)行,比如 Next.js 。

        Deno

        Deno[22] 創(chuàng)建于 2018 年,是一個(gè)簡單、現(xiàn)代、安全的 JavaScript 和 TypeScript 的運(yùn)行時(shí),Deno 使用 V8[23] 的同時(shí),并以 Rust 構(gòu)建。它試圖取代 Node.js ,由 Node.js 的原作者創(chuàng)建。雖然它是在 2018 年創(chuàng)建的,但直到 2020 年 5月才達(dá)到[24] v1.0[25]

        Deno 的 linter、code formatter 和文檔生成器是使用 SWC 構(gòu)建的[26] 。

        esbuild

        esbuild[27] 創(chuàng)建于 2020 年 1 月,一個(gè)代碼打包和壓縮的工具,它是用 Go 寫的,比當(dāng)今的工具快 10 到 100 倍。

        我試圖創(chuàng)建一個(gè)構(gòu)建工具:

        A)能夠在一個(gè)合理的場景(bundler JavaScript,TypeScript,也許還有CSS)中工作得很好。

        B)能夠重新定義社區(qū)對構(gòu)建工具速度的期望。對于JS快速構(gòu)建工具來說,到底什么才是快?在我看來,我們目前的工具都太慢了。

        —— Evan,Creator of esbuild( Source[28]

        在 esbuild 發(fā)布之前,用系統(tǒng)編程語言(如 Go 和 Rust )構(gòu)建 JavaScript 工具是相當(dāng)小眾的。因此在我看來,esbuild 激發(fā)人們對于讓開發(fā)工具更快的廣泛興趣。Evan 選擇了使用 Go:

        Rust版本也許可以通過足夠的努力使其以同等速度工作。但在高層次上,Go 的工作方式更令人愉快。這是一個(gè) side project ,所以它對我來說必須要有樂趣。

        —— Evan,Creator of esbuild( Source[29]

        有人認(rèn)為 Rust 可以表現(xiàn)得更好,但兩者都可以實(shí)現(xiàn) Evan 最初的目標(biāo),即影響社區(qū):

        即使只是進(jìn)行了基本的優(yōu)化,Rust也能夠勝過超手工調(diào)整的 Go 版本。這是一個(gè)巨大的證明,與我們不得不對 Go 的深入研究相比,用Rust編寫高效程序是多么容易。

        —— Discord[30]

        Rome

        Rome[31] 創(chuàng)建于 2020 年 8 月,包含 linter、compiler、bundler、test runner 以及其它東西,適用于 JavaScript、TypeScript、HTML、JSON、Markdown 和 CSS 。他們的目標(biāo)是取代和統(tǒng)一整個(gè)前端開發(fā)工具鏈。它是由 Sebastian[32] 創(chuàng)建的,他是 Babel 的創(chuàng)建者。

        那么,為什么要重寫一切呢?

        對 Babel 進(jìn)行必要的修改,使其成為其他工具的可靠基礎(chǔ),這絕對需要對所有東西進(jìn)行修改。這個(gè)架構(gòu)與我在 2014 年學(xué)習(xí)解析器、 AST 和編譯器時(shí)做出的最初設(shè)計(jì)選擇是有緊密聯(lián)系的。

        —— Sebastian( Source[33]

        Rome 目前是用 TypeScript 編寫的,在 Node.js 上運(yùn)行。但他們現(xiàn)在正致力于 用 Rust[34] 重寫[35] 。

        NAPI

        Rust 與 Node.js 的整合比其他低級(jí)語言更好。

        napi-rs[36] 允許你用 Rust 構(gòu)建預(yù)編譯的 Node.js add-ons 。它為交叉編譯(cross-compilation)和向 NPM 發(fā)布本地二進(jìn)制文件提供了一個(gè)開箱即用的解決方案,不需要 node-gyp 或使用 postinstall

        相應(yīng)的,你也能輕松構(gòu)建一個(gè)被 Node.js 側(cè)直接調(diào)用的 Rust 模塊,而不需要像 esbuild 那樣創(chuàng)建一個(gè)子進(jìn)程。

        Rust + WebAssembly

        WebAssembly[37] (WASM)是一種可移植的低級(jí)語言,Rust 可以編譯成它。它在瀏覽器中運(yùn)行,可與 JavaScript 互操作,并被所有主要的現(xiàn)代瀏覽器所支持。

        WASM 肯定比 JS 快很多,但還沒有達(dá)到原生速度。在我們的測試中,Parcel 編譯成 WASM 后的運(yùn)行速度比使用本地二進(jìn)制文件慢 10 - 20 倍。

        —— Devon Govett[38]

        雖然 WASM 還不是完美的解決方案,但它可以幫助開發(fā)者創(chuàng)建極快的 Web 體驗(yàn)。Rust 團(tuán)隊(duì) 致力于[39] 實(shí)現(xiàn)高質(zhì)量和先進(jìn)(cutting edge)的 WASM 實(shí)現(xiàn)。對于開發(fā)者來說,這意味著你可以擁有 Rust 的性能優(yōu)勢(相對于 Go ),同時(shí)還可以為 Web 服務(wù)(使用 WASM )。

        這個(gè)領(lǐng)域的一些早期庫和框架:

        • Yew[40]

        • Percy[41]

        • Seed[42]

        • Sycamore[43]

        • Stork[44]

        這些基于 Rust 的、可編譯為 WASM 的 Web 框架并不是要取代 JavaScript,而是要與之一起工作。雖然我們還沒有達(dá)到這個(gè)目的,但看到 Rust 在兩方面都追隨 Web 的發(fā)展是很有趣的:使現(xiàn)有的 JavaScript 工具更快,并在未來提出 編譯到 WASM[45] 的想法。

        這就是 Rust 之后的路。

        為什么不選擇 Rust ?

        Rust 有一個(gè)陡峭的學(xué)習(xí)曲線。它的抽象程度比大多數(shù) Web 開發(fā)者所習(xí)慣的要低。

        Rust 會(huì)迫使你思考你代碼中對系統(tǒng)編程方面具有很大影響的部分。它讓你思考內(nèi)存是如何共享或復(fù)制的。它讓你思考真實(shí)但不可能發(fā)生的邊界問題,并確保它們得到處理。它可以幫助你寫出在所有可能的方面都非常高效的代碼。

        —— Tom MacWright ( Source[46] )

        此外,Rust 在網(wǎng)絡(luò)社區(qū)的使用仍然是小眾的。它還沒有達(dá)到技術(shù)選型臨界點(diǎn)(critical adoption)。即使學(xué)習(xí) Rust 的 JavaScript 工具會(huì)有一定的門檻,但有趣的是,開發(fā)者寧愿擁有一個(gè) 更快、更難參與貢獻(xiàn)[47] 的工具。唯快不破[48](Fast software wins)[49]

        目前,你很難為你喜歡的服務(wù)(如登錄鑒權(quán)、數(shù)據(jù)庫、支付等工作)找到一個(gè) Rust 庫或框架。我確實(shí)認(rèn)為,一旦 Rust 和 WASM 達(dá)到技術(shù)選型臨界點(diǎn)(critical adoption),這個(gè)問題會(huì)自行解決。但現(xiàn)在還不行。我們需要現(xiàn)有的 JavaScript 工具來幫助我們縮小差距,并逐步采用性能改進(jìn)。

        JavaScript 工具化的未來

        我相信 Rust 是 JavaScript 工具化的未來。Next.js 12[50] 已經(jīng)開始了我們的轉(zhuǎn)型,用 SWC 和 Rust 完全取代 Babel(transpilation)和 Terser(壓縮)。為什么會(huì)有這樣的選擇?

        • 可擴(kuò)展性(Extensibility) 。SWC 可以作為 Next.js 內(nèi)部的一個(gè) Crate 使用,而無需 fork 其它庫或面臨設(shè)計(jì)上的限制(workaround design constraints)。

        • 性能(Performance) 。通過改用 SWC ,我們在 Next.js 中實(shí)現(xiàn)了約 3 倍的刷新速度(Fast Refresh)和約 5 倍的構(gòu)建速度,還有更多的優(yōu)化正在進(jìn)行。

        • WebAssembly 。Rust 對 WASM 的支持,使得 Next.js 可以支持所有可能的平臺(tái),讓 Next.js 遍布所有的地方。

        • 社區(qū)(Community) 。Rust 社區(qū)和生態(tài)系統(tǒng)是驚人的,而且還在不斷增長。

        在逐步使用 SWC 的絕不僅僅是 Next.js:

        • Deno[51] linter、代碼格式化器和文檔生成器都是用 SWC 構(gòu)建的[52]

        • Rome[53] 正在 用 Rust 重寫[54] ,并計(jì)劃使用 SWC 。

        • dprint[55] ,建立在 SWC 之上,一個(gè)快 30 倍的用于替代 Prettier 的代碼格式化工具。

        • Parcel[56] 使用 SWC 將整體構(gòu)建性能 提高了 10 倍[57]

        Parcel 像一個(gè)庫一樣使用 SWC 。之前我們使用 Babel 的解析器和用 JS 編寫的自定義轉(zhuǎn)換?,F(xiàn)在,我們使用 SWC 的解析器和 Rust 中的 自定義轉(zhuǎn)換[58] 。這包括一個(gè)全局 hoisting 的實(shí)現(xiàn)、依賴性收集等。它的范圍類似于 Deno 在 SWC 之上的構(gòu)建方式。

        —— Devon Govett[59]

        現(xiàn)在是 Rust 的早期階段 —— 有幾個(gè)重要的部分還在摸索之中:

        • 插件(Plungins) 。對于許多 JavaScript 開發(fā)者來說,用 Rust 編寫插件并不是那么容易的。同時(shí),在 JavaScript 中暴露一個(gè)插件系統(tǒng)可能會(huì)否定性能的提升。目前還沒有一個(gè)明確的解決方案。

        • 打包(Bundling) 。一個(gè)有趣的發(fā)展領(lǐng)域是 swcpack ,它是 SWC 對 Webpack 的替代。它仍在開發(fā)中,但可能是非常有前途的。

        • WebAssembly 。如上所述,編寫 Rust 并編譯成 WASM 的前景很誘人,但仍有工作要做。

        不管怎么說,我相信 Rust 會(huì)在未來 1 - 2 年以及未來繼續(xù)對 JavaScript 生態(tài)系統(tǒng)產(chǎn)生重大影響。想象一下這樣一個(gè)世界:Next.js 中使用的所有構(gòu)建工具都是用 Rust 編寫的,給你帶來最佳性能。然后,Next.js 可以作為一個(gè) 靜態(tài)二進(jìn)制文件[60] (static binary)分發(fā),你可以從 NPM 下載。

        這就是我想生活(和建設(shè))的世界。


        感謝Devon Govett[61] 審閱本文的早期草稿。

        全文完



        往期推薦


        2021 TWeb 騰訊前端技術(shù)大會(huì)精彩回顧(附PPT)
        面試題:說說事件循環(huán)機(jī)制(滿分答案來了)
        專心工作只想搞錢的前端女程序員的2020

        最后


        • 歡迎加我微信,拉你進(jìn)技術(shù)群,長期交流學(xué)習(xí)...

        • 歡迎關(guān)注「前端Q」,認(rèn)真學(xué)前端,做個(gè)專業(yè)的技術(shù)人...

        點(diǎn)個(gè)在看支持我吧

        參考資料

        [1]

        Rust Is The Future of JavaScript Infrastructure – Lee Robinson: https://leerob.io/blog/rust

        [2]

        Rust: https://www.rust-lang.org/

        [3]

        歡: https://insights.stackoverflow.com/survey/2016#technology-most-loved-dreaded-and-wanted

        [4]

        迎: https://insights.stackoverflow.com/survey/2017#most-loved-dreaded-and-wanted

        [5]

        編: https://insights.stackoverflow.com/survey/2018#technology-_-most-loved-dreaded-and-wanted-languages

        [6]

        程: https://insights.stackoverflow.com/survey/2019#technology-_-most-loved-dreaded-and-wanted-languages

        [7]

        語: https://insights.stackoverflow.com/survey/2019#technology-_-most-loved-dreaded-and-wanted-languages

        [8]

        言: https://insights.stackoverflow.com/survey/2020#most-loved-dreaded-and-wanted

        [9]

        Facebook: https://engineering.fb.com/2021/04/29/developer-tools/rust/

        [10]

        蘋果: https://twitter.com/oskargroth/status/1301502690409709568

        [11]

        亞馬遜: https://aws.amazon.com/blogs/opensource/why-aws-loves-rust-and-how-wed-like-to-help/

        [12]

        微軟: https://twitter.com/ryan_levick/status/1171830191804551168

        [13]

        谷歌: https://security.googleblog.com/2021/04/rust-in-android-platform.html

        [14]

        垃圾回收: https://en.wikipedia.org/wiki/Garbage_collection_(computer_science)

        [15]

        —— Discord: https://blog.discord.com/why-discord-is-switching-from-go-to-rust-a190bbca2b1f

        [16]

        Firecracker: https://github.com/firecracker-microvm/firecracker

        [17]

        Bottlerocket: https://github.com/bottlerocket-os/bottlerocket

        [18]

        Quiche: https://github.com/cloudflare/quiche

        [19]

        Neqo: https://github.com/mozilla/neqo

        [20]

        —— Dropbox: https://dropbox.tech/infrastructure/rewriting-the-heart-of-our-sync-engine

        [21]

        SWC: http://swc.rs/

        [22]

        Deno: https://deno.land/

        [23]

        V8: https://v8.dev/

        [24]

        5月才達(dá)到: https://deno.com/blog/v1

        [25]

        v1.0: https://deno.com/blog/v1

        [26]

        SWC 構(gòu)建的: https://twitter.com/devongovett/status/1369033422002389000

        [27]

        esbuild: https://esbuild.github.io/

        [28]

        Source: https://news.ycombinator.com/item?id=22336334

        [29]

        Source: https://news.ycombinator.com/item?id=22336284

        [30]

        —— Discord: https://blog.discord.com/why-discord-is-switching-from-go-to-rust-a190bbca2b1f

        [31]

        Rome: https://rome.tools/blog/2020/08/08/introducing-rome

        [32]

        Sebastian: https://twitter.com/sebmck

        [33]

        Source: https://rome.tools/blog/2020/08/08/introducing-rome

        [34]

        用 Rust: https://twitter.com/rometools/status/1422616144763097091

        [35]

        重寫: https://twitter.com/rometools/status/1422616144763097091

        [36]

        napi-rs: https://napi.rs/

        [37]

        WebAssembly: https://webassembly.org/docs/use-cases/

        [38]

        Devon Govett: https://twitter.com/devongovett

        [39]

        致力于: https://www.rust-lang.org/what/wasm

        [40]

        Yew: https://yew.rs/

        [41]

        Percy: https://github.com/chinedufn/percy

        [42]

        Seed: https://github.com/seed-rs/seed

        [43]

        Sycamore: https://github.com/sycamore-rs/sycamore

        [44]

        Stork: https://stork-search.net/

        [45]

        編譯到 WASM: https://rustwasm.github.io/docs/book/introduction.html

        [46]

        Source: https://macwright.com/2021/01/15/rust.html

        [47]

        更快、更難參與貢獻(xiàn): https://twitter.com/devongovett/status/1261379312898306048

        [48]

        唯快不破: https://craigmod.com/essays/fast_software/

        [49]

        Fast software wins): https://craigmod.com/essays/fast_software/

        [50]

        Next.js 12: http://nextjs.org/12

        [51]

        Deno: https://deno.land/

        [52]

        SWC 構(gòu)建的: https://twitter.com/devongovett/status/1369033422002389000

        [53]

        Rome: https://rome.tools/

        [54]

        用 Rust 重寫: https://twitter.com/rometools/status/1422616144763097091

        [55]

        dprint: https://github.com/devongovett/dprint-node

        [56]

        Parcel: https://parceljs.org/

        [57]

        提高了 10 倍: https://v2.parceljs.org/blog/beta3/

        [58]

        自定義轉(zhuǎn)換: https://github.com/parcel-bundler/parcel/tree/v2/packages/transformers/js/core/src

        [59]

        Devon Govett: https://twitter.com/devongovett

        [60]

        靜態(tài)二進(jìn)制文件: https://en.wikipedia.org/wiki/Static_build

        [61]

        Devon Govett: https://twitter.com/devongovett

        [62]

        https://live.juejin.cn/4354/rescript-lang: https://live.juejin.cn/4354/rescript-lang


        瀏覽 105
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評論
        圖片
        表情
        推薦
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
          
          

            1. 娇妻享受多p混交 | 黑人欧美激情无码乱妇 | 国产精品入口日韩视频大尺度 | 免费扣逼视频 | 成年人黄色视频在线观看 |