為何WebAssembly將顛覆操作系統(tǒng)?
譯文譯者 | 布加迪
審校 | 重樓
公平地說,自上世紀(jì)70年代以來,我們的系統(tǒng)運(yùn)行所依賴的操作系統(tǒng)的核心范式?jīng)]有真正改變,盡管在此期間我們已學(xué)到了很多知識。

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















 
 
 
 
 
 
 