用Wasm连接Rust与Python | Rust 学习笔记(三)
The following article is from 李大狗Leeduckgo Author 李大狗就是我
本文是"Rust 学习笔记"系列的第三篇。其他两篇请见文末。
https://github.com/leeduckgo/Rust-Study/tree/main/b64-encoder
但是,在浏览器中运行只是 Wasm 的玩法之一:
WebAssembly 是一种新的编码方式,可以在现代的网络浏览器中运行 - 它是一种低级的类汇编语言,具有紧凑的二进制格式,可以接近原生的性能运行,并为诸如 C / C ++ 等语言提供一个编译目标,以便它们可以在 Web 上运行。它也被设计为可以与 JavaScript 共存,允许两者一起工作。
简而言之,对于网络平台而言,WebAssembly 具有巨大的意义——它提供了一条途径,以使得以各种语言编写的代码都可以以接近原生的速度在 Web 中运行。在这种情况下,以前无法以此方式运行的客户端软件都将可以运行在 Web 中。
Wasm 还有另一种套玩法 —— 我们可以将 WASM 作为普通程序运行,也可以成为其他编程语言的模块,这也是本文所要讨论的。
作为普通程序/普通模块,Wasm 具有如下两点 AmAzING 的特性:
1.安全访问
你现在找到的大部分 WebAssembly 教程和例子都是聚焦在浏览器之中,比如如何加速网页或者网页应用各种各样的功能。无论如何,WebAssembly 真正强大的领域但是被提及的很少:浏览器之外的领域;也是我们接下来系列关注的点。
视频游戏的脚本语言;
最低负载运行代码,就像 Fastly/Cloudflare 的边缘计算(compute-at-edge)场景;
最低运行负载在 IOT 设备安全地运行易于更新的代码;
不需要 JIT 就能在你的环境中获取极快的性能;
https://n3xtchen.github.io/n3xtchen/rust/2020/08/17/webassembly-without-the-browser-part1
Wasm
程序可以很好的成为不同编程语言程序之间沟通的桥梁,同时避免了在一台服务器上安装多种语言的环境。Wasm
程序写的模块:https://github.com/bytecodealliance/wasmtime-py
注:本文对如下内容有所参考—— https://zhuanlan.zhihu.com/p/352196567
1 创建 Rust Lib 程序
cargo new foobar
wasm
程序,即是一个库。--lib
参数以生成一个库项目。cargo new --lib adder
2 完善 Rust Lib 程序
lib.rs
的内容:#[no_mangle]
pub extern "C" fn adder(a: i32, b: i32) -> i32 {
a + b
}
#[no_mangle]
:#[no_mangle]
告诉Rust编译器不要修改函数名称,这样我们才能在其他程序中通过函数名调用生成的Wasm
,不写会生成 _ZN4rustfn1_34544tert54grt5
类似的混淆名。Cargo.toml
文件中,我们添加如下代码:[lib]
crate-type = ['cdylib']
3 编译为 Wasm 模块
cargo build --release --target wasm32-wasi
target/wasm32-wasi/release
目录下看到adder.wasm
文件。4 通过 Python 调用 Wasm
https://github.com/wasmerio/wasmer-python
pip3 install wasmer==1.0.0
pip3 install wasmer_compiler_cranelift==1.0.0
target/wasm32-wasi/release
目录下。python
或者ipython
。from wasmer import engine, Store, Module, Instance
from wasmer_compiler_cranelift import Compiler
# Let's define the store, that holds the engine, that holds the compiler.
store = Store(engine.JIT(Compiler))
# Let's compile the module to be able to execute it!
module = Module(store, open('adder.wasm', 'rb').read())
# Now the module is compiled, we can instantiate it.
instance = Instance(module)
# Call the exported `sum` function.
result = instance.exports.adder(5, 37)
print(result) # 42!
https://github.com/leeduckgo/Rust-Study
python3 run_adder.py