AoT 编译器
安装完成后(请参阅安装指南),用户可以执行 wasmedge compile 命令。
wasmedge compile 命令的用法如下:
$ wasmedge compile -h
USAGE
wasmedge compile [OPTIONS] [--] WASM WASM_SO
...
wasmedge compile 命令可将 WebAssembly 编译为本机机器码(即,AOT 编译器)。对于纯 WebAssembly,wasmedge 工具将以解释器模式执行 WASM。通过 wasmedge compile AOT 编译器编译后,wasmedge 工具可以以 AOT 模式执行 WASM,速度要快得多。
选项
wasmedge compile 命令的选项如下。
-h|--help:显示帮助信息。将忽略下面的其他参数。- (可选)
--dump:将 LLVM IR 转储到wasm.ll和wasm-opt.ll。 - (可选)
--interruptible:生成支持可中断执行的二进制文件。- 默认情况下,AOT 编译的 WASM 不支持异步执行中的中断。
- (可选)统计信息:
- 默认情况下,即使在运行
wasmedge工具时打开选项,AOT 编译的 WASM 也不支持所有统计信息。 - 使用
--enable-time-measuring生成用于启用执行时间测量统计的代码。 - 使用
--enable-gas-measuring生成用于启用执行中的 gas 测量统计的代码。 - 使用
--enable-instruction-count生成用于启用 WebAssembly 指令计数统计的代码。
- 默认情况下,即使在运行
- (可选)
--generic-binary:生成通用二进制文件。 - (可选)WebAssembly 提案:
- 使用
--disable-import-export-mut-globals禁用可变全局变量的导入/导出 提案(默认为ON)。 - 使用
--disable-non-trap-float-to-int禁用非陷阱浮点到整数转换 提案(默认为ON)。 - 使用
--disable-sign-extension-operators禁用符号扩展运算符 提案(默认为ON)。 - 使用
--disable-multi-value禁用多值 提案(默认为ON)。 - 使用
--disable-bulk-memory禁用批量内存操作 提案(默认为ON)。 - 使用
--disable-reference-types禁用引用类型 提案(默认为ON)。 - 使用
--disable-simd禁用固定宽度 SIMD 提案(默认为ON)。 - 使用
--enable-multi-memory启用多内存 提案(默认为OFF)。 - 使用
--enable-tail-call启用尾调用 提案(默认为OFF)。 - 使用
--enable-extended-const启用扩展常量表达式 提案(默认为OFF)。 - 使用
--enable-threads启用线程 提案(默认为OFF)。 - 使用
--enable-all启用上述所有提案。
- 使用
- (可选)
--optimize:选择 LLVM 优化级别。- 使用
--optimize LEVEL来设置优化级别。LEVEL应为0、1、2、3、s或z中的一个。 - 默认值为
2,即O2。
- 使用
- 输入的 WASM 文件(
/path/to/wasm/file)。 - 输出路径(
/path/to/output/file)。- 默认情况下,
wasmedge compile命令将输出通用的 WASM 格式。 - 如果在输出路径中指定了特定的文件扩展名(在 Linux 上为
.so,在 MacOS 上为.dylib,在 Windows 上为.dll),wasmedge compile命令将输出共享库格式。
- 默认情况下,
示例
我们创建了纯手工编写的 fibonacci.wat 并使用 wat2wasm 工具将其转换为 fibonacci.wasm WebAssembly 程序。以此为例,将它导出为一个接收单个 i32 整数作为输入参数的 fib() 函数。
你可以执行:
wasmedge compile fibonacci.wasm fibonacci_aot.wasm
或者:
wasmedge compile fibonacci.wasm fibonacci_aot.so # 在 Linux 上
输出将会是:
[2022-09-09 14:22:10.540] [info] compile start
[2022-09-09 14:22:10.541] [info] verify start
[2022-09-09 14:22:10.542] [info] optimize start
[2022-09-09 14:22:10.547] [info] codegen start
[2022-09-09 14:22:10.552] [info] output start
[2022-09-09 14:22:10.600] [info] compile done
然后,你可以使用 wasmedge 执行输出文件并测量执行时间:
time wasmedge --reactor fibonacci_aot.wasm fib 30
输出将会是:
1346269
real 0m0.029s
user 0m0.012s
sys 0m0.014s
接着,你可以与解释器模式进行比较:
time wasmedge --reactor fibonacci.wasm fib 30
输出显示,AOT 编译的 WASM 比解释器模式快得多:
1346269
real 0m0.442s
user 0m0.427s
sys 0m0.012s
输出格式:通用 WASM
默认情况下,wasmedge compile AOT 编译器工具可以将 AOT 编译的本机二进制文件包装为原始 WASM 文件中的自定义部分。我们称其为通用 WASM 二进制格式。
这个 AOT 编译的 WASM 文件与所有的 WebAssembly runtime 兼容。但是,当 WasmEdge runtime 执行此 WASM 文件时,WasmEdge 将从自定义部分提取本机二进制并以 AOT 模式执行它。
在 MacOS 平台上,通用 WASM 格式在执行时会产生 bus error。默认情况下,wasmedge compile 工具会以 O2 级别优化 WASM。我们正在尝试解决此问题。请使用共享库输出格式以暂时解决此问题。
wasmedge compile app.wasm app_aot.wasm
wasmedge app_aot.wasm
输出格式:共享库
用户可以为输出文件指定共享库扩展名(在 Linux 上为 .so,在 MacOS 上为 .dylib,在 Windows 上为 .dll),以生成共享库格式的输出。
这个 AOT 编译的 WASM 文件仅供 WasmEdge 使用,其他 WebAssembly runtime 无法使用。
wasmedge compile app.wasm app_aot.so
wasmedge app_aot.so