嵌入 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中导出函数。所以这个问题只能通过特定编译器的非标准扩展来解决。也就是说,找到这个非标准扩展是解决问题最关键的一步。



相关文章
|
4月前
|
C++
c++语言核心技术要点,《运行时类型识别RTTI》
c++语言核心技术要点,《运行时类型识别RTTI》
45 2
|
存储 安全 编译器
嵌入 WebAssembly 运行时和实例化 WebAssembly 模块的几大要素
嵌入 WebAssembly 运行时和实例化 WebAssembly 模块的几大要素
|
JavaScript 前端开发 数据库
Unity3d(webGL)构建数字孪生小案例(包含完整的数据交互体系)附赠完整代码
Unity3d(webGL)构建数字孪生小案例(包含完整的数据交互体系)附赠完整代码,请关注公众号:拼搏的小浣熊,获取简化版的代码!
|
安全 前端开发 JavaScript
使用Gatsby构建静态网站:快速、安全和可扩展
Gatsby是一款现代化的静态网站生成器,它结合了React和GraphQL的强大功能,可以帮助开发人员快速构建高性能、安全和可扩展的静态网站。本文将介绍如何使用Gatsby创建一个简单的静态网站,并展示一些实例代码来帮助您入门。
240 0
|
存储 自然语言处理 程序员
【C/C++】程序实现的两大环境(翻译环境&执行环境)
【C/C++】程序实现的两大环境(翻译环境&执行环境)
108 0
|
前端开发
封装库/工具库中重要概念之组件库
前端开发中,封装库和工具库是非常重要的组成部分。它们可以帮助我们提高代码复用性和可维护性,从而缩短开发周期和降低维护成本。在封装库和工具库中,组件库是其中最为重要和常用的一种,因为它们可以帮助我们快速构建复杂的 UI 界面。
245 0
|
vr&ar 图形学 Windows
CATIA等设计类软件实时渲染流化解决方案
**实时渲染技术可以实现在VR/AR眼镜中查看CATIA模型,其实不仅仅是VR和AR眼镜,还可以是手机、平板、电脑中直接打开网页就可以查看和浏览CATIA等3D模型。而VR/AR眼镜中通过实时渲染技术不仅仅可以查看CATIA模型,其他的比如BIM/Unreal/unity等模型也都是OK的。**那具体是怎么实现的呢?使用起来麻烦吗?能不能支持多人同时使用呢?关于这些对于实时渲染比较相关的问题,这里点量云小芹做统一解释说明。
201 0
CATIA等设计类软件实时渲染流化解决方案
|
Web App开发 JavaScript Java
几张图让你看懂WebAssembly
(图片来源:giphy.com) 编者按:本文由明非在众成翻译平台上翻译。 最近,WebAssembly 在 Java 圈非常的火!人们都在谈论它多么多么快,怎样怎样改变 Web 开发领域。
1815 0
|
存储 Java Android开发
Android插件化开发之动态加载技术学习
Android插件化开发之动态加载技术学习 为什么要插件化开发和动态加载呢?我认为原因有三点: 可以实现解耦 可以解除单个dex函数不能超过65535的限制 可以给apk瘦身,比如说360安全卫士,整个安装包才13.
2110 0