WasmEdge Rust bindings 发布新版本,找 Bug 赢大奖

serverless 技术社区 2022-08-03 17:14:56

伴随着 WasmEdge 0.10.1 发布,WasmEdge Rust bindings 的全新版本也闪亮登场:wasmedge-sdk v0.2.0wasmedge-sys v0.8.0。 你可以在 这里 找到相关 API 文档和源代码。关注 WasmEdge Rust bindings 的捉虫活动,Switch 大奖等你来拿

下图显示了 WasmEdge Rust bindings 的架构。 wasmedge-sys crate 定义了一组低级 Rust API,它们简单地包了 WasmEdge C-API 并提供相应的安全版本,而 wasmedge-sdk 定义了一组围绕应用程序的高级 Rust API。

我们建议大多数应用程序开发者使用 wasmedge-sdk crate。 因此,本文将重点介绍 wasmedge-sdk。 如果对 WasmEdge 低级 Rust API 的内部情况感兴趣,请可以查看wasmedge-sys 源代码

WasmEdge Rust bindings SDK 使 Rust 应用程序能够嵌入 WebAssembly 函数或模块。 这对于基于 Rust 的云原生或区块链基础设施软件特别有用,因为它们需要以安全有效的方式支持不受信任的用户函数。

wasmedge-sdk crate 的主要设计目标是使开发者能够使用 WasmEdge 轻松安全地将第三方代码合并到他们的 rust 应用程序中。 wasmedge-sdk crate 旨在为 Rust 开发者提供顺滑的体验。

下面让我们来看一个简单的例子吧!

wasmedge-sdk 开始

这个例子展示了如何从 Rust 程序运行 WasmEdge host 函数。 该函数也是用 Rust 编写的。 你也可以使用 C、TinyGo 或 JavaScript 等编程语言编写 WasmEdge 函数。

这里我们使用一个简单的 hello world 程序来解释 wasmedge-sdk 是如何工作的。 此示例演示了如何完成以下工作。

1.通过ImportObjectBuilder 加载第三方 native 函数
2.加载 native 函数生成的 Wasm 模块

有关 wasmedge-sdk 的更多示例,请查看此处

首先,确保已经在本地系统上安装了 Rust 和 WasmEdge。 如果想使用 WasmEdge 的 WasmEdgeProcess 插件,请注意 Linux 是唯一支持的操作系统。

接下来,从 WasmEdge repo 中获取 wasmedge-sdk 示例。

$ git clone https://github.com/WasmEdge/WasmEdge.git
$ cd /bindings/rust/

然后,使用下面的命令行从 wasmedge-sdk 文件运行 hello world 示例。

cargo run -p wamedge-sdk --example hello_world -- --nocapture

如果命令行成功运行,会看到 Hello, world! 在终端中打印出来,如下图所示。

现在让我们深入研究代码。 上述 Hello World 示例的源代码可以在这里找到。

让我们立即获取所有 imports 并开始:

// 如果使用 < 1.63 版本的 rust,请添加此特性
// #![feature(explicit_generic_args_with_impl_trait)]

use wasmedge_sdk::{params, Executor, ImportObjectBuilder, Module, Store};
use wasmedge_sys::WasmValue;
use wasmedge_types::wat2wasm;

定义一个 native 函数并创建一个 ImportObject

首先,让我们定义一个名为 say_hello_world 的 native 函数,它会打印出 Hello, World!

fn say_hello_world(_inputs: Vec<WasmValue>) -> Result<Vec<WasmValue>, u8> {
    println!("Hello, world!");

    Ok(vec![])
}

要在 WasmEdge runtime 中使用 native 函数作为 import 函数,我们需要一个 ImportObjectwasmedge-sdk 定义了一个 ImportObjectBuilder,它提供了一组用于创建 ImportObject 的 chaining 方法。我们看看具体方法:

// 创建一个 import 模块
let import = ImportObjectBuilder::new()
    .with_func::<(), ()>("say_hello", say_hello_world)?
    .build("env")?; 

现在,我们有一个名为 env 的 import 模块,它包含一个 host 函数 say_hello。 也许你注意到,我们用于 import 模块和 host 函数的名称与 Wasm 模块中出现的名称完全相同。 可以在下一节中找到 Wasm 模块。

加载一个 wasm 模块

现在我们加载一个 Wasm 模块。 wasmedge-sdkModule 中定义了两个方法:

  • from_file 从文件加载一个 Wasm 模块,并且同时验证已经加载的模块。

  • from_bytes 从内存字节数组中加载一个 Wasm 模块,同时验证加载的 Wasm 模块。

这里我们选择使用 Module::from_bytes 方法从内存字节数组中加载我们的 Wasm 模块。

let wasm_bytes = wat2wasm(
    br#"
(module
    ;; First we define a type with no parameters and no results.
    (type $no_args_no_rets_t (func (param) (result)))

    ;; Then we declare that we want to import a function named "env" "say_hello" with
    ;; that type signature.
    (import "env" "say_hello" (func $say_hello (type $no_args_no_rets_t)))

    ;; Finally we create an entrypoint that calls our imported function.
    (func $run (type $no_args_no_rets_t)
    (call $say_hello))
    ;; And mark it as an exported function named "run".
    (export "run" (func $run)))
"#,
)?;

// 从给定的内存字节加载一个 Wasm 模块并返回一个编译的模块
let module = Module::from_bytes(None, &wasm_bytes)?;

注册 import 模块和编译模块

要注册一个已编译的模块,我们需要检查它是否依赖于某些 import 模块。 在 Wasm 模块中,这条语句 (import "env" "say_hello" (func $say_hello (type $no_args_no_rets_t))) 告诉我们,它依赖于一个名为 env 的 import 模块。 因此,在注册编译好的 wasm 模块之前,我们需要先注册 import 模块。

// 创建一个 executor
let mut executor = Executor::new(None, None)?;

// 创一个 store 
let mut store = Store::new()?;

// 将 import 模块注册到 store 中
store.register_import_module(&mut executor, &import)?;

// 将编译好的模块注册到 store 中,并得到一个模块实例
let extern_instance = store.register_named_module(&mut executor, "extern", &module)?;

在上面的代码中我们使用 ExecutorStore 来注册 import 模块和已编译模块。wasmedge-sdk 也提供其它 APIs 来做同样的工作: Vm::register_import_moduleVm::register_module_from_bytes

运行导出的函数

现在可以运行导出的函数。

// 获取导出的函数 "run"
let run = extern_instance
    .func("run")
    .ok_or_else(|| anyhow::Error::msg("Not found exported function named 'run'."))?;

// 运行 host 函数
run.call(&mut executor, params!())?;

展望未来

很快,wasmedge-sdk 将添加对嵌入式 Wasm 和异步 host 函数的异步调用的支持。 另一个重要特性是支持 wasmedge-sdk 中的复杂接口类型,允许开发者将复杂的数据结构(如字符串和用户定义的复杂类型)传递给 Wasm VM。

为 wasmedge-sdk 的开发做贡献

wasmedge-sdk 还在开发中,期待社区的反馈。 下面是需要社区小伙伴帮助的类目。此外,针对每一次反馈,我们会寄出礼物作为感谢。在这里查看规则。

  • 试试 wasmedge-sdk,让我们知道如何改进。 此外,如果有任何问题,请提 issue
  • Bug 报告。 不可避免地,有一些我们没有涵盖的边缘测试用例。 如果发现新的 bug,请随时提出 issue 并告诉我们。
  • 查看文档。 文档对于开源软件来说是必不可少的。 如果发现文档有问题,请不要犹豫提 issue 或创建 PR 来修正。
  • 提出功能需求。 wasmedge-sdk 目前的特性来自我们用户的真实需求。 如果你有想到好的主意,请通过 issue 告诉我们。
...全文
318 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
内容概要:本文档详细介绍了“南方数码房地一体内外业软件”的操作流程,涵盖从数据准备、外业调查、内外业数据对接,到内业数据处理与成果输出的完整工作链。主要包括调查底图制作(支持DWG、MDB、SHP及倾斜三维模型等多种数据源)、导出外业IDB工程文件、平板端外业调查(宗地与房屋核实、电子签章表确认、照片导出)、内外业数据对接(DB与照片数据导入),以及内业的宗地信息完善、界址属性设置、自然幢生成、房屋面积计算、户属性录入,并最终输出宗地图、房产分户图、各类报表及MDB数据库等成果。; 适合人群:从事农村房地一体权籍调查的测绘、不动产登记及相关地理信息行业的内业处理人员、外业调查员和技术管理人员,需具备基础GIS或CAD操作能力; 使用场景及目标:①指导用户系统完成从原始数据到不动产登记成果的全流程作业;②实现外业调查数据高效采集与内业自动化处理衔接,提升房地一体确权登记工作的标准化与效率; 阅读建议:建议结合实际项目按章节顺序操作,重点关注数据格式转换、IDB工程交互逻辑及成果图输出设置,配合软件界面逐步实践,确保各环节数据完整性与准确性。
内容概要:本文围绕“面向高精度电流控制的PMSM多参数PSO辨识模型研究”,结合Simulink仿真实现,系统探讨了在高性能电机控制背景下,如何利用粒子群优化算法(PSO)对永磁同步电机(PMSM)电流环的关键参数进行多参数协同辨识。研究通过建立PMSM的精确动态数学模型,设计基于PSO的参数辨识框架,实现了对电机电感、电阻、反电动势常数等核心参数的高效在线或离线辨识,有效提升了电流控制的精度与系统鲁棒性。文中详细阐述了PSO算法的实现机制,包括适应度函数构造、参数编码策略与收敛判据,并在Simulink中构建了完整的联合仿真平台,通过大量仿真实验验证了该方法相较于传统辨识技术在准确性、稳定性和适应性方面的显著优势,为高动态性能电机驱动系统的参数获取提供了可靠的技术路径。; 适合人群:自动化、电气工程、控制科学与工程等相关专业的研究生、科研人员及从事高性能电机驱动系统开发的工程师。; 使用场景及目标:①应用于高端制造、新能源汽车、航空航天等领域中对电流控制精度要求极高的PMSM控制系统开发;②作为智能优化算法(如PSO)在电机参数辨识领域应用的典型案例,服务于教学演示与学术研究;③为后续开展自适应控制、智能容错控制及多物理场耦合建模等前沿课题提供坚实的参数辨识基础和技术参考。; 阅读建议:读者应具备扎实的电机控制理论基础(如FOC矢量控制、现代控制理论)以及熟练的MATLAB/Simulink仿真能力,建议在学习过程中结合文中的仿真模型,动手复现PSO参数辨识的完整流程,深入分析算法参数设置对辨识结果的影响,从而全面掌握其工程应用精髓。
内容概要:本文提出了一种基于粒子群优化算法(PSO)的配电网光伏储能双层优化配置模型,以IEEE33节点系统为标准算例,实现光伏发电单元与储能系统的协同选址与定容优化。该模型采用双层架构设计,上层以投资成本、运行经济性及网络损耗最小为目标优化设备配置方案,下层通过潮流计算评估系统在不同负荷场景下的运行性能,综合考虑电压稳定性、供电可靠性及可再生能源消纳能力,最终通过Matlab编程实现完整求解流程,为高渗透率分布式电源接入背景下的配电网规划提供了有效的技术支撑。; 适合人群:具备电力系统分析基础和Matlab编程能力的研究生、高校科研人员及从事新能源并网、智能配电网规划与优化的工程技术人员。; 使用场景及目标:①研究含高比例光伏接入的配电网规划与运行协同优化问题;②掌握双层优化建模方法与粒子群算法在复杂电力系统问题中的应用技巧;③为实际工程中分布式光伏与储能系统的科学选址与容量配置提供理论依据与仿真验证平台。; 阅读建议:建议读者结合Matlab代码深入理解双层迭代求解机制,重点关注算法收敛性分析、参数敏感性测试,并可通过更换初始种群、调整权重因子或引入其他标准测试系统(如IEEE69节点)进行对比实验,进一步验证所提模型的普适性与鲁棒性。

217

社区成员

发帖
与我相关
我的任务
社区描述
Serverless 技术爱好者的聚集地
其他 企业社区
社区管理员
  • serverless 技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧