前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用wavm运行wasi wasm程序

使用wavm运行wasi wasm程序

作者头像
有点技术
发布2020-07-13 11:21:44
1.6K0
发布2020-07-13 11:21:44
举报
文章被收录于专栏:有点技术有点技术

wasi介绍

WASI是一个新的API体系, 由Wasmtime项目设计, 目的是为WASM设计一套引擎无关(engine-indepent), 面向非Web系统(non-Web system-oriented)的API标准. 目前, WASI核心API(WASI Core)在做覆盖文件, 网络等等模块的API, 但这些实现都是刚刚开始实现, 离实用还是有很长路要走.

目前支持wasi的运行时有以下几种:

  • wasmer
  • wasmtime
  • wavm

wavm介绍

WAVM是WebAssembly虚拟机,设计用于非Web应用程序。

特点

  • 快速

WAVM使用LLVM将WebAssembly代码编译为具有接近本机性能的机器代码。在某些情况下,它甚至可以胜过本机性能,这要归功于它能够生成针对运行代码的确切CPU进行了调整的机器代码。

WAVM还利用虚拟内存和信号处理程序来执行WebAssembly的边界检查的内存访问,其成本与本机的未经检查的内存访问相同。

  • 安全

WAVM阻止WebAssembly代码访问WebAssembly虚拟机*之外的状态,或调用未与WebAssembly模块明确链接的本机代码。

安装

对于centos可以使用官方预编译rpm包进行安装

代码语言:javascript
复制
yum install -y https://github.com/WAVM/WAVM/releases/download/nightly%2F2020-05-28/wavm-0.0.0-prerelease-linux.rpm

用法示例

clone官方库

代码语言:javascript
复制
git clone https://github.com/WAVM/WAVM
cd Examples

运行官方示例程序

代码语言:javascript
复制
wavm run helloworld.wast
wavm run zlib.wasm
wavm run trap.wast
wavm run echo.wast "Hello, world!"
wavm run helloworld.wast | wavm run tee.wast
wavm run --enable simd blake2b.wast

拆解wasm为wast

disassemble通过disassemble可以将wasm拆解为wast可读格式

代码语言:javascript
复制
wavm disassemble zlib.wasm zlib.wast

设置cache

WAVMOBJECTCACHE_DIR 环境变量为wavm设置运行时缓存

代码语言:javascript
复制
export WAVM_OBJECT_CACHE_DIR=/path/to/existing/directory
wavm run huge.wasm # Slow
wavm run huge.wasm # Fast

使用rust 实现wasi规范的wasm程序

查看rust支持的目标

通过执行

代码语言:javascript
复制
rustup target list
  • asmjs-unknown-emscripten 通过emscripten 工具链编译为asmjs,asmjs也是为了解决js性能问题
  • wasm32-unknown-unknown。此目标直接使用 llvm 后端编译成 wasm。它适合纯 rust 代码编译,譬如你没有 C 依赖的时候。跟 emscripten 目标比起来,它默认就生成更加洗练的代码, 而且也便于设置搭建。此处查看如何设置搭建.
  • wasm32-unknown-emscripten。此目标利用 emscripten 工具链编译成 wasm。当你具有 C 依赖的时候就得使用它了,包括 libc
  • wasm32-wasi wasi规范的目标

创建rust lib项目

创建项目

代码语言:javascript
复制
cargo new --lib testwasi

项目配置

Cargo.toml中lib的配置如下

代码语言:javascript
复制
[lib]
name = "testwasi"
path = "src/lib.rs"
crate-type =["cdylib"]

代码实现

代码语言:javascript
复制
// # 直接把把名字作为符号写到目标文件中
#[no_mangle]
pub extern fn test(a: i32, b: i32) {
    let z = a + b;
    println!("The value of x is: {}", z);
}

编译

.cargo/config添加以下内容,制定编译结果为wasi格式

代码语言:javascript
复制
[build]
target = "wasm32-wasi"

执行 cargo build

或执行 cargo build--target=wasm32-wasi

使用wavm运行rust编译的wasm程序

代码语言:javascript
复制
# wavm run --function=test  --abi=wasi target/wasm32-wasi/debug/testwasi.wasm 1 2
The value of x is: 3

总结

wasm虽然一开始是为了解决js的性能问题,但是由于其高性能,跨平台,众多运行时支持,已经不局限于web端,走向服务端,现在已经应用于servicemesh、serverless等方向,个人认为其可能成为下一代的container,相信其未来必定有更广泛的应用场景。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-06-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 有点技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • wasi介绍
  • wavm介绍
  • 特点
  • 安装
  • 用法示例
    • 运行官方示例程序
      • 拆解wasm为wast
        • 设置cache
        • 使用rust 实现wasi规范的wasm程序
          • 查看rust支持的目标
            • 创建rust lib项目
              • 项目配置
                • 代码实现
                  • 编译
                    • 使用wavm运行rust编译的wasm程序
                    • 总结
                    领券
                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档