嵌入 WebAssembly 运行时和实例化 WebAssembly 模块的几大要素

简介: 嵌入 WebAssembly 运行时和实例化 WebAssembly 模块的几大要素

下面这段代码忽略了错误处理机制,介绍了如何在 Go 语言开发的宿主程序中嵌入 WebAssembly.

func createWasmVM(code []byte) {
    engine := wasmtime.NewEngine()
    module, _ := wasmtime.NewModule(engine, code)
    store := wasmtime.NewStore(engine)
    linker := wasmtime.NewLinker(engine)
    inst, _ := linker.Instantiate(store, module)
    _ = inst
}

这段代码涉及到几个重要的 WebAssembly 的概念,简单介绍如下:


  • 引擎(Engine):用于编译和管理 wasm 模块的全局上下文。
  • 模块(Module):已编译的 WebAssembly 模块。 该结构表示实例化后准备执行的内存中 JIT 代码。
  • 存储(Store):所有 WebAssembly 对象和主机值都将“连接”到存储。
  • 实例(Instance):一个实例化的 WebAssembly 模块,您可以从中实际获取一个函数,例如调用。实例化时,调用模块的启动函数。
  • 链接器(仅限 Wasmtime):将 wasm 模块/实例链接在一起的辅助结构。

上面的代码虽然创建了一个 WebAssembly 模块的实例,但是根据 WebAssembly 规范,start 函数会被执行。 但由于安全限制,无法输出执行结果,所以即使执行了也没效果。 因此,我们需要实现宿主程序与 WebAssembly 程序的互操作,为WebAssembly 程序提供输入/输出接口。


假设我们的 WebAssembly 程序有一个名为 sum 的函数,它接收两个整数变量作为参数并返回它们的和,宿主程序可以使用下面的代码来调用这个函数:


fn := inst.GetExport(store, "sum").Func()
r, _ := fn.Call(store, 1, 2)
fmt.Println(r.(int32))



虽然具体的调用方式与宿主程序的编程语言和所使用的WebAssembly运行时不同,但是运行时的文档一般都有相关的说明,按照文档来做就好了。


这里的难点在于如何从 WebAssembly 程序中导出 sum 函数,以便宿主程序可以找到并调用它。 前面说了,只要有编译器,任何语言都可以编译成WebAssembly,但是大部分语言在设计时都没有考虑WebAssembly的需求,也没有办法在WebAssembly中导出函数。所以这个问题只能通过特定编译器的非标准扩展来解决。也就是说,找到这个非标准扩展是解决问题最关键的一步。



相关文章
|
5月前
|
机器学习/深度学习 人工智能 测试技术
11种开源即插即用模块汇总 !!(附论文和代码)
11种开源即插即用模块汇总 !!(附论文和代码)
313 1
|
4月前
|
C++
c++语言核心技术要点,《运行时类型识别RTTI》
c++语言核心技术要点,《运行时类型识别RTTI》
45 2
|
5月前
|
JavaScript 前端开发 测试技术
编写JavaScript模块化代码主要涉及将代码分割成不同的文件或模块,每个模块负责处理特定的功能或任务
【5月更文挑战第10天】编写JavaScript模块化代码最佳实践:使用ES6模块或CommonJS(Node.js),组织逻辑相关模块,避免全局变量,封装细节。利用命名空间和目录结构,借助Webpack处理浏览器环境的模块。编写文档和注释,编写单元测试以确保代码质量。通过这些方法提升代码的可读性和可维护性。
39 3
|
存储 安全 编译器
嵌入 WebAssembly 运行时和实例化 WebAssembly 模块的几大要素
嵌入 WebAssembly 运行时和实例化 WebAssembly 模块的几大要素
|
5月前
|
前端开发 数据可视化 JavaScript
【iVX】颠覆常规,首个图形通用无代码编程平台诞生
【iVX】颠覆常规,首个图形通用无代码编程平台诞生
168 1
|
Java 测试技术 编译器
Enhancer - 轻量化的字节码增强组件包
一、问题描述 当我们的业务发展到一定阶段的时候,系统的复杂度往往会非常高,不再是一个简单的单体应用所能够承载的,随之而来的是系统架构的不断升级与演变。一般对于大型的 To C 的互联网企业来说,整个系统都是构建于微服务的架构之上,原因是 To C 的业务有着天生的微服务化的诉求:需求迭代快、业务系统多、领域划分多、链路调用关系复杂、容忍延迟低、故障传播快。微服务化之后带来的问题也很明显:服务的管理复杂、链路的梳理复杂、系统故障会在整个链路中迅速传播。
71 0
|
JavaScript 前端开发 数据库
Unity3d(webGL)构建数字孪生小案例(包含完整的数据交互体系)附赠完整代码
Unity3d(webGL)构建数字孪生小案例(包含完整的数据交互体系)附赠完整代码,请关注公众号:拼搏的小浣熊,获取简化版的代码!
|
安全 前端开发 JavaScript
使用Gatsby构建静态网站:快速、安全和可扩展
Gatsby是一款现代化的静态网站生成器,它结合了React和GraphQL的强大功能,可以帮助开发人员快速构建高性能、安全和可扩展的静态网站。本文将介绍如何使用Gatsby创建一个简单的静态网站,并展示一些实例代码来帮助您入门。
240 0
|
存储 自然语言处理 程序员
【C/C++】程序实现的两大环境(翻译环境&执行环境)
【C/C++】程序实现的两大环境(翻译环境&执行环境)
108 0