午夜视频在线网站,日韩视频精品在线,中文字幕精品一区二区三区在线,在线播放精品,1024你懂我懂的旧版人,欧美日韩一级黄色片,一区二区三区在线观看视频

分享

Rust 是 JavaScript 基礎(chǔ)設(shè)施的未來(lái)

 菌心說(shuō) 2022-01-21

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

以下文章來(lái)源于ByteDance Web Infra ,作者sinoon

文章圖片1

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

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

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

什么是Rust?

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

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

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

Rust 使用了一種相對(duì)獨(dú)特的內(nèi)存管理方法,包含了內(nèi)存“所有權(quán)”的概念。基本上,Rust 會(huì)記錄誰(shuí)可以讀取和寫(xiě)入內(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 還被用于流行的開(kāi)源庫(kù),比如:

  • Firecracker[16] (AWS)
  • Bottlerocket[17] (AWS)
  • Quiche[18] (Cloudflare)
  • Neqo[19] (Mozilla)

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

—— Dropbox[20]

從 JavaScript 到 Rust

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

  • Webpack :開(kāi)發(fā)者希望將多個(gè) JavaScript 文件 bundle 成一個(gè)文件。
  • Babel :開(kāi)發(fā)者希望在支持舊版瀏覽器的同時(shí)編寫(xiě)現(xiàn)代 JavaScript 。
  • Terser :開(kāi)發(fā)者希望生成盡可能小的文件。
  • Prettier :開(kāi)發(fā)者希望有一個(gè)有自帶規(guī)則(opinionated)的代碼格式化器,剛好可用就行。
  • ESLint :開(kāi)發(fā)者希望在部署前發(fā)現(xiàn)他們的代碼存在的問(wèn)題。

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

SWC

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

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

Deno

Deno[22] 創(chuàng)建于 2018 年,是一個(gè)簡(jiǎn)單、現(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 寫(xiě)的,比當(dāng)今的工具快 10 到 100 倍。

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

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

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

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

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

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

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

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

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

—— 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è)前端開(kāi)發(fā)工具鏈。它是由 Sebastian[32] 創(chuàng)建的,他是 Babel 的創(chuàng)建者。

那么,為什么要重寫(xiě)一切呢?

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

—— Sebastian( Source[33]

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

NAPI

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

napi-rs[36] 允許你用 Rust 構(gòu)建預(yù)編譯的 Node.js add-ons 。它為交叉編譯(cross-compilation)和向 NPM 發(fā)布本地二進(jìn)制文件提供了一個(gè)開(kāi)箱即用的解決方案,不需要 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í)語(yǔ)言,Rust 可以編譯成它。它在瀏覽器中運(yùn)行,可與 JavaScript 互操作,并被所有主要的現(xiàn)代瀏覽器所支持。

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

—— Devon Govett[38]

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

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

  • Yew[40]
  • Percy[41]
  • Seed[42]
  • Sycamore[43]
  • Stork[44]

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

這就是 Rust 之后的路。

為什么不選擇 Rust ?

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

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

—— Tom MacWright ( Source[46] )

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

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

JavaScript 工具化的未來(lái)

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

  • 可擴(kuò)展性(Extensibility) 。SWC 可以作為 Next.js 內(nèi)部的一個(gè) Crate 使用,而無(wú)需 fork 其它庫(kù)或面臨設(shè)計(jì)上的限制(workaround design constraints)。
  • 性能(Performance) 。通過(guò)改用 SWC ,我們?cè)?Next.js 中實(shí)現(xiàn)了約 3 倍的刷新速度(Fast Refresh)和約 5 倍的構(gòu)建速度,還有更多的優(yōu)化正在進(jìn)行。
  • WebAssembly 。Rust 對(duì) WASM 的支持,使得 Next.js 可以支持所有可能的平臺(tái),讓 Next.js 遍布所有的地方。
  • 社區(qū)(Community) 。Rust 社區(qū)和生態(tài)系統(tǒng)是驚人的,而且還在不斷增長(zhǎng)。

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

  • Deno[51] linter、代碼格式化器和文檔生成器都是用 SWC 構(gòu)建的[52] 。
  • Rome[53] 正在 用 Rust 重寫(xiě)[54] ,并計(jì)劃使用 SWC 。
  • dprint[55] ,建立在 SWC 之上,一個(gè)快 30 倍的用于替代 Prettier 的代碼格式化工具。
  • Parcel[56] 使用 SWC 將整體構(gòu)建性能 提高了 10 倍[57] 。

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

—— Devon Govett[59]

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

  • 插件(Plungins) 。對(duì)于許多 JavaScript 開(kāi)發(fā)者來(lái)說(shuō),用 Rust 編寫(xiě)插件并不是那么容易的。同時(shí),在 JavaScript 中暴露一個(gè)插件系統(tǒng)可能會(huì)否定性能的提升。目前還沒(méi)有一個(gè)明確的解決方案。
  • 打包(Bundling) 。一個(gè)有趣的發(fā)展領(lǐng)域是 swcpack ,它是 SWC 對(duì) Webpack 的替代。它仍在開(kāi)發(fā)中,但可能是非常有前途的。
  • WebAssembly 。如上所述,編寫(xiě) Rust 并編譯成 WASM 的前景很誘人,但仍有工作要做。

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

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


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

全文完


參考資料

[1]Rust Is The Future of JavaScript Infrastructure – Lee Robinson: https:///blog/rust

[2]Rust: https://www./

[3] https://insights./survey/2016#technology-most-loved-dreaded-and-wanted

[4]https://insights./survey/2017#most-loved-dreaded-and-wanted

[5]https://insights./survey/2018#technology-_-most-loved-dreaded-and-wanted-languages

[6]https://insights./survey/2019#technology-_-most-loved-dreaded-and-wanted-languages

[7]https://insights./survey/2019#technology-_-most-loved-dreaded-and-wanted-languages

[8]https://insights./survey/2020#most-loved-dreaded-and-wanted

[9]Facebook: https://engineering./2021/04/29/developer-tools/rust/

[10]蘋(píng)果:
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./2021/04/rust-in-android-platform.html

[14]垃圾回收:
https://en./wiki/Garbage_collection_(computer_science)

[15]—— Discord: https://blog./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:///infrastructure/rewriting-the-heart-of-our-sync-engine

[21]SWC: http:///

[22]Deno: https://nd/

[23]V8: https://v/

[24]5月才達(dá)到: https:///blog/v1

[25]v1.0: https:///blog/v1

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

[27]esbuild: https://esbuild./

[28]Source: https://news./item?id=22336334

[29]Source: https://news./item?id=22336284

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

[31]Rome: https://ols/blog/2020/08/08/introducing-rome

[32]Sebastian: https://twitter.com/sebmck

[33]Source: https://ols/blog/2020/08/08/introducing-rome

[34]用 Rust:
https://twitter.com/rometools/status/1422616144763097091

[35]重寫(xiě):
https://twitter.com/rometools/status/1422616144763097091

[36]napi-rs: https:///

[37]WebAssembly: https:///docs/use-cases/

[38]Devon Govett: https://twitter.com/devongovett

[39]致力于:
https://www./what/wasm

[40]Yew: https:///

[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:///

[45]編譯到 WASM:
https://rustwasm./docs/book/introduction.html

[46]Source: https:///2021/01/15/rust.html

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

[48]唯快不破:
https:///essays/fast_software/

[49]Fast software wins): https:///essays/fast_software/

[50]Next.js 12: http:///12

[51]Deno: https://nd/

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

[53]Rome: https://ols/

[54]用 Rust 重寫(xiě):
https://twitter.com/rometools/status/1422616144763097091

[55]dprint: https://github.com/devongovett/dprint-node

[56]Parcel: https:///

[57]提高了 10 倍:
https://v2./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./wiki/Static_build

[61]Devon Govett: https://twitter.com/devongovett

[62]https://live./4354/rescript-lang: https://live./4354/rescript-lang

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多