百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

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

ccwgpt 2024-11-03 12:46 118 浏览 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

相关推荐

NestJS入门教程系列一

介绍Nest(NestJS)是用于构建高效,可扩展的Node.js服务器端应用程序的框架。它使用渐进式JavaScript,内置并完全支持TypeScript(但开发人员仍然能够使用JavaScrip...

【推荐】一个网盘资源搜索与转存工具,支持移动端与PC端!

如果您对源码&技术感兴趣,请点赞+收藏+转发+关注,大家的支持是我分享最大的动力!!!项目介绍CloudSaver是一个基于Vue3和Express的网盘资源搜索与转存开源实用工具。它支持...

Appium原理精讲

目前使用Appium新版本和旧版本的企业数目都很多,而两个版本的安装过程和api的使用又有较大的区别。但是无论表面上的东东如何变化,内部原理都是一样的。在这里我给大家介绍一下appium的核心,增进大...

Kubernetes最小部署单元Pod

一、Kubernetes与Pod简介在当今云计算和容器化技术盛行的时代,Kubernetes已然成为容器编排领域的中流砥柱。它是一个开源的容器编排平台,由Google基于其内部使用的Bo...

最常用的四种跨域解决方案

前置知识什么是跨域?浏览器发送的请求地址(URL)与所在页面的地址不同(端口/协议/域名其一不同)。简言之,浏览器发出的请求url,与其所在页面的url不一样。此时,同源策略会让浏览器拒收服务器...

Bolt.New —— 全栈AI Web自动编程

Bolt.New是由StackBlitz公司推出的,全栈AI工具,代码编辑、运行、部署,通通一站式搞定。它使用WebContainers技术,无需任何本地安装或配置,在浏览器中,就可以运行完整的No...

Nodejs Express新手教程&高手进阶

NodejsExpress新手教程&高手进阶Express是一个NodeJS平台的框架,主要用于构于Web服务器项目。本文将通过示例介绍适合新手入门的Express基础使用,以及高手进阶知识,如:c...

Express.js 创建Node.js Web应用

Express.js是一个基于Node.js的Web应用框架,框架的设计目的是构建应用的架构和简化应用的开发。框架会解决一些通用的问题,在Express.js中,Express框架会处理如:中间件、代...

JavaScript 的 Express.js 功能及应用场景详解

Express.js是一个基于Node.js的轻量级Web应用框架,主要用于快速构建服务器端应用和API。它的核心功能包括以下关键点:1.路由管理URL路径与HTTP方法映射:通过...

nodejs的express4文件下载

在nodejs的express框架中,下载变得非常简单,就一个方法,res.download()首先express命令行生成项目基本框架:不会的看这里:http://blog.csdn.net/zz...

Express 系列:快速生成一个项目

系列预告本系列将以一个项目入手结合相关技术细节来带领大家一起学习Express这个基于Node.js的后端框架。本文首先将介绍:如何快速的生成一个具有一定结构的Express项目。Express项目结...

nodejs的express自动生成项目框架

nodejs版本为:4.X,express版本为4.X1.全局安装2个模块express、express-generator在命令行输入:npminstall-gexpressnpminsta...

express开发(一)简介与搭建

上周末去了趟上海书城,不愧是上海数得上号的书城,流行的科技书应有尽有,话不多说直接上图。最经典的C语言O(∩_∩)O最流行的java(づ ̄3 ̄)づ超酷的R语言/(ㄒoㄒ)/~~然而,身为一个坚定的前...

Vue+Echarts可视化大屏系统后端框架搭建(附代码)

各位同学,大家好。上节课,前面我们讲解了Vue+Echarts前端部分的设计方法。这节课程,我们开始讲解使用Express进行后端设计的方法。01项目相关理论介绍什么是expressExpress是...

Shopify电商API接口开发

Shopify电商API接口开发上线流程主要包括以下步骤。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎洽谈合作。前期准备-注册Shopify账号:在Shopify官网注册,用于后续开发测试...

取消回复欢迎 发表评论: