Wasm component model介绍

在前面的文章中,可以看到如何生成 wasip1 的wasm 模块。wasip1 中wasm 的使用中还有很多限制: 函数的入参只支持整型和浮点类型,不支持字符串类型。 使用共享内存的方式传递数据,数据要传递的话,入参只能使用指针和数据长度。 wasip1中一个wasm 文件就可以认为是一个module. wasip2 引入了 component model的概念,它扩展了module的功能,使用更高抽象的WIT(wasm interface type) 来描述module的接口。通过WIT, 可以把各个语言的实现翻译成canonical ABI ,定义了底层的内存是如何组织的,更高级的对象如何在内存中表示等等。 目前 component model 还是发展中,对于guest 语言来说,都有成熟的demo介绍如何使用WIT并生成wasm 文件。但是对于 host 来说,目前只有rust支持运行,还没有看到其他语言的例子。 WIT 的定义可以参考 https://component-model.bytecodealliance.org/design/wit.html。从这里也能看到具体语言的应用。 wasmtime 也支持了如何运行component model,只不过目前只能运行 “command” component。也就是说需要引入了wasi:cli/command world。 C 支持 component model 在介绍之前,首先安装 wit-bindgen, wasm-tools, WASI SDK , wkg这几个工具。 如果安装过 rust, 可以通过 cargo 安装。 安装 wkg cargo install wkg 安装 wit-bindgen cargo install wit-bindgen-cli 安装 wasm-tools cargo install wasm-tools 安装 WASI SDK,可以通过这里下载已经预编译的。...

March 11, 2025 · 1 min · 202 words

Wasm导入函数示例

从wasm技术介绍 里可以看到如何导出函数,并且在宿主机里进行调用。本文介绍如何进行导入函数,从宿主机导入函数并在wasm函数里使用。 还是基于tinygo 来进行演示。 首先定义导入函数 //go:build tinygo package main import ( "fmt" "reflect" "unsafe" ) //export CallFromHost func CallFromHost() int32 //export Add func Add(a, b int32) int32 { return a + b } type User struct { Name string Age int } //export CallHost func CallHost() int32 { return CallFromHost() } //export AddUser func AddUser(nameData *byte, nameLen int32, age int32) bool { fmt.Println(nameLen, age) name := RawBytePtrToString(nameData, int(nameLen)) user := User{Name: name, Age: int(age)} fmt....

March 8, 2025 · 3 min · 488 words

wasm技术介绍

什么是 WebAssembly WebAssembly(缩写为 Wasm)是一种基于堆栈的虚拟机的二进制指令格式。 Wasm 被设计为编程语言的可移植编译目标,支持在网络上部署客户端和服务器应用程序。 背景 目标很宏大, compile once , run anywhere。 特性 性能: 接近本机执行性能,编译成 low level 的二进制格式 安全: 沙箱的执行环境 多语言支持 可移植性: 跨平台,跨体系结构 有多种运行时 wasmtime wasmer wasmEdge wasmZero 两种编译技术 AOT JIT wasm 文本格式 参考:https://developer.mozilla.org/en-US/docs/WebAssembly/Guides/Understanding_the_text_format 定义个function并且导出 (module (func $add (param $lhs i32) (param $rhs i32) (result i32) local.get $lhs local.get $rhs i32.add) (export "add" (func $add)) ) 调用其它function (module (func $getAnswer (result i32) i32.const 42) (func (export "getAnswerPlus1") (result i32) call $getAnswer i32....

February 28, 2025 · 7 min · 1460 words