Emscripten 將默認 LLVM WebAssembly 為 WASM 後端

←手機掃碼閱讀     admin @ 2019-08-06 , reply:0

Emscripten 是一個獨特的 LLVM 後端,它可以將 LLVM 位元組碼編譯成 JavaScript(asm.js),往上追溯其實也就是通過 Clang 將 C 和 C++ 代碼編譯成 JavaScript(asm.js),可以大大簡化現有代碼在 Web 時代的重用。除了 asm.js,Emscripten 還支持 WebAssembly 這一更加先進的 Web 技術,通過與 asm.js 類似的機制,Emscripten 可以生成 WASM 二進位位元組碼。

原本 Emscripten 的 WebAssembly 後端用的是 fastcomp,但之前已經增加了 LLVM WebAssembly 後端選項,並且二者保持并行開發。近期 JS 引擎 V8 官方發表博客表示很快將默認使用 LLVM WebAssembly 作為 Emscripten 的 WebAssembly 後端,因為 LLVM WebAssembly 後端現在在大多數指標上都已經超越了 fastcomp 後端。V8 團隊介紹了具體原因,並給出了基準測試結果:

鏈接更快

LLVM WebAssembly 後端加上wasm-ld可以完全支持 WebAssembly 目標文件增量編譯。fastcomp 在位元組碼文件中使用 LLVM IR,這意味著在鏈接時,所有 IR 都將由 LLVM 編譯,所以 fastcomp 鏈接慢。另一方面,WebAssembly 對象文件 .o 包含已編譯的 WebAssembly,它們可以像原生鏈接一樣鏈接,因此,鏈接步驟可以比使用 fastcomp 快得多。

基準測試結果是 LLVM WebAssembly 鏈接速度是 fastcomp 的 7 倍:

速度更快,代碼更小

LLVM WebAssembly 後端技術棧在基準測試中速度和代碼大小都擊敗了 fastcomp。

宏觀基準測試結果是速度平均提升了 3.2%。

總體而言,宏觀基準代碼大小平均減小了 3.7%,而在實際項目中,Cube 2 遊戲引擎的 Web 移植版本 BananaBread,減小了 6% 以上,Doom 3 則減小了 15%。

這樣的改進得益於:

  • LLVM 的後端代碼比較智能,可以做像 fastcomp 這樣的簡單後端無法做到的事情,比如 GVN(Global value numbering,全局值編碼)。

  • 新的 LLVM 具有更好的 IR 優化。

  • 團隊在 WebAssembly 後端輸出調整 Binaryen 優化器方面做了許多工作。

支持所有 LLVM IR

fastcomp 可以處理由 clang 產出的 LLVM IR,但因為架構原因經常會在其它源上失敗,特別是在將 IR 合法化為 fastcomp 可以處理的類型時。另一方面,LLVM WebAssembly 後端使用通用的 LLVM 後端基礎結構,因此可以處理所有內容。

新的 WebAssembly 功能

fastcomp 在運行 asm2wasm 之前編譯出 asm.js,這意味著很難處理新的 WebAssembly 功能,如尾調用、異常與 SIMD 等。

來自上游更快的常規更新

使用上游 WebAssembly 後端意味著可以始終使用最新的 LLVM 上游,這意味著可以儘快獲得 clang 中新的 C++ 語言功能、新的 LLVM IR 優化等。

切換到默認 LLVM WebAssembly 后,fastcomp 仍然是一個可選項,V8 團隊表示最終會完全刪除 fastcomp,這樣做可以消除重大的維護負擔,能夠更多地關注於 WebAssembly 後端的新功能,並且加速 Emscripten 的一般改進。

詳情查看原文:

https://v8.dev/blog/emscripten-llvm-wasm





[admin ]

來源:OsChina
連結:https://www.oschina.net/news/108824/emscripten-llvm-wasm
Emscripten 將默認 LLVM WebAssembly 為 WASM 後端已經有30次圍觀

http://coctec.com/news/all/show-post-211722.html