Categories
程式開發

​2019 年 WebAssembly 盤點:跟 Javascript 的相愛相殺


2019 年 WebAssembly 以超乎我們預料的速度在發展,2020 年可能會是一個 Wasm 應用百花齊放的年份。兩年多以來,本文作者 Colin Eberhardt 一直在撰寫 WebAssembly 每週新聞。正值 2019 年底,他也藉機分享今年他本人最喜歡的一些文章,對 WebAssembly 在 2019 年的發展做一個回顧。

運行在瀏覽器中的《毀滅戰士 3》

今年的 WebAssembly 圈子一上來就是一個引人注目的演示應用,它就是經典的《毀滅戰士 3》遊戲到 WebAssembly 的移植。

http://www.continuation-labs.com/projects/d3wasm/

​2019 年 WebAssembly 盤點:跟 Javascript 的相愛相殺 1

這個項目使用 Emscripten 來編譯開源的 C++ 代碼庫,不過這當然沒那麼簡單,它並不是把編譯器指向代碼庫就能搞定的。源代碼有許多特性是移植版尚未支持的,因此這個項目還在持續進行中。不過這個演示真的引發了好長時間的歡呼……

如果你對這個消息感興趣,還可以看一下 InfoQ 上的另一篇報導:如何用 WebAssembly 將桌面遊戲編輯器移植到瀏覽器上。

標準化WASI:在Web外部運行WebAssembly

WebAssembly 運行時是快速、相對簡單、可擴展且安全的——同時它也是主機無關的。換句話說,你可以將 WebAssembly 用作瀏覽器之外的運行時。今年,我們看到了WebAssembly 在瀏覽器之外的環境中也產生了巨大吸引力,很多項目和公司正在將WebAssembly 用作服務器上的運行時(通常用於無服務器函數)、區塊鏈上的運行時(作為智能合約引擎),以及完全獨立的運行時。

於是,許多公司都在探索允許 WebAssembly 執行各種 I/O 操作(例如通過套接字通信和訪問文件系統)的最佳方法。在業界共同努力下,創造出了 WASI 這個 WebAssembly 的模塊化系統界面。

https://hacks.mozilla.org/2019/03/standardizing-wasi-a-webassembly-system-interface/

​2019 年 WebAssembly 盤點:跟 Javascript 的相愛相殺 2

Docker 的聯合創始人之一在 Twitter 上強調了 WASI 的重要性:

​2019 年 WebAssembly 盤點:跟 Javascript 的相愛相殺 3

如果 WASM+WASI 在 2008 年就已誕生,那麼我們就用不著創建 Docker 了,由此可見它有多麼重要。服務器上的 Webassembly 是計算產業的未來,標準的系統接口就是缺少的那塊拼圖,希望 WASI 能夠勝任這項工作!

Citybound:Rust編寫,編譯為WebAssembly

是時候介紹另一個酷炫演示了……CityBound,這是一款模擬城市環境的城市建造遊戲,裡面擠滿了人、汽車、道路和房屋。這是一個引人入勝的微縮景觀,值得一試。更棒的是整個遊戲都是開源的,並用 Rust 編寫,編譯為 WebAssembly。

https://aeplay.org/citybound

​2019 年 WebAssembly 盤點:跟 Javascript 的相愛相殺 4

Pyodide:將科學 Python 棧帶到瀏覽器中

2019 年,Mozilla 發布了關於 Pyodide 的更多信息。 Pyodide 是一個實驗性項目,旨在創建一個完全在瀏覽器中運行的完整 Python 數據科學棧,該項目還使用了 Emscripten。

《瀏覽器將支持 Python 項目! Mozilla 發布 Pyodide》

.NET 5 將於 2020 年 5 月發布

Blazor 於 2017 年誕生,這是由 Steve Sanderson(微軟的 ASP.NET 團隊成員)開始的有趣實驗,它正在尋找一種在 WebAssembly 上運行 C# 的方法。他們最初使用的是.NET 公共語言運行時(CLR)的舊的(且已廢棄)C 實現,將其編譯為 WebAssembly,結果發現能在瀏覽器中運行.NET 程序集 DLL。該實驗於 2018 年遷移至 Mono,不久後成為正式的 ASP.NET 項目。

這個項目已經相當成熟,今年微軟宣布其首個正式版將於 2020 年 5 月發布。

https://devblogs.microsoft.com/dotnet/introducing-net-5/

遊戲流體模擬的 WebAssembly 移植

又是演示時間了……這是一個流體動力學模擬,外觀精美,運行良好。

https://www.buildingphysicsonline.com/MjgIntelFluidDemo/webgl.html#

Wasm for Blockchain 2019

今年在區塊鏈大會上,我們見證了第一批專用的 Wasm。這篇文章 給出了所有演講的精彩摘要。你還可以在 YouTube 上找到所有演講視頻。

《不只是 Web,WebAssembly 在區塊鏈上還有這些用處》

多線程 WebAssembly

我要厚臉皮一些了,這裡推荐一下我自己的一篇文章——我特別喜歡這篇文章。 WebAssembly Threads 提案目前處於第 2 階段,這意味著規範草案已完成,且是可用狀態。 Chrome 已經支持了這一提案對 WebAssembly 運行時添加的額外指令。在這篇博客文章中,我探討瞭如何使用新添加的原子操作在多個線程之間分配任務,來提高分形渲染的效率。

《WebAssembly 多線程支持的內部原理》

​2019 年 WebAssembly 盤點:跟 Javascript 的相愛相殺 5

WebAssembly 接口類型:與所有事物互操作

為了使 WebAssembly 與主機通信,目前你需要大量的“膠水”代碼,以便通過線性內存對複雜類型進行序列化 / 反序列化。新的接口類型提案應該能消除對這種膠水代碼的需求,從而使與 WebAssembly 模塊的通信變得更加容易,甚至允許它們彼此無縫地通信。

《一篇漫畫帶你看懂 WebAssembly 與所有語言的互操作! 》

WebAssembly 音頻實驗

大多數 WebAssembly 演示應用都是可視的,但這一個有點不同,它是一個音頻演示,是使用 AssemblyScript 創建芯片調諧的實驗。你可以在 Peter 的博客中找到有關此項目的更多信息。

https://petersalomonsen.com/articles/webassemblysynth/intro.html

WebAssembly.sh 發布

Wasmer 是一個獨立的 WebAssembly 運行時,這個團隊有很多很棒的東西,選出其中一樣年度最佳是相當困難的。這篇文章宣布了 WebAssembly shell,它使你可以在瀏覽器中運行 Wasmer 模塊。我感覺 Wasmer 到目前為止呈現給我們的是一些拼圖碎片的集合,當這些碎片開始聚集在一起時,畫面就變得更加清晰,可以預料將會有很多激動人心的事情快要到來了。

https://medium.com/wasmer/webassembly-sh-408b010c14db

字節碼聯盟宣告成立

這可能是今年最大的事件,也就是字節碼聯盟的成立,它將 WASI 和其他各種倡議結合在一起,以創建一個用於執行第三方代碼的安全環境。這是很重要的事情,團隊希望解決 npm、crates 和其他各種程序包管理器中模塊的漏洞和惡意攻擊等重大問題。

https://hacks.mozilla.org/2019/11/announcing-the-bytecode-alliance/

總結:跟 JavaScript 差距還比較明顯

對於WebAssembly 來說,2019 年是有趣的一年,雖然我們看到WebAssembly 的發展超過我們預期,但是最近對JavaScript 開發人員進行的一項調查發現,只有一小部分人在使用WebAssembly,而且到目前為止,我們還沒有看到能夠使Web 開發人員真正傾心的殺手級演示。

《2019 年 JavaScript 生態圈調查報告出爐! 》

他們為什麼要遷移到 WebAssembly 上呢?畢竟在瀏覽器中運行的 JavaScript 為開發人員提供了一個成熟的(但仍在不斷變化!)的工作環境——JavaScript 幾乎無所不能。

我認為,儘管 WebAssembly 的名字裡有“Web”,但它將在瀏覽器之外產生更大的影響力。

作者介紹:

Colin Eberhardt 是 Scott Logic 技術總監,還是橫跨多個技術領域的多產技術作家、博客作者和演講者。

原文鏈接:
https://blog.scottlogic.com/2019/12/24/webassembly-2019.html