Emscripten

编译 C/C++(任何使用 LLVM 的语言) 到 WASM
1. `emcc` 首先将 C/C++ 代码编译成 LLVM IR(Intermediate Representation)。
2. 然后,`emcc` 使用 `llc` 工具将 LLVM IR 编译成目标机器的汇编代码。
3. 接着,`emcc` 使用 `s2wasm` 工具将汇编代码转换成 WebAssembly 二进制格式。
4. 最后,`emcc` 使用 `wasm-opt` 工具对 WebAssembly 模块进行优化,以提高性能和减小文件大小。


// 编译 Rust 指定 target 为 wasm32-unknown-emscripten
// 指定链接时参数:rustflags = ["-C", "link-args=-sEXPORT_ES6", "-C", "link-args=-sEXPORT_NAME=loadWASM"]
// -g2 保持原符号名称用于调试

Module['wasmBinary'] 指定 wasm 文件内容
Module.onRuntimeInitialized 表示 wasm 准备好的回调

git clone https://github.com/juj/emsdk.git
cd emsdk

# on Linux or Mac OS X
./emsdk install --build=Release sdk-incoming-64bit binaryen-master-64bit
./emsdk activate --global --build=Release sdk-incoming-64bit binaryen-master-64bit

# on Windows
emsdk install --build=Release sdk-incoming-64bit binaryen-master-64bit
emsdk activate --global --build=Release sdk-incoming-64bit binaryen-master-64bit

# on Linux or Mac OS X
# 每次执行,在当前 shell 中使用 emcc
source ./emsdk_env.sh

# on Windows
emsdk_env.bat

emcc hello.c -s WASM=1 -o hello.html
hello.js 中输出 Module 对象;
Module.onRuntimeInitialized