2019 年 WebAssembly 以超乎我們預(yù)料的速度在發(fā)展,2020 年可能會(huì)是一個(gè) Wasm 應(yīng)用百花齊放的年份。兩年多以來(lái),本文作者 Colin Eberhardt 一直在撰寫 WebAssembly 每周新聞。正值 2019 年底,他也借機(jī)分享今年他本人最喜歡的一些文章,對(duì) WebAssembly 在 2019 年的發(fā)展做一個(gè)回顧。
運(yùn)行在瀏覽器中的《毀滅戰(zhàn)士 3》
今年的 WebAssembly 圈子一上來(lái)就是一個(gè)引人注目的演示應(yīng)用,它就是經(jīng)典的《毀滅戰(zhàn)士 3》游戲到 WebAssembly 的移植。
http://www.continuation-labs.com/projects/d3wasm/

這個(gè)項(xiàng)目使用 Emscripten 來(lái)編譯開源的 C++ 代碼庫(kù),不過(guò)這當(dāng)然沒那么簡(jiǎn)單,它并不是把編譯器指向代碼庫(kù)就能搞定的。源代碼有許多特性是移植版尚未支持的,因此這個(gè)項(xiàng)目還在持續(xù)進(jìn)行中。不過(guò)這個(gè)演示真的引發(fā)了好長(zhǎng)時(shí)間的歡呼……
如果你對(duì)這個(gè)消息感興趣,還可以看一下 InfoQ 上的另一篇報(bào)道:如何用 WebAssembly 將桌面游戲編輯器移植到瀏覽器上。
標(biāo)準(zhǔn)化 WASI:在 Web 外部運(yùn)行 WebAssembly
WebAssembly 運(yùn)行時(shí)是快速、相對(duì)簡(jiǎn)單、可擴(kuò)展且安全的——同時(shí)它也是主機(jī)無(wú)關(guān)的。換句話說(shuō),你可以將 WebAssembly 用作瀏覽器之外的運(yùn)行時(shí)。今年,我們看到了 WebAssembly 在瀏覽器之外的環(huán)境中也產(chǎn)生了巨大吸引力,很多項(xiàng)目和公司正在將 WebAssembly 用作服務(wù)器上的運(yùn)行時(shí)(通常用于無(wú)服務(wù)器函數(shù))、區(qū)塊鏈上的運(yùn)行時(shí)(作為智能合約引擎),以及完全獨(dú)立的運(yùn)行時(shí)。
于是,許多公司都在探索允許 WebAssembly 執(zhí)行各種 I/O 操作(例如通過(guò)套接字通信和訪問(wèn)文件系統(tǒng))的最佳方法。在業(yè)界共同努力下,創(chuàng)造出了 WASI 這個(gè) WebAssembly 的模塊化系統(tǒng)界面。
https://hacks.mozilla.org/2019/03/standardizing-wasi-a-webassembly-system-interface/

Docker 的聯(lián)合創(chuàng)始人之一在 Twitter 上強(qiáng)調(diào)了 WASI 的重要性:

如果 WASM+WASI 在 2008 年就已誕生,那么我們就用不著創(chuàng)建 Docker 了,由此可見它有多么重要。服務(wù)器上的 Webassembly 是計(jì)算產(chǎn)業(yè)的未來(lái),標(biāo)準(zhǔn)的系統(tǒng)接口就是缺少的那塊拼圖,希望 WASI 能夠勝任這項(xiàng)工作!
Citybound:Rust 編寫,編譯為 WebAssembly
是時(shí)候介紹另一個(gè)酷炫演示了……CityBound,這是一款模擬城市環(huán)境的城市建造游戲,里面擠滿了人、汽車、道路和房屋。這是一個(gè)引人入勝的微縮景觀,值得一試。更棒的是整個(gè)游戲都是開源的,并用 Rust 編寫,編譯為 WebAssembly。

Pyodide:將科學(xué) Python 棧帶到瀏覽器中
2019 年,Mozilla 發(fā)布了關(guān)于 Pyodide 的更多信息。Pyodide 是一個(gè)實(shí)驗(yàn)性項(xiàng)目,旨在創(chuàng)建一個(gè)完全在瀏覽器中運(yùn)行的完整 Python 數(shù)據(jù)科學(xué)棧,該項(xiàng)目還使用了 Emscripten。
《瀏覽器將支持 Python 項(xiàng)目!Mozilla 發(fā)布 Pyodide》
.NET 5 將于 2020 年 5 月發(fā)布
Blazor 于 2017 年誕生,這是由 Steve Sanderson(微軟的 ASP.NET 團(tuán)隊(duì)成員)開始的有趣實(shí)驗(yàn),它正在尋找一種在 WebAssembly 上運(yùn)行 C# 的方法。他們最初使用的是.NET 公共語(yǔ)言運(yùn)行時(shí)(CLR)的舊的(且已廢棄)C 實(shí)現(xiàn),將其編譯為 WebAssembly,結(jié)果發(fā)現(xiàn)能在瀏覽器中運(yùn)行.NET 程序集 DLL。該實(shí)驗(yàn)于 2018 年遷移至 Mono,不久后成為正式的 ASP.NET 項(xiàng)目。
這個(gè)項(xiàng)目已經(jīng)相當(dāng)成熟,今年微軟宣布其首個(gè)正式版將于 2020 年 5 月發(fā)布。
https://devblogs.microsoft.com/dotnet/introducing-net-5/
游戲流體模擬的 WebAssembly 移植
又是演示時(shí)間了……這是一個(gè)流體動(dòng)力學(xué)模擬,外觀精美,運(yùn)行良好。
https://www.buildingphysicsonline.com/MjgIntelFluidDemo/webgl.html#
Wasm for Blockchain 2019
今年在區(qū)塊鏈大會(huì)上,我們見證了第一批專用的 Wasm。這篇文章 給出了所有演講的精彩摘要。你還可以在 YouTube 上找到所有演講視頻。
《不只是 Web,WebAssembly 在區(qū)塊鏈上還有這些用處》
多線程 WebAssembly
我要厚臉皮一些了,這里推薦一下我自己的一篇文章——我特別喜歡這篇文章。WebAssembly Threads 提案目前處于第 2 階段,這意味著規(guī)范草案已完成,且是可用狀態(tài)。Chrome 已經(jīng)支持了這一提案對(duì) WebAssembly 運(yùn)行時(shí)添加的額外指令。在這篇博客文章中,我探討了如何使用新添加的原子操作在多個(gè)線程之間分配任務(wù),來(lái)提高分形渲染的效率。

WebAssembly 接口類型:與所有事物互操作
為了使 WebAssembly 與主機(jī)通信,目前你需要大量的“膠水”代碼,以便通過(guò)線性內(nèi)存對(duì)復(fù)雜類型進(jìn)行序列化 / 反序列化。新的接口類型提案應(yīng)該能消除對(duì)這種膠水代碼的需求,從而使與 WebAssembly 模塊的通信變得更加容易,甚至允許它們彼此無(wú)縫地通信。
《一篇漫畫帶你看懂 WebAssembly 與所有語(yǔ)言的互操作!》
WebAssembly 音頻實(shí)驗(yàn)
大多數(shù) WebAssembly 演示應(yīng)用都是可視的,但這一個(gè)有點(diǎn)不同,它是一個(gè)音頻演示,是使用 AssemblyScript 創(chuàng)建芯片調(diào)諧的實(shí)驗(yàn)。你可以在 Peter 的博客中找到有關(guān)此項(xiàng)目的更多信息。
https://petersalomonsen.com/articles/webassemblysynth/intro.html
WebAssembly.sh 發(fā)布
Wasmer 是一個(gè)獨(dú)立的 WebAssembly 運(yùn)行時(shí),這個(gè)團(tuán)隊(duì)有很多很棒的東西,選出其中一樣年度最佳是相當(dāng)困難的。這篇文章宣布了 WebAssembly shell,它使你可以在瀏覽器中運(yùn)行 Wasmer 模塊。我感覺 Wasmer 到目前為止呈現(xiàn)給我們的是一些拼圖碎片的集合,當(dāng)這些碎片開始聚集在一起時(shí),畫面就變得更加清晰,可以預(yù)料將會(huì)有很多激動(dòng)人心的事情快要到來(lái)了。
https://medium.com/wasmer/webassembly-sh-408b010c14db
字節(jié)碼聯(lián)盟宣告成立
這可能是今年最大的事件,也就是字節(jié)碼聯(lián)盟的成立,它將 WASI 和其他各種倡議結(jié)合在一起,以創(chuàng)建一個(gè)用于執(zhí)行第三方代碼的安全環(huán)境。這是很重要的事情,團(tuán)隊(duì)希望解決 npm、crates 和其他各種程序包管理器中模塊的漏洞和惡意攻擊等重大問(wèn)題。
https://hacks.mozilla.org/2019/11/announcing-the-bytecode-alliance/
總結(jié):跟 JavaScript 差距還比較明顯
對(duì)于 WebAssembly 來(lái)說(shuō),2019 年是有趣的一年,雖然我們看到 WebAssembly 的發(fā)展超過(guò)我們預(yù)期,但是最近對(duì) JavaScript 開發(fā)人員進(jìn)行的一項(xiàng)調(diào)查發(fā)現(xiàn),只有一小部分人在使用 WebAssembly,而且到目前為止,我們還沒有看到能夠使 Web 開發(fā)人員真正傾心的殺手級(jí)演示。
《2019 年 JavaScript 生態(tài)圈調(diào)查報(bào)告出爐!》
他們?yōu)槭裁匆w移到 WebAssembly 上呢?畢竟在瀏覽器中運(yùn)行的 JavaScript 為開發(fā)人員提供了一個(gè)成熟的(但仍在不斷變化!)的工作環(huán)境——JavaScript 幾乎無(wú)所不能。
我認(rèn)為,盡管 WebAssembly 的名字里有“Web”,但它將在瀏覽器之外產(chǎn)生更大的影響力。
作者介紹:
Colin Eberhardt 是 Scott Logic 技術(shù)總監(jiān),還是橫跨多個(gè)技術(shù)領(lǐng)域的多產(chǎn)技術(shù)作家、博客作者和演講者。
原文鏈接:
https://blog.scottlogic.com/2019/12/24/webassembly-2019.html