WasmEdge C SDK

文档 WasmEdge C API 里提供了访问 WasmEdge 运行时的接口。以下内容是关于如何使用 WasmEdge C API 的简单说明。如果要了解 WasmEdge C API 的更多细节,请参考完整的文档。

WasmEdge 运行时快速指南

以下是运行一个 WASM 文件的示例。 假设 WASM 文件fibonacci.wasm已经被拷贝到当前目录,并且 C 文件 test_wasmedge.c 的源代码如下所示:

1. #include <wasmedge/wasmedge.h>
2. #include <stdio.h>
3. int main(int Argc, const char* Argv[]) {
4. /* 创建配置上下文以及 WASI 支持。 */
5. /* 除非你需要使用 WASI,否则这步不是必须的。 */
6. WasmEdge_ConfigureContext *ConfCxt = WasmEdge_ConfigureCreate();
7. WasmEdge_ConfigureAddHostRegistration(ConfCxt, WasmEdge_HostRegistration_Wasi);
8. /* 创建VM的时候可以提供空的配置。*/
9. WasmEdge_VMContext *VMCxt = WasmEdge_VMCreate(ConfCxt, NULL);

11. /* 参数以及返回的数组。 */
12. WasmEdge_Value Params[1] = { WasmEdge_ValueGenI32(32) };
13. WasmEdge_Value Returns[1];
14. /* 要调用的函数名。 */
15. WasmEdge_String FuncName = WasmEdge_StringCreateByCString("fib");
16. /* 运行文件里的 WASM 函数。 */
17. WasmEdge_Result Res = WasmEdge_VMRunWasmFromFile(VMCxt, Argv[1], FuncName, Params, 1, Returns, 1);

19. if (WasmEdge_ResultOK(Res)) {
20. printf("Get result: %d\n", WasmEdge_ValueGetI32(Returns[0]));
21. } else {
22. printf("Error message: %s\n", WasmEdge_ResultGetMessage(Res));
23. }

25. /* 资源析构。 */
26. WasmEdge_VMDelete(VMCxt);
27. WasmEdge_ConfigureDelete(ConfCxt);
28. WasmEdge_StringDelete(FuncName);
29. return 0;
30. }

接下来你可以编译并且运行它:(索引从 0 开始的情况下,斐波那契数列的的第 32 个数值是 3524578 )

1. $ gcc test_wasmedge.c -lwasmedge_c -o test_wasmedge
2. $ ./test_wasmedge fibonacci.wasm
3. Get result: 3524578

如果要了解 API 的细节,请参考 API 头文件.

WasmEdge AOT 编译器快速指南

假设 WASM 文件 fibonacci.wasm 已经被拷贝到当前目录,并且 C 文件 test_wasmedge_compiler.c 的代码如下所示:

1. #include <wasmedge/wasmedge.h>
2. #include <stdio.h>
3. int main(int Argc, const char* Argv[]) {
4. /* 创建配置上下文。 */
5. WasmEdge_ConfigureContext *ConfCxt = WasmEdge_ConfigureCreate();
6. /* ... 通过配置上下文调整配置。 */
7. /* 结果。 */
8. WasmEdge_Result Res;

10. /* 创建编译器上下文。配置上下文可以为空。 */
11. WasmEdge_CompilerContext *CompilerCxt = WasmEdge_CompilerCreate(ConfCxt);
12. /* 根据指定的输入和输出路径来编译 WASM 文件。 */
13. Res = WasmEdge_CompilerCompile(CompilerCxt, Argv[1], Argv[2]);
14. if (!WasmEdge_ResultOK(Res)) {
15. printf("Compilation failed: %s\n", WasmEdge_ResultGetMessage(Res));
16. return 1;
17. }

19. WasmEdge_CompilerDelete(CompilerCxt);
20. WasmEdge_ConfigureDelete(ConfCxt);
21. return 0;
22. }

接下来你可以编译和运行它(输出的文件是 “fibonacci.wasm.so” ):

1. $ gcc test_wasmedge_compiler.c -lwasmedge_c -o test_wasmedge_compiler
2. $ ./test_wasmedge_compiler fibonacci.wasm fibonacci.wasm.so
3. [2021-07-02 11:08:08.651] [info] compile start
4. [2021-07-02 11:08:08.653] [info] verify start
5. [2021-07-02 11:08:08.653] [info] optimize start
6. [2021-07-02 11:08:08.670] [info] codegen start
7. [2021-07-02 11:08:08.706] [info] compile done

编译后的的 WASM 文件也可以直接作为 WasmEdge 运行时的输入。 以下是解释模式和 AOT 模式的一个对比:

1. $ time ./test_wasmedge fibonacci.wasm
2. Get result: 5702887

4. real 0m2.715s
5. user 0m2.700s
6. sys 0m0.008s

8. $ time ./test_wasmedge fibonacci.wasm.so
9. Get result: 5702887

11. real 0m0.036s
12. user 0m0.022s
13. sys 0m0.011s

如果要了解这些 API 的细节,请参考API 头文件。