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
然後,在你的浏覽器裡面就可以看到這結果了。
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:
——————
無論在哪裡做什麼,隻要堅持服務、創新、創造價值,其他的東西自然都會來的。