专业的编程技术博客社区

网站首页 > 博客文章 正文

WasmEdge 是什么?史上最快 WebAssembly 运行时?

baijin 2024-08-21 11:19:54 博客文章 3 ℃ 0 评论

家好,很高兴又见面了,我是"高级前端?进阶?",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发!

前言

WasmEdge 是一个轻量级、高性能和可扩展的 WebAssembly 运行时, 它是当今号称最快的 Wasm VM。

WasmEdge 是由 CNCF 托管的官方沙箱项目,而CNCF 是一个开源的、供应商中立的云原生计算中心,托管 Kubernetes 和 Prometheus 等项目,使云原生具有普遍性和可持续性

WasmEdge的用例包括现代 Web 应用程序架构(同构和 Jamstack 应用程序)、边缘云上的微服务、无服务器 SaaS API、嵌入式功能、智能合约和智能设备等方方面面。

WasmEdge 是世界上第一个正式的 CNCF WebAssembly 运行时项目,可以设想它将作为边缘云的关键任务轻量级运行时,在 CNCF 的开源云计算领域发挥重要作用。

1.WasmEdge 有那些典型特征

1.1 WasmEdge的主要特征

WasmEdge 可以运行从 C/C++、Rust、Swift、AssemblyScript 或 Kotlin 源代码编译的标准 WebAssembly 字节码程序。同时,它还受到标准语言和编译器工具链的支持,例如 LLVM、Rustc 和 emscripten。

WasmEdge在安全快速轻量可移植容器化的沙箱中运行 JavaScript,包括第 3 方 ES6、CJS 和 NPM 模块。 它还支持混合使用这些语言(例如,使用 Rust 实现 JavaScript API)、Fetch API 和边缘服务器上的服务器端渲染 (SSR) 功能。

WasmEdge目前支持所有标准的 WebAssembly 功能和扩展提案,例如:WASI 规范引用类型批量内存操作SIMD,同时也在积极探索 wasi-socket 提案以支持 WebAssembly 程序中的网络访问。 它还支持许多为云原生和边缘计算量身定制的扩展。例如,WasmEdge 网络套接字和 WasmEdge Tensorflow 扩展。

WasmEdge还支持针对特定应用场景设计的非标准扩展。

1.2 WasmEdge的典型场景扩展

WasmEdge包含下面典型的应用场景扩展。

  • Tensorflow开发人员可以使用简单的 Rust API 编写 Tensorflow 函数,然后在 WasmEdge 中以本机速度安全地运行该函数,同时WasmEdge也在积极支持其他人工智能框架。
  • Storage:WasmEdge 存储接口允许 WebAssembly 程序读写键值存储。
  • 命令界面: WasmEdge 使 webassembly 函数能够在主机操作系统中执行本机命令。 它支持传递参数、环境变量、STDIN / STDOUT 管道和主机访问的安全策略。
  • 以太坊: WasmEdge Ewasm 扩展支持编译为 WebAssembly 的以太坊智能合约,是以太坊 WebAssembly (Ewasm) 的领先实现。
  • Substrate: Pallet 允许 WasmEdge 在任何基于 Substrate 的区块链上充当以太坊智能合约执行引擎。

此外,WasmEdge 是一个“云原生”WebAssembly VM。 它支持 OCI(Open Container Initiative)规范,这允许 WasmEdge 实例由 Kubernetes 等云原生编排工具进行管理。

2.WasmEdge的使用

2.1 用JS创建WasmEdge程序

WebAssembly 最初是作为“浏览器的 JavaScript 替代品”,即在浏览器中安全地运行由 C/C++ 或 Rust 等语言编译的高性能应用程序。 即在浏览器中,WebAssembly 与 JavaScript 同时存在。

随着 WebAssembly 在云中的使用越来越多,它现在已成为云原生应用程序的通用运行时。 与 Linux 容器相比,WebAssembly 运行时以更低的资源消耗实现更高的性能。

在云原生场景,开发者希望使用 JavaScript 来编写业务应用, 这意味着必须在 WebAssembly 中支持 JavaScript。 此外,还要支持在 WebAssembly 运行时从 JavaScript 调用 C/C++ 或 Rust 函数,以利用 WebAssembly 的计算效率。 WasmEdge WebAssembly 运行时可以做到这一点。


接下来将演示如何在 WasmEdge 中运行和增强 JavaScript。

2.2 在 WasmEdge 上快速开始 JavaScript

首先为 WasmEdge 下载基于 WebAssembly 的 JavaScript 解释器程序,它基于 QuickJS。

curl -OL https://github.com/second-state/wasmedge-quickjs/releases/download/v0.4.0-alpha/wasmedge_quickjs.wasm

现在可以尝试一个简单的“hello world”JavaScript 程序 (example_js/hello.js),它将命令行参数打印到控制台。

import * as os from 'os';
import * as std from 'std';
args = args.slice(1);
print('Hello', ...args);
setTimeout(() => {
  print('timeout 2s');
}, 2000);

在 WasmEdge 的 QuickJS 运行时中运行 hello.js 文件,如下所示。请确保你已经安装了 WasmEdge。

$ wasmedge --dir .:. wasmedge_quickjs.wasm example_js/hello.js WasmEdge Runtime
Hello WasmEdge Runtime


2.2 WasmEdge函数嵌入主机应用程序

接下来将展示如何通过 WasmEdge Node.js SDK 将用 Rust 编写的 WebAssembly 函数合并到服务器上的 Node.js 应用程序中。 这种方法结合了 Rust 的性能、WebAssembly 的安全性和可移植性以及 JavaScript 的易用性。 一个典型的应用程序是按照如下流程工作的。

  • 主机应用程序是用 JavaScript 编写的 Node.js Web 应用程序,它进行 WebAssembly 函数调用。
  • WebAssembly 应用程序是用 Rust 编写的, 它在 WasmEdge 运行时内运行,并从 Node.js Web 应用程序调用。

2.2.1 WasmEdge Node.js SDK

下面例子的 Rust 程序将输入字符串添加到“hello”之后。 您可以在此库文件中定义多个外部函数,所有这些函数都可以通过 WebAssembly 供宿主 JavaScript 应用程序使用。

use wasm_bindgen::prelude::*;
#[wasm_bindgen]
pub fn say(s: String) -> String {
  let r = String::from("hello ");
  return r + &s;
}

接下来将 Rust 源代码编译成 WebAssembly 字节码,并为 Node.js 主机环境生成 JavaScript 模块。

rustwasmc build

所有文件都在 pkg/ 目录中, .wasm 文件是 WebAssembly 字节码程序,.js 文件用于 JavaScript 模块。

2.2.2 Node.js 主机应用程序

接下来,转到文件夹检查 JavaScript 程序 app.js。 有了生成的
wasmedge_nodejs_starter_lib.js 模块,编写 JavaScript 调用 WebAssembly 函数就非常容易了。 下面是节点应用程序 app.js, 它只是从生成的模块中导入 say() 函数。 节点应用程序从传入的 HTTP GET 请求中获取名称参数,并以“hello name”响应。

const { say } = require('../pkg/wasmedge_nodejs_starter_lib.js');
// .js表示JavaScript模块,并导入say方法
const http = require('http');
const url = require('url');
const hostname = '127.0.0.1';
const port = 3000;
const server = http.createServer((req, res) => {
  const queryObject = url.parse(req.url,true).query;
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/plain');
  // 服务响应
  res.end(say(queryObject['name']));
});
server.listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});

如下所示启动 Node.js 应用程序服务器。

$ node node/app.js
Server running at http://127.0.0.1:3000/

然后,您可以从另一个终端窗口对其进行测试

$ curl http://127.0.0.1:3000/?name=Wasm
hello Wasm

3.总结

本文只是告诉大家什么是WasmEdge?因为笔者不是这方面的专家,很多内容也就浅尝辄止。但是文末的参考资料提供了大量优秀文档以供学习,如果有兴趣可以自行阅读。

参考资料

https://www.secondstate.io/articles/wasmedge-joins-cncf/

https://github.com/WasmEdge/WasmEdge

https://www.cncf.io/

https://wasmedge.org/book/en/sdk/node.html

https://wasmedge.org/book/en/write_wasm/js/quickstart.html

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表