天天看點

嘗試 WebAssembly

wasm 為浏覽器應用開辟了一個全新的領域。意義非凡,并不是一句兩句說的清的,今天正好有點空做些實驗。

1. emsdk 的安裝

Emscripten 可以直接将 C/C++ 編譯為 wasm,讓用 C 寫的代碼可以在浏覽器中運作,還是看不見代碼那種 :)

沒有過多糾結他怎麼打包的,反正直接從 github 上下了最新的源碼包過來就可以用了:

download emsdk-master.zip

unzip emsdk-master.zip

cd emsdk-master

( emsdk-master update )

emsdk install latest

emsdk activate latest

然後添加 emsdk 的環境變量,我這裡直接追加在了 ~/.bashrc 的最後:

. (前面解壓的路徑)/emsdk-master/emsdk_env.sh

或者你可以把 env.sh 裡面的内容直接拷貝到 .bashrc 裡面去。

------

到此 emsdk 安裝完成。

如果中間出什麼問題,估計是你系統的編譯工具啥的安裝不完整導緻的:

sudo apt update

sudo apt install python2.7 nodejs build-essential cmake git-core default-jre

2. hello_world.html

是的,emsdk 支援直接把你的 C 代碼編譯成一個 html 檔案。主要是因為 wasm 沒法直接在浏覽器運作,需要 js 将其載入,再調用啥的。直接使用官方的編譯為 *.html 的方法,可以降低入門門檻。

使用的 C 代碼:

#include <stdio.h>
int main(int argc, char ** argv) {
  printf("Hello, world!\n");
}      

編譯指令:

emcc hello.c -o hello.html      

因為這裡沒法直接點解 hello.html 來運作 wasm,是以,需要起個 web 伺服器。所幸是 emsdk 還帶了個伺服器:

emrun --no_browser --port 8800 .      

或者你也可以直接使用 python3 的 web 伺服器:

python3 -m http.server 8800      

然後,在你的浏覽器裡面就可以看到這結果了。

嘗試 WebAssembly

2. 自己寫加載器

官方的這個 html 真的是有點醜,我們也可以自己寫個加載器,将 wasm 中的函數加載過來。

測試的 C 函數:

1 int fib(int n) {
  2     int i;
  3     int t;
  4     int a = 0;
  5     int b = 1;
  6 
  7     for(i = 0; i < n; i++) {
  8         t = a + b;
  9         a = b;
 10         b = t;
 11     }
 12 
 13     return b;
 14 }      

将其編譯為 wasm 子產品(别問我為什麼,官方說的,我也沒研究為啥):

emcc fib.c -Os -s WASM=1 -s SIDE_MODULE=1 -o fib.wasm      

然後我們就可以自己寫個網頁來加載它了:

<html>
<body>
  <script>
    fetch('fib.wasm').then(response =>
      response.arrayBuffer()
    ).then(bytes =>
      WebAssembly.instantiate(bytes, {imports: {}})
    ).then(results => {
      window.fib = results.instance.exports.fib;
    });
  </script>
</body>
</html>      

開啟 web 伺服器,然後打開浏覽器試試看。

因為上面的代碼隻是引入 wasm 中的函數到 javascript,是以我們要執行這個函數需要打開調試 console:

嘗試 WebAssembly

——————

無論在哪裡做什麼,隻要堅持服務、創新、創造價值,其他的東西自然都會來的。