

WebAssembly可以提供跨任何開發語言、作業系統,甚至是處理器架構的執行環境,成了雲原生生態圈今年的熱門技術,GAI開發者也開始重視,要用來實現超高速的即時AI推論
高盛銀行有一個每天數百萬次呼叫請求的開發者API平臺,他們在2023年時開始驗證如何用Wasm,來封裝不同語言所開發的API外掛,統一這些外掛程式的部署和管理,最後讓全部的API外掛程式都改用Wasm形式來提供。/高盛集團
德國製造大廠Bosch有個研究團隊,則在2023年底時,分享了在自駕車軟體和工廠系統運用Wasm的經驗。他們用Wasm搭配容器技術,來部署汽車駕駛系統的嵌入式軟體元件,大幅簡化了電動車內不同類型異質裝置的安裝管理。他們還看上Wasm的毫秒級冷啟動能力,在工業自動化設備的邊緣主機上,用Wasm來部署監控軟體,可以幾乎即時的速度,來分析工控PLC系統回傳的資料,來判斷是否出現問題要發出預警,就算邊緣主機當機(製造工廠環境常見的故障風險),也能快速(毫秒等級)在另一臺邊緣主機啟用新的Wasm監控軟體,做到幾乎即時的故障自動切換能力,不會中斷對工廠自動化產線的持續監控。
Amazon影音服務靠Wasm支援8千種各類裝置
Amazon的Prime Video服務則看上了Wasm通吃各種裝置、平臺的能力。Amazon這項影音服務數百萬名顧客所用的裝置高達8千種類型,除了電腦、手機,還有遊戲主機、各類數位電視、機上盒、USB串流棒等。每次要改版,幾乎很難針對每一種環境提供專門的升級版本。所以,Amazon從2020年8月開始測試Wasm,發現同樣的功能,用Rust語言開發,再編譯成Wasm檔案格式執行,可以比用JavaScript開發的執行速度快上10到25倍,便決定在2021年大幅改用WebAssembly混用JavaScript,來簡化軟體版本升級的流程。
Amazon會在裝置上預載兩種執行環境,一個是WebAssembly VM,另一個是JavaScript VM。需要大量運算的功能,例如動畫模擬、渲染計算等,就改用Wasm技術編譯成二進位檔,放到WebAssembly VM中執行,而Prime Video App則保留原本的JavaScript程式碼,載入到另一個JavaScript VM環境中來執行。這個做法,不只更容易靠一兩種語言,支援到更多類型的裝置,高運算負載的程式碼從JavaScript改為Wasm後,省下了30MB的記憶體,只需要7.5MB就能順暢執行,也降低了不少硬體規格的門檻,提高在低階或行動裝置上的執行效能。
WebAssembly並非是這幾年隔空出現的新技術,而是問世十年的老技術,一開始是為了解決 JavaScript直譯式語言速度太慢的問題,尤其Web應用的功能越來越複雜,程式檔也越來越大,動輒數萬、數十萬行的Web應用程式碼,如何提高大型Web應用在瀏覽器中的執行速度成了一大挑戰。早在2010年時,有位軟體工程師Alon Zakai打造了一款工具Emscripten,可以將C/C++程式碼編譯成JavaScript可執行的形式,2012年更是釋出了asm.js技術,這是JavaScript的一項子集合,可以在瀏覽器中執行C和C++程式碼來加速。這是WebAssembly標準出現前的JavaScript應用優化嘗試。
2015年5月,JavaScript之父Brendan Eich特別來臺參加iThome舉辦的Modern Web大會,回顧這項技術的開發幕後秘辛以及20年來的發展。在演講中,他特別展示了在瀏覽器中執行的第一人稱3D射擊遊戲,來展示當JavaScript執行效率跟Bytecode程式一樣時,可以做到的能耐。這個現場展示,震驚所有參加者,包括臺下的我。
一個月後,JavaScript之父就和四大瀏覽器平臺,發起了W3C WebAssembly社群小組,想要重新發明JavaScript網頁應用,以WebAssembly來命名新技術,顧名思義,就是Web的Assembly(組合語言)形式,要讓網頁應用也能擁有二進位Bytecode的執行格式。
Brendan Eich指出,WebAssembly格式標準將成為一個網站程式碼的新中介層,可以提供一個二進位檔案格式標準來執行網頁。最大特色是,可以讓JavaScript程式的執行速度快20倍,讓網頁應用也能像桌面原生應用一樣的執行速度。因為,WebAssembly標準的作法是,直接定義了一個新的網頁執行層,而非如JavaScript子集合的作法,讓瀏覽器能直接執行二進位檔案格式的WebAssembly檔案,來達到像是執行Bytecode程式般的高效能。而且,當時JavaScript之父更指出一個未來的發展趨勢,這項技術不限於JavaScript這種語言,而是任何語言都可以用的技術。
這項技術有多強?像是Adobe大砸200億美元收購的設計平臺Figma,正是靠WebAssembly技術才打造出操作流暢的線上工具,可以在瀏覽器上使用大量向量元件,組合成複雜、精美的網頁版面。正因為WebAssembly可以讓Web應用的執行速度,媲美桌面原生軟體般的執行速度,所以,不少人用「網頁組合語言技術」來形容。
經過兩年努力,在2017年時,WebAssembly 發表了第一個版本,獲得Chrome、Safari、Edge、Firefox等主要瀏覽器的支持,也正式成了網頁標準之一。不過,這項技術,一開始只能在瀏覽器環境中執行,想要執行Wasm,還得先安裝一隻瀏覽器或瀏覽器引擎。
Wasm走出瀏覽器,連Docker之父都驚艷
直到2019年,這一年是 Wasm走出瀏覽器,邁向廣大雲原生世界的關鍵一年。Mozilla、雲端業者Fastly等聯手發表了WASI(WebAssembly System Interface)專案,提供了一個runtime程式和命令列工具,不需要瀏覽器,可以直接在桌機或伺服器端執行Wasm應用。同時,專案成員也發起了Bytecode聯盟,要將WebAssembly推廣到瀏覽器以外的世界。這也讓同一套Wasm封裝的程式碼,可以在瀏覽器或非瀏覽器的環境中執行,不需要維護兩套程式碼。

2019年是 Wasm走出瀏覽器,邁向廣大雲原生世界的關鍵一年。Mozilla、雲端業者Fastly等聯手發表了WASI(WebAssembly System Interface)專案,透過獨立的runtime和命令列工具,不需要瀏覽器,也可以直接在桌機或伺服器端中執行Wasm應用。/Fastly傑出工程師Luke Wagner
「如果WASM和WASI在2008年就出現,我們就不需要發明Docker技術了。」Docker之父Solomon Hykes這一句話點出了WebAssembly技術對雲原生生態圈的影響力,可以媲美Docker技術創造了整個雲原生技術浪潮的重要性。這句話也成了後來大家談到WebAssembly發展時,最常被引述的一句話,這是一項連Docker之父都讚嘆的新技術。
跨出瀏覽器之後,橫跨到雲原生技術圈的WASM生態圈,從2020年開始茁壯,而且相關工具和技術專案數量越來越多,貢獻者規模越來越大,更多工具,更多開發語言開始支援,也開始出現大規模開發Wasm用的技術框架。
WASI專案在2021年提出了新的元件模式(Component Model)草案,可以讓不同語言寫的程式碼,編譯成Wasm元件,此彼此有一套標準的元件輸入輸出方式來互動,舉例來說,用Go語言寫的Wasm元件,和用Rust語言寫的Was元件,有共同的標準輸入輸出方式,就像用同一種語言開發的元件一樣,甚至可以把這兩個元件,放入一個更大的Wasm元件中混用。這個元件模型,讓Wasm具備了跨各種語言的能力,這也是後來WASI專案0.2版的重要特色。Brendan Eich多年前提到的WebAssembly跨開發語言的能力,不只在瀏覽器中落實,更在瀏覽器外的廣大雲原生世界中實現了。
到了2022年,已有超過40種語言支援Wasm,包括Rust, C, C++, JavaScript和GO語言。而且不只伺服器環境,還可以在邊緣裝置,甚至是IoT設備上執行Wasm程式。2022年10月,Docker公司更宣布加入Bytecode聯盟,要讓Docker引擎開始支援Wasm,直接在容器執行環境中,也能直接執行Wasm的二進位元件檔。
Docker這一步,吸引了更多雲原生採用企業對這項技術的關注,雲原生組織CNCF在年度調查中觀察到,超過37%的企業開始試水溫嘗試WebAssembly,尤其可用於Serverless架構中的兩款Runtime,包括WasmEdge和WAMR開始受到關注。CNCF這份調查報告最後的結論是「容器已經成為新標準,而WebAssembly是未來。」這個雲原生生態圈最重要的組織,開始認真將WebAssembly視為接下來的重要發展方向。
不只是容器技術指標廠商開始擁抱,虛擬化技術也開始向Wasm靠攏。微軟Azure技術長Mark Russinovich在2023年Build開發者大會上發表了Hyperlight,可以在Hypervisor上直接執行Wasm應用。Hyperlight可以產生一個微型VM(Micro-VM),比執行一個容器所用的資源更小,啟動速度超快,具有Hypervisor層隔離強度的執行環境,來執行Wasm元件。1秒鐘可以啟動1千個這種執行Wasm的微型VM ,延遲時間甚至只有250微秒,也就是一秒的四千分之一。微軟讓虛擬機器、容器和Wasm可以在同一個Hypervisor環境中並存。
後續報導請見:
WebAssembly如何成為雲原生生態圈關鍵技術
WebAssembly生態圈有哪些重要專案?Wasm生態地圖重點剖析
