龙空技术网

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

高级前端进阶 623

前言:

当前兄弟们对“js执行速度”大致比较重视,姐妹们都需要学习一些“js执行速度”的相关内容。那么小编也在网摘上汇集了一些关于“js执行速度””的相关知识,希望看官们能喜欢,大家一起来学习一下吧!

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

高级前端‬进阶

前言

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 

现在可以尝试一个简单的“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 RuntimeHello 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 {hostname}:${port}/`);});

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

$ node node/app.jsServer running at 

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

$ curl  Wasm
3.总结

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

参考资料

标签: #js执行速度