emscripten编写wasm
时间:2023-03-28 01:40:40
HTML
emscripten使用的是LLVM编译器。emscripten官方文档环境需要python2.7.12+,3也可以。mime-type媒体类型,application/wasm,可以通过httpheader来验证。安装#下载emsdk仓库gitclonehttps://github.com/emscripten-core/emsdk.git&&cdemsdk#下载安装sdk./emsdkinstalllatest#激活最新sdk./emsdkactivatelatest#激活终端环境变量源./emsdk_env.sh也可以加入环境变量#emsdkexportPATH=$PATH:$YOUR_DIR/emsdkexportPATH=$PATH:$YOUR_DIR/emsdk/node/14.18.2_64bit/binexportPATH=$PATH:$YOUR_DIR/emsdk/upstream/emscripten验证emsdk列出一个简单的wasm程序我;for(i=2;i
编译查看结果emcccalculate_prime.c-ohtml_template.html形成三个文件html_template.htmlhtml_template.jshtml_template.wasmhtml主要包括wasm通过webAPI运行的引用和实例化以及emsdk通过js提供的工具。当然也可以只生成js文件。emcccalculate_prime.c-ojs_plumbing.js生成文件js_plumbing.jsjs_plumbing.wasm生成的wasm文件是一个二进制文件,我们可以将wasm转成wat来读取。#https://github.com/webassembly/wabtwasm2watjs_plumbing.wasm-ojs_plumbing.wat打开你会看到这样的代码片段。(如何读懂wasm?)(模块(类型(;0;)(func(parami32i32i32)(结果i32)))(类型(;1;)(func(parami32)(结果i32)))(type(;2;)(func(resulti32)))(type(;3;)(func(parami32)))wasm与javascript交互side_module.cintIncrement(intx){returnx+1;}compileemccside_module.c-sSIDE_MODULE=2-O1-sEXPORTED_FUNCTIONS=\["_Increment"\]-oside_module.wasm-sSIDE_MODULE=2:将代码编译为sidemodule,emcc不会在生成的模块中包含C的标准库优化标志-O1,默认-O0。-O0保留无关函数;-O1进行treesharking;-O2压缩和treesharking-sEXPORTED_FUNCTIONS=['_Increment']指定Increment为导出函数,需要加上_在前面,允许多个.*.wasm后缀只生成webAssembly文件。index.js加载wasmconstwasmBinaryFile='side_module.wasm'/***WebAssembly.Memory*包含内存、表、全局变量、函数引用等*/constenv={'__table_base':0,'memory':newWebAssembly.Memory({initial:256,maximum:256}),'__memory_base':1024,};WebAssembly.instantiateStreaming(fetch(wasmBinaryFile),{env},).then(result=>{constincrement=result.instance.exports.Increment;console.log('getwasmexportfunction:',increment);increment&&console.log(increment(17).toString())})