整理丨諾亞
不要把Wasm當成軟件,它是計算機中的計算機。
WebAssembly的誕生源起于幾大Web瀏覽器供應商(Apple,Google,Microsoft,Mozilla)之間的合作。設計者最初將其設想為一個安全可靠的執行環境,用于以近乎本機的性能在Web上運行不受信任的代碼。
然而時至今日,這門新興技術早已擴展到Web瀏覽器之外,甚至有一部分人認為,Wasm將取代容器技術和無處不在的JavaScript。
這些當然遠遠不足以說明Wasm的驚艷之處,游戲規則的改變者可沒有那么簡單。
1、比Java還狠:“一次部署、隨處部署”
如今,WebAssembly的計算潛力已經得到了很大的認可。這不得不歸因于它的設計初衷。
眾所周知,人們使用各種不同種類的語言來編寫軟件,讓這些語言相互交互是很困難的。而WebAssembly恰恰提供了一個框架,讓開發人員可以用他們想要的語言進行編寫,然后,它會生成通用的模擬計算機格式,這種格式允許用各種語言編寫的組件相互通信。
正如邊緣云平臺Fastly的工程師Luke Wagner提到的:“Wasm的設計是編程語言的可移植編譯目標。我認為這里的關鍵詞是'編譯目標',這意味著我們可以采用我們的各種源語言。”
“除了能夠將它們編譯成所有不同的本機指令集外,我們還可以將它們編譯成WebAssembly。然后,我們可以將這個WASM發送給瀏覽器或某種類型的WASM引擎,該引擎將在內部將其編譯為運行它的實際指令集。這給我們帶來的是可移植性、確定性(如果需要的話)、控制流完整性和子進程沙箱。”
由此看來,WebAssembly要實現的是“一次部署,隨處部署”。更準確的說,理想情況下,你可以編寫一次代碼,幾乎不需要任何配置,就可以將其部署到任何CPU或設備上。盡管有人可能會覺得有失偏頗,但在某些方面,的確可以把它看作是一個高效的編譯器。
2、不止瀏覽器,簡直無處不在
發布于2018年的WebAssembly,最初是作為Web開發領域的技術,引起了關注。而在2019年,WASI(WebAssembly系統接口)的出現使情況發生了變化,它為Wasm提供了一個模塊化的界面,將WebAssembly帶到了瀏覽器之外。
WebAssembly的這種轉變甚至促使Docker聯合創始人Solomon Hykes在2019年發推文說:“如果WASM+WASI在2008年就存在,我們就不需要創建Docker了。這就是它的重要性。服務器上的WebAssembly是計算的未來。”
短短四五年光景,我們看到WebAssembly在瀏覽器之外的應用也漸入佳境。
根據今年9月發布的《WebAssembly 2023現狀報告》,SlashData與CNCF(云原生計算基金會)合作對255名WebAssembly用戶進行調查,發現WebAssembly的使用已經遠遠超出了其最初的 Web 應用程序目標。
該報告發現,雖然Wasm仍然主要用于開發Web應用程序(58%),但它的使用正在從原始用例擴展到數據可視化(35%),物聯網(32%),人工智能(30%),后端服務(不包括無服務器)(27%)和邊緣計算(25%)等新領域。
“在瀏覽器之外,在現有系統中嵌入Wasm以使訪客代碼更接近系統是一種流行的做法。舉個例子,一個瀏覽器有很多不是用JavaScript編寫的代碼。此外,人們正在使用Wasm來探索分布式計算的替代模型,如無服務器、分布式行動者、記錄和回放,邊緣計算等等。”Fastly工程師Wagner如是說。
當前,盡管可以從廣泛的軟件項目中看到WebAssembly的身影,但挑戰依然存在,比如WebAssembly模塊目前仍然無法支持所有編程語言;即使在它支持的少數編程語言中,如Rust、C++、Python,要將其部署到各種設備中依然有各自的問題;組件結構仍然不夠標準化……這些挑戰的解決或許只要一兩年,或許還需要相當長的時間,屆時WebAssembly的跨平臺部署才能展現其真正的功能。
WebAssembly應用程序使用的語言排行,JavaScript是Wasm應用程序最流行的語言
3、Wasm不是軟件,是一種新型“計算機”
雖然WebAssembly還處于發展早期,但在某些圈內人士來看,它已經表現出將技術車輪推向未來的潛力。
NGINX產品管理高級總監Liam Crilly在最近的一次談話中,將WebAssembly比作一臺概念意義上的計算機。他是這樣解釋的:雖然WebAssembly不能直接在物理設備上運行,但它有可能通過使用WebAssembly模塊在用于數據交換和部署的設備網絡上運行。
“WebAssembly允許我們重新思考我們需要的抽象。它使我們能夠邁出下一步,而不是持續地錨定在我們用來描述存儲和計算的初始元素上。這就是為什么我在Kubernetes的背景中提到它,因為它仍然帶有一些包袱。”
實際上,WebAssembly可以被認為是一種新型的計算機。它擁有一個指令集,類似于CPU,“匯編(Assembly)”部分就是從它派生出來的。
當你檢查示例代碼時,它與此非常相似,前提條件是它是人類可讀的。這臺簡單的“計算機”能做傳統計算機可以執行的任何事情。重要的是,這個新的指令集成為所有編程語言的編譯目標。從本質上講,任何高級編程語言不僅可以編譯為特定硬件的CPU指令集,還可以編譯為WebAssembly指令集。
此外,WebAssembly可以被視為一個強大的編譯器目標,正如Crilly所解釋的:“WebAssembly的迷人之處在于它提供了編譯器的優勢,使你能夠使用高級語言并生成優化良好的指令集代碼。”
然而,由于WebAssembly的功能是一個抽象的計算機,它需要一個虛擬機或運行時來接受這個指令集并在硬件上執行它。雖然這最初看起來像是一個額外的抽象層,但實際上它非常巧妙。
Crilly說,使用WebAssembly,就可以為任何硬件構建一個運行時,開發人員和運營人員就不再需要關注具體的硬件細節。
“如果我有一個編譯到這個指令集的 WebAssembly 模塊,我就會獲得編譯器優化的好處,其中包括運行時的即時 (JIT) 優化,因為我將這個指令集的字節碼轉換為 CPU 指令。這個額外的優化層類似于 JIT 編譯器和瀏覽器運行時,可提供接近本機的計算性能。因此,這個抽象層的缺點很小。”
4、Wasm:計算機中的計算機
“將WebAssembly視為計算機”的概念并非獵奇。
企業管理協會(EMA)分析師Torsten Volk對此更進了一步,將Wasm描述為“計算機中的計算機”。
“它不是提供對CPU,RAM,存儲和網絡硬件的直接訪問,而是為應用程序提供對這些資源的簡化通用版本的訪問權限。通過將來自為Wasm編譯的應用程序字節碼的指令轉換為直接與CPU、RAM和磁盤指令集通信的字節碼來實現這一點。一旦此轉換層普遍適用于大多數類型的應用程序,你實際上可以將 Wasm運行時描述為一種新型計算機。"
在操作系統與硬件的關系上,人們的探索從未停止。而WebAssembly的出現無疑為此提供了另一種答案。
Fermyon Technologies的聯合創始人兼首席執行官Matt Butcher談到:“虛擬機打破了將操作系統視為與硬件具有一對一關系的思維。我們可以在單個硬件上運行許多操作系統,而容器通過允許我們安全地(并以多租戶方式)運行許多共享一個內核的離散文件系統來進一步推動這一故事。“
“Wasm可以被視為第三次浪潮:應用程序不直接依賴于主機操作系統。它只是聲明它需要什么,主機運行時可以專門滿足這些需求。最后,開發人員不需要了解目標環境的操作系統或架構。”
5、寫在最后
整體上看,WebAssembly 不僅通過沙盒執行提高了安全性,還通過使開發人員能夠使用幾乎所有流行語言創建高性能 Web 應用程序。隨著WebAssembly的不斷發展和生態系統的擴展,其“游戲規則改變者”的角色在開源開發的格局中可能會愈發突出。
不過在WebAssembly能發揮其全部潛力之前,還有很長的路要走。在許多方面,Wasm的格局類似于幾年前Kubernetes蓬勃發展的早期開發和采用。
值得一提的是,根據《WebAssembly 2023現狀報告》,大多數軟件開發人員對未來在Web和非Web環境中采用Wasm持樂觀態度。報告提到,將現有應用程序遷移到 Wasm 時,30%的受訪者體驗到超過 50%的性能優勢。此外,“更快的加載時間,探索新用例和技術的能力,在項目之間共享代碼的能力”均是WebAssembly吸引開發人員的主因。
另外,報告中約有22%的參與者對Wasm在Web或非Web環境中的采用表示悲觀。關于Wasm面臨的挑戰,受訪者則提到了調試和故障排除困難,運行時之間的性能不同,運行時之間缺乏一致的開發人員體驗,缺乏學習材料以及與某些瀏覽器的兼容性問題。
參考鏈接:
https://thenewstack.io/webassembly-reaches-a-cloud-native-milestone/
https://developers.slashdot.org/story/23/09/10/0653235/webassembly-2023-survey-finds-enthusiasm---and-some-challenges
https://www.infoworld.com/article/3706249/developers-have-doubts-about-webassembly-report-finds.html
https://andrewzuo.com/linux-foundation-report-finds-serious-issues-with-webassembly-b9c47b3b0b4c