WasmEdge 是什么?史上最快 WebAssembly 运行时?
ccwgpt 2024-11-03 12:46 157 浏览 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
相关推荐
- 土豪农村建个别墅不新鲜 建个车库都用框架结构?
-
农村建房子过去都是没车库,也没有那么多豪车,一般直接停在路边或者院子里。现在很多人都会在建房子的时候留一个车库,通过车库可以直接进入客厅,省得雨雪天气折腾。农村土豪都是有钱任性,建房子跟我们普通人不一...
- 自建框架结构出现裂缝怎么回事?
-
三层自建房梁底与墙体连接处裂缝是结构问题吗?去前帮我姑画了一份三层自建房的图纸,前天他们全部装修好了。我姑丈突然打电话给我说他发现二层的梁底与墙分离了,有裂缝。也就是图纸中前面8.3米那跨梁与墙体衔接...
- 钢结构三维图集-框架结构(钢柱对接)
-
1、实腹式钢柱对接说明1:1.上节钢柱的安装吊点设置在钢柱的上部,利用四个吊点进行吊装;2.吊装前,下节钢柱顶面和本节钢柱底面的渣土和浮锈要清除干净,保证上下节钢柱对接面接触顶紧;3.钢柱吊装到位后...
- 三层框架结构主体自建房设计案例!布局13*12米占地面积156平米!
-
绘创意设计乡村好房子设计小编今日头条带来分享一款:三层框架结构主体自建房设计案例!布局13*12米占地面积156平米!本案例设计亮点:这是一款三层新中式框架结构自建房,占地13×12米,户型占地面积...
- 农村自建房新宠!半框架结构凭啥这么火?内行人揭开3个扎心真相
-
回老家闲逛,竟发现个有意思的现象:村里盖新房,十家有八家都选了"半框架结构"。隔壁王叔家那栋刚封顶的二层小楼,外墙红砖还露着糙面没勾缝,里头的水泥柱子倒先支棱得笔直,这到底是啥讲究?蹲...
- 砖混结构与框架结构!究竟有何区别?千万别被坑!
-
农村自建房选结构,砖混省钱但出事真能保命吗?7月建材价格波动期,多地建房户因安全焦虑陷入选择困境——框架结构虽贵30%,却是地震区保命的关键。框架柱和梁组成的承重体系,受力分散得像一张网。砖混靠墙硬扛...
- 砖混结构与框架结构,究竟有何区别?千万别被坑!
-
农村建房选砖混结构还是框架结构?这个问题算是近期留言板里问得最多的问题了。今天咱们说说二者的区别,帮您选个合适的。01成本区别假如盖一栋砖混结构的房子需要30万,那么换成框架结构,一般要多掏30%的费...
- 6个小众却逆天的App神器,个个都是黑科技的代表
-
你的手机上有哪些好用的软件?今天我就给大家分享6个小众却逆天的App神器,个个都是黑科技的代表!01*Via浏览器推荐理由:体积极小的浏览器,没有任何广告。使用感受:它的体量真的很小,只有702KB,...
- 合肥App开发做一个app需要多少钱?制作周期有多久?
-
在移动互联网时代,开发一款APP已成为企业数字化转型与个人创业的重要途径。然而,APP的开发成本与制作周期受功能复杂度、技术架构、团队类型等多重因素影响,差异极大。好牛软件将从这两个维度展开分析,帮助...
- 详解应对App臃肿化的五大法则
-
编者注:本文转自腾讯ISUX。先来看一张图:图上看到,所有平台上用户花费时间都在减少,除了移动端。观察身边也是如此,回家不开电脑的小伙伴越来越多。手机平板加电视,下班场景全搞定。连那些以前电脑苦手的...
- 实战!如何从零搭建10万级 QPS 大流量、高并发优惠券系统
-
需求背景春节活动中,多个业务方都有发放优惠券的需求,且对发券的QPS量级有明确的需求。所有的优惠券发放、核销、查询都需要一个新系统来承载。因此,我们需要设计、开发一个能够支持十万级QPS的券系...
- 8种移动APP导航设计模式大对比
-
当我们确定了移动APP的设计需求和APP产品设计流程之后,开始着手设计APP界面UI或是APP原型图啦。这个时候我们都要面临的第一个问题就是如何将信息以最优的方式组合起来?也许我们对比和了解了其他一些...
- 数字资产支付 App 的技术框架
-
开发一款功能强大、安全可靠的数字资产支付App需要一个整合了区块链技术、后端服务、前端应用以及第三方集成的全栈技术框架。这个框架的核心在于保障数字资产的安全流通,并将其高效地桥接到传统的法币支付场...
- 从MyBatis到App架构:设计模式全景应用指南
-
从MyBatis到App架构:设计模式全景应用指南引言在企业级应用和服务端开发领域,MyBatis凭借其灵活、简洁、强大的ORM映射能力被广泛应用。而它之所以能拥有如此优秀的可扩展性和工程可维护性,正...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- 框架图 (58)
- flask框架 (53)
- quartz框架 (51)
- abp框架 (47)
- jpa框架 (47)
- springmvc框架 (49)
- 分布式事务框架 (65)
- scrapy框架 (56)
- shiro框架 (61)
- 定时任务框架 (56)
- java日志框架 (61)
- mfc框架 (52)
- abb框架断路器 (48)
- beego框架 (52)
- java框架spring (58)
- grpc框架 (65)
- tornado框架 (48)
- 前端框架bootstrap (54)
- orm框架有哪些 (51)
- 知识框架图 (52)
- ppt框架 (55)
- 内联框架 (52)
- cad怎么画框架 (58)
- ssm框架实现登录注册 (49)
- oracle字符串长度 (48)