WebAssembly是一种可移植的二进制指令集格式,其本身与平台无关,类似于Java的class文件字节码。相比于浏览器的运行时,wasmtime是一个独立运行时环境,它可以脱离Web环境来执行wasm代码。它本身提供了命令行工具和API两种方式来执行wasm代码。本文主要介绍如何使用API方式来运行wasm代码。
WebAssembly本来的设计初衷是想让浏览器可以运行C语言这种编译型语言的代码。通常我们的C语言代码会使用gcc或clang等编译器直接编译链接成与平台相关的二进制可执行文件,这种与平台相关的二进制文件浏览器是无法直接运行的。如果想让浏览器运行C语言代码,就需要使用可将C语言编译成WebAssembly指令的编译器,编译好的代码是wasm格式。然后就可以使用各种wasm运行时来执行wasm代码,这就类似于JVM虚拟机执行class文件。
由于指令集和运行时环境本身与web场景并不绑定,因此随着后来的发展,WebAssembly指令集出现了可以脱离浏览器的独立运行时环境,WebAssembly的用途也变得更加广泛。
由于我们不需要在Web环境中运行Rust代码,因此我们选择安装wasm32-unknown-unknown和wasm32-wasi两个目标。运行以下两条指令,将这两个目标平台加入到当前使用的Rust工具链中。
- wasm32-unknown-emscripten:这个target是为了在Emscripten工具链下编译Wasm。Emscripten是一个将C/C++代码编译为Wasm和JavaScript的工具链。使用这个target,你可以在浏览器环境中运行编译后的Wasm代码。
- wasm32-unknown-unknown:这个target是为了在没有任何操作系统支持的情况下运行WebAssembly代码而设计的。这种情况下,WebAssembly代码将运行在一个“裸机”环境中,没有任何操作系统提供的支持。因此,如果你需要在裸机环境中运行WebAssembly代码,那么使用这个target是一个不错的选择。
- wasm32-wasi:这个target是为了在WebAssembly System Interface (WASI)上运行WebAssembly代码而设计的。WASI是一个标准接口,它提供了一些操作系统级别的功能,如文件系统和网络访问等。因此,如果你需要在WebAssembly中访问这些操作系统级别的功能,那么使用这个target是一个不错的选择。
Emscripten is a complete compiler toolchain to WebAssembly, using LLVM, with a special focus on speed, size, and the Web platform.使用如下命令下载emsdk
WebAssembly目前支持两种标准API:
Emscripten对JavaScript API做了重构,将其包装在与WASI接口一样的API中,然后Emscripten在编译代码时,将尽可能的使用WASI APIs,以此来避免不必要的API差异。因此Emscripten编译出来的wasm文件大部分时候可以同时运行在Web和非Web环境中。
- Web APIs
- WASI APIs
C语言的调用约定规定了函数参数的传递方式、返回值的处理方式以及堆栈的清理方式。这样就定义好了Rust项目中可以让外部使用的add方法。
emscripten支持将代码编译成两种不同的module
通常一个完整的项目只能有一个Main module,这个Main module可以链接多个Side module
- Main modules:系统库会被链接进去
- Side modules:系统库不会被链接进去
这里的编译选项SIDE_MODULE可以被设置为1或者2,设置成2则编译器会优化掉大量未被使用的代码或未被标记为EMSCRIPTEN_KEEPALIVE的代码,设置成1则会保留所有代码。
如果没有安装wasm2wat命令可以使用一下命令来安装执行wasm2wat toolbox.wasm -o toolbox.wat命令后,可以打开toolbox.wat文件查看其结构如下复制代码
- sudo apt install wabt
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) | Powered by Discuz! X3.4 |