為何WebAssembly將顛覆操作系統(tǒng)?
譯文譯者 | 布加迪
審校 | 重樓
公平地說(shuō),自上世紀(jì)70年代以來(lái),我們的系統(tǒng)運(yùn)行所依賴的操作系統(tǒng)的核心范式?jīng)]有真正改變,盡管在此期間我們已學(xué)到了很多知識(shí)。
我們看到了創(chuàng)新,尤其是在用戶體驗(yàn)和并發(fā)性方面。不過據(jù)F5(隸屬NGNIX)的高級(jí)產(chǎn)品管理總監(jiān)Liam Crilly聲稱,感覺我們?nèi)匀恢皇窃卺槍?duì)局部最大值進(jìn)行優(yōu)化。
他表示:“我們有線程,也有進(jìn)程,但它們都植根于同一種抽象。”
Crilly認(rèn)為WebAssembly(Wasm)為軟件開發(fā)人員提供了一個(gè)難得的機(jī)會(huì)來(lái)重新思考操作系統(tǒng)的整體運(yùn)作方式,我們利用這個(gè)機(jī)會(huì)才是明智之舉。
他說(shuō):“有了WebAssembly,我們又重新開始了。”
Wasm和創(chuàng)新的擴(kuò)散
我們之前詳細(xì)介紹過WebAssembly,但如果您不熟悉它,多介紹一點(diǎn)背景知識(shí)可能會(huì)對(duì)您有所幫助。WebAssembly是一種二進(jìn)制指令格式,面向非常小的、基于堆棧的虛擬機(jī)(實(shí)際上是一個(gè)非常簡(jiǎn)陋的計(jì)算機(jī))。
由于Wasm基于堆棧,所以運(yùn)行在其上面的代碼很簡(jiǎn)單,可以高度優(yōu)化,因而使它速度極快。針對(duì)它的字節(jié)碼可以移植,Wasm二進(jìn)制文件極小。它們也很安全,除非主機(jī)運(yùn)行時(shí)環(huán)境允許,否則無(wú)法執(zhí)行任何操作。您可以使用各種高級(jí)語(yǔ)言(包括C/ C++、C#、Dart、Go、Kotlin、Rust和Swift)編寫注定在Wasm中運(yùn)行的代碼。
Wasm標(biāo)準(zhǔn)最初源自Mozilla,由字節(jié)碼聯(lián)盟監(jiān)管,該聯(lián)盟是一個(gè)類似Eclipse或云原生計(jì)算基金會(huì)(CNCF)的基金會(huì)。Wasm由W3C實(shí)現(xiàn)標(biāo)準(zhǔn)化,因此是繼HTML、CSS和JavaScript之后的第四大互聯(lián)網(wǎng)語(yǔ)言。因此,看到所有主流瀏覽器都支持該技術(shù)也就不足為奇了。
此外,Wasm這種瀏覽器技術(shù)擁有頗具吸引力的優(yōu)點(diǎn):高效、快速和安全,因而已經(jīng)在各種其他環(huán)境中得到了應(yīng)用,這包括Cloudflare Workers、Envoy擴(kuò)展、Fastly的Compute@Edge以及最近的NGINX Unit。作家、技術(shù)專家兼Wasm愛好者Kevin Hoffman甚至認(rèn)為,云才是Wasm真正大放異彩的環(huán)境。
然而不可避免的是,隨著這項(xiàng)技術(shù)得到進(jìn)一步的采用,在您應(yīng)該將Wasm虛擬機(jī)的功能擴(kuò)展到什么程度上是個(gè)未知數(shù)。在社區(qū)內(nèi),一場(chǎng)正在進(jìn)行的討論探討了這項(xiàng)技術(shù)的未來(lái)應(yīng)該是什么樣子,以及它應(yīng)該在多大程度上類似計(jì)算機(jī)系統(tǒng)的運(yùn)作方式。
其背后總是有一系列的權(quán)衡和取舍需要考慮。當(dāng)您思考創(chuàng)新在科技行業(yè)的擴(kuò)散時(shí),看起來(lái)熟悉的東西通常會(huì)被更快地得到采用。
如果您看一下Java,它迅速發(fā)展起來(lái)的原因之一是它看起來(lái)很像C++,習(xí)慣于C語(yǔ)言家族的人可以很快上手。正如首席設(shè)計(jì)師James Gosling所說(shuō),Java是“沒有槍、刀或棍棒的C++”。
這是有意為之;Gosling在去年的reClojure主題演講中說(shuō):“我希望C程序員看到Java程序后能夠理解其中的原理,大多數(shù)情況下他們確實(shí)理解。”
另一方面,如果一項(xiàng)技術(shù)很快被廣泛采用,完善起來(lái)就會(huì)困難得多,正如Gosling承認(rèn)的那樣:“成功變成了一個(gè)問題,因?yàn)楝F(xiàn)在外面有數(shù)十億行Java代碼。在Java發(fā)布后的幾年里,很明顯我們無(wú)法改變會(huì)破壞任何人代碼的任何承載體。因此,這確實(shí)限制了您在完善方面可以做得多瘋狂。”
運(yùn)行時(shí)環(huán)境就是操作系統(tǒng)
不過眼下,盡管Wasm勢(shì)頭漸猛,但它并沒有這些問題。
Crilly談到F5時(shí)說(shuō):“當(dāng)我們考慮將Wasm用于通用計(jì)算時(shí),無(wú)論是在瀏覽器中還是在服務(wù)器中,它都沒有種種累贅和負(fù)擔(dān)。舉例說(shuō),它并不自帶POSIX,而且并不默認(rèn)知道關(guān)于文件的任何信息。”
“這實(shí)際上是一種非常令人擔(dān)憂的抽象,但您越想它,就越意識(shí)到這就是在上世紀(jì)70年代的辦公空間很有用的一種抽象,當(dāng)時(shí)Unix和POSIX在變得成熟??偟膩?lái)說(shuō),我們?cè)诖鎯?chǔ)和抽象方面比以前要復(fù)雜得多,所以默認(rèn)使用文件作為存儲(chǔ)抽象有點(diǎn)愚蠢。”
重新考慮操作系統(tǒng)也有巨大的潛在優(yōu)勢(shì)。以數(shù)據(jù)為例,“我們可以摒棄傳統(tǒng)的數(shù)據(jù)構(gòu)造,將每個(gè)原始數(shù)據(jù)塊視為任何操作的真實(shí)對(duì)象,”Crilly說(shuō)。
他補(bǔ)充道,這種范式意味著“在插件模塊的幫助下,以我們想要的任何格式,將結(jié)果推回到我們需要的任何數(shù)據(jù)存儲(chǔ)系統(tǒng)中。所有關(guān)于操作系統(tǒng)本質(zhì)的先入為主的概念都可能消失,剩下運(yùn)行時(shí)環(huán)境——這是計(jì)算的最基本要素。換句話說(shuō),運(yùn)行時(shí)環(huán)境就是新的操作系統(tǒng)?!?/span>
Wasm組件模型
Wasm的組件模型方案是將這個(gè)愿景變?yōu)楝F(xiàn)實(shí)的一種方式。它建立在WebAssembly模塊之上,WebAssembly模塊在2019年成為官方標(biāo)準(zhǔn)。組件模型是一種新的Wasm二進(jìn)制格式,它本質(zhì)上是在WebAssembly核心模塊周圍添加了元數(shù)據(jù)。因此,在一個(gè)組件中可能有多個(gè)模塊。
組件模型提供了兩點(diǎn):語(yǔ)言可兼容性和可組合性。組件封裝標(biāo)準(zhǔn)的WebAssembly模塊,您可以使用導(dǎo)入(組件運(yùn)行所需的內(nèi)容)和導(dǎo)出(允許從組件調(diào)用的內(nèi)容)與它進(jìn)行聯(lián)系。
組件模型基于無(wú)共享鏈接,這意味著它只導(dǎo)入和導(dǎo)出函數(shù)和不可變的值,而不是內(nèi)存內(nèi)容、表或可變?nèi)种?。這有點(diǎn)類似連接不同進(jìn)程的Unix管道,或連接不同微服務(wù)的HTTP API。
采用這種方法可以消除全部潛在的供應(yīng)鏈?zhǔn)焦?。此外,使用函?shù)導(dǎo)入跨無(wú)共享邊界直接調(diào)用可以減少無(wú)共享架構(gòu)中因系統(tǒng)調(diào)用、上下文切換和額外復(fù)制而導(dǎo)致的通信開銷。
據(jù)Cosmonic(Wasm平臺(tái)即服務(wù))的首席技術(shù)官Bailey Hayes聲稱,組件模型還消除了Wasm模塊的幾個(gè)摩擦點(diǎn)。首先,那些導(dǎo)入和導(dǎo)出使用更高級(jí)的類型,所以現(xiàn)在可以傳入字符串之類的東西。
雖然在使用Wasm綁定之前可以做到這一點(diǎn),但這很麻煩,因此加以簡(jiǎn)化顯然是成功的做法。
同樣,缺乏與WebAssembly模塊的語(yǔ)言互操作性是造成摩擦的另一個(gè)原因。從技術(shù)上講,Wasm字節(jié)碼實(shí)際上是一堆i32s、整數(shù)和浮點(diǎn)類型。它能夠調(diào)用主機(jī)提供給它的函數(shù)句柄,這使它能夠做更多的事情。
組件模型并不改變這方面,但它改變的是API,我們稱之為接口類型;現(xiàn)在有了一個(gè)接口類型定義,它不僅僅是一堆數(shù)字,它創(chuàng)建了所謂的規(guī)范ABI。這樣一來(lái),就可以把兩個(gè)組件連接在一起,讓它們相互聯(lián)系。
這也讓我們得以使用任何語(yǔ)言生成語(yǔ)言綁定。字符串的Python表示和字符串的Rust表示不一樣,所以我們需要一種提升和降低的方式,這是由組件模型定義的。
Hayes認(rèn)為,Wasm組件模型最終將成為我們新的計(jì)算單元。她說(shuō):“這下一波計(jì)算浪潮將不再專注于Linux類容器的虛擬化,而是取決于我們的業(yè)務(wù)邏輯的WebAssembly表示?!?/span>
她表示,其中的原因是“組件模型為我們提供了一種新的抽象,這是我們以前從未有過的。它將是最終讓我們可以打破整個(gè)技術(shù)生態(tài)系統(tǒng)孤島的技術(shù)之一。”
她進(jìn)一步解釋:“您在行業(yè)中經(jīng)??吹降氖牵?/span>‘這是另一個(gè)Rust或C++庫(kù)的Go原生版本’——您在每個(gè)語(yǔ)言生態(tài)系統(tǒng)中都能看到這種情況。我們實(shí)際上只是在重復(fù)同樣的工作,在我看來(lái),這純粹浪費(fèi)人力和時(shí)間。”
相比之下,組件模型讓技術(shù)人員可以“為工作構(gòu)建最好的組件,擁有最好的API和最快的組件,然后您可以將其用作庫(kù),無(wú)論您使用哪種語(yǔ)言。我認(rèn)為這將是一股真正的創(chuàng)新力量。”
她對(duì)Wasm抱有高漲的熱情,這確實(shí)是一項(xiàng)令人興奮的技術(shù),不過Crilly發(fā)出了警告。
他說(shuō):“這種方法存在一些挑戰(zhàn)。一個(gè)挑戰(zhàn)是,我們最終是否會(huì)扼殺創(chuàng)新,因?yàn)槿绻粋€(gè)KeyVal必須遵循相同的API,那么如何將自己與另一個(gè)KeyVal區(qū)分開來(lái)?我的另一個(gè)擔(dān)憂是,人們會(huì)急于通過組件模型將所有POSIX抽象引入到WebAssembly。”
“我不希望我們夢(mèng)游般地進(jìn)入上世紀(jì)70年代的操作系統(tǒng)范式。我們可以做得更好,我真的希望開發(fā)人員在開始選擇WebAssembly這種技術(shù)時(shí)認(rèn)真想清楚這一點(diǎn)。”
原文標(biāo)題:Why WebAssembly Will Disrupt the Operating System,作者:Charles Humble