Wasm 原生时代已经到来 | 解读 WebAssembly 的 2022

在rt-thread上运行wamr(wasm-micro-runtime) 本文目标 学习如何使用QEMU运行RT-Thread,并且搭建wamr运行需要的基本环境。 如何根据wamr官方提示在rt-thread上编译出iwasm(vm core)。 如何使用rt-thread上的iwasm命令来运行.wasm。 使用QEMU运行RT-Thread 准备工作 环境为windows10。需要在git上下载rt-thread源码与env工具。 从git下载RT-Thread源码: git clone https://github.com/RT-Thread/rt 阅读详情

1935671004edfbacb15878f30dafcfb3.gif

文|柴树杉

KusionStack 开源负责人

凹语言作者、Go 语言代码贡献者、《Go 语言圣经》译者、《Go 语言高级编程》作者

本文 11860 字 阅读 30 分钟

Ending 定律:一切可编译为 WebAssembly 的,终将被编译为 WebAssembly(Any application that can be compiled to WebAssembly, will be compiled to WebAssembly eventually)。

PART. 0

前言

WebAssembly 作为一种新兴的网页虚拟机标准,它的设计目标包括:高可移植性、高安全性、高效率。

2018 年 WebAssembly 第一个规范草案诞生,2019 年成为 W3C 第四个标准语言。到了 2022 年底可以说我们已经进入了 Wasm 原生时代……

PART. 1

Ending 定律和 Wasm 原生

1、什么是 Ending 定律

Ending’s law: “Any application that can be compiled to WebAssembly, will be compiled to WebAssembly eventually.”(Ending 定律:“一切可编译为 WebAssembly 的,终将被编译为 WebAssembly。”)

Ending 定律也称为终结者定律,它是 Ending 在 2016 年 Emscripten 技术交流会上针对 WebAssembly 技术给出的断言。Ending 定律的威力不仅仅在语言层面。WebAssembly 是第一个虚拟机世界标准,以后将人手至少一个 Wasm 虚拟机。

不过和之前被大家鄙视的 JavaScript 语言大举入侵各个领域的情况不同,这次 Python、Ruby 这些语言将彻底拥抱 WebAssembly 技术,因为它是一个更底层、也更加开放的新兴生态平台。从 Ending 定律可以预测 Wasm 原生时代迟早都会到来。

2、什么是 Wasm 原生

Wasm 原生可以类比云原生的定义:就是天生就是为 WebAssembly 平台设计的程序和语言。比如专门为 WebAssembly 设计的 AssemblyScript 语言和 凹语言就是 Wasm 原生的编程语言。如果一个应用天生就是考虑了 WebAssembly 的生态支持,那么就是 Wasm 原生的应用。一个 Wasm 原生应用很容易支持纯浏览器环境,因此不支持纯浏览器环境的应用大概率不是 Wasm 原生。

现在 Docker 已经开始支持 Wasm 程序,因此 Wasm 原生软件天然也是云原生的软件,但是反之则不能成立。

而云原生因为受限于云的环境、导致其应用的场景和领域有较大的限制,比如云原生应用强依赖网络因此无法在很多单片机环境、甚至是本地环境运行,因此云原生更多是在互联网企业流行。但是 Wasm 原生的程序则可以轻松在 Arduino 等受限环境、本地台式机机环境、个人智能手机环境和 Kubernetes 等云原生环境执行。可以说未来 Wasm 原生应用将无处不在!

PART. 2

WebAssembly 简史

WebAssembly(简称 Wasm)是 W3C 定义的第 4 个标准,是 Web 的第 4 种语言。说 WebAssembly 是一门编程语言,但实际上它更像一个编译器,其实它是一个虚拟机,它还包含了一门低级汇编语言和对应的虚拟机体系结构,而 WebAssembly 这个名字从字面理解就说明了一切:“Web 的汇编语言”。

简而言之,WebAssembly 是一种新兴的网页虚拟机标准,它的设计目标包括:高可移植性、高安全性、高效率(包括载入效率和运行效率)、尽可能小的程序体积。

c340856503b13e44aaac8a2f78e7c386.png

1、Emscripten 项目

WebAssembly 的前身是 Mozilla 创建的 Emscripten 项目(2010 年)——通过将 C/C++ 通过 LLVM 编译到 JavaScript 的 asm.js 子集来提速!JavaScript 作为弱类型语言,由于其变量类型不固定,使用变量前需要先判断其类型,这样无疑增加了运算的复杂度、降低了执行效能。因为 asm.js 仅包含可以预判变量类型的数值运算,有效的避免了 JavaScript 弱类型变量语法带来的执行效能低下的顽疴。根据测试,针对 asm.js 优化的引擎执行速度和 C/C++ 原生应用在一个数量级。

2015 年 6 月 Mozilla 在 asm.js 的基础上发布 WebAssembly 项目,随后Google、Microsoft、Apple 等各大主流的浏览器厂商均大力支持。WebAssembly 不仅拥有比 asm.js 更高的执行效能,由于使用了二进制编码等一系列技术,WebAssembly 编写的模块有更小的体积和更高的解析速度。目前不仅 C/C++ 语言编写的程序可以编译为 WebAssembly 模块,Go、Kotlin、Rust、Python、Ruby、Node.js、AssemblyScript、凹语言等新兴的编程语言都开始对 WebAssembly 提供支持。

2、 WebAssembly 1.0 草案

WebAssembly 技术自诞生之日就进入高速发展阶段。在 2018 年 7 月 WebAssembly 1.0 草案正式发布,在 2019 年 12 月正式成为 W3C 国际标准,成为与 HTML、CSS 和 JavaScript 并列的唯四前端技术。2019 年,同样诞生了 WASI(WebAssembly System Interafce)规范,用于将基本的系统调用带入到 Wasm 生态。2022 年 Docker对 Wasm 提供支持,目前 WebAssembly 已经是一个独立的生态。

3、 WebAssembly 生态大图

下面是 “WebAssembly 将引领下一代计算范式” 展示的生态大图:

3387cfaccbd1eb89468dbf912fcb073f.png

可以看到从工具链、基础设施、到应有和 Web3 均有涉及,生态已经非常丰富。正和 JVM 构建的生态类似,WebAssembly 也在构建自己的庞大生态。

PART. 3

Wasm 社区 22 年的变化

2022 年,国内外自媒体社区对 WebAssembly 的评价态度可谓是完美遵循了欲扬先抑的剧本。

先是有热文爆大佬 WebAssembly 创业失败引发质疑,然后是传出社区分裂、应用争议再引发炒错的方向等争论,然后随着 Docker 对 Wasm 支持的预览版发布带来风向 180 度大转弯,简直是要把不明真相的群众彻底忽悠拐了。其实 WebAssembly 从诞生之日起,真正的从业人员始终在稳步推进,完全没有自媒体想象和策划的这些剧本演义。

1、WebAssembly 2.0 草案

4 月 20 日,W3C 公布了 WebAssembly 2.0 的第一批公共工作草案。主要包含向量类型、引用类型、多返回值、多 Table 支持、Table 和内存指令增强等。

向量类型的支持可以用于优化纯计算类型的并发程序、引用类型可以用于和外部的浏览器 DOM 对象等更好的交互、多返回值可以可以简化某些程序的表示(比如凹语言后端依赖该特性)、多 Table 支持可能用于灵活支持多模块连接等。可以说 WebAssembly 标准是该生态的统一基准平面,而且这些特性的实现已经相对普及,可以作为实验特性试试用。

ff8d015bb28ecd850ae58adb5d35f73b.png

完整文档参考:https://www.w3.org/TR/wasm-core-2/

2、Docker 支持 WebAssembly

2019 年,Docker 创始人 Solomon Hykes 发布了一条推文,他说如果 2008 年就诞生 WebAssembly 和 WASI 的话,Docker 就没有必要诞生了。

70d7bb946dec1c0dea077fa9f4d01a0f.png

其实作者在 2018 年写作《WebAssembly 标准入门》时, 通过推演也得出过类似的结论:当时的结论是 WebAssembly 更大的生命力在浏览器之外,如果配合文件系统、网络系统将得到一个更为迷你的操作系统无关的运行平台。

Docker 与 WasmEdge 合作创建了一个 containerd shim,该运行时支持运行 Wasm 程序。下面是 Docker 对 Wasm 的支持原理图:

8eedca387eb6fbd49ede8fb83d144bdd.png

Docker 执行 Wasm 需要指定一些额外参数:

$ docker run -dp 8080:8080 \
    --name=wasm-example \
    --runtime=io.containerd.wasmedge.v1 \
    --platform=wasi/wasm32 \
    michaelirwin244/wasm-example

首先 runtime 参数指定 Wasmedge 运行时,然后 platform 指定采用 wasi/wasm32 规范(指定有哪些宿主 API)。

完整的信息可以参考 Docker 的官方文档:https://docs.docker.com/desktop/wasm/

3、SQLite3 官方支持 WebAssembly

SQLite3 作为一个纯粹的 C 语言库,其实在 WebAssembly 标准诞生之前就可以通过 Emscripten 技术将 C 代码编译为 asm.js。

因此,网上很早就有在浏览器的 JS 版本、甚至直接通过 Emscripten 输出 WebAssembly。不过这次是 SQLite3 官方提供了对 WebAssembly 的支持,这表示 WebAssembly 在 SQLite 社区完全进入工业级应用阶段!

根据官网介绍,主要有 4 个目标:

  • 绑定一个低级的 sqlite3 API,在使用方面尽可能接近原生 API;

  • 更高级别的面向对象风格 API,类似于 sql.js 和 node.js 样式的实现;

  • 基于 Worker 的 API,以支持多线程环境更容易使用 SQLite 功能;

  • 基于 Worker API 的 Promise 包装,对用户完全隐藏了跨线程通信方面复杂性。

而不在此列的特性包括不支持 UTF 16、和清除老旧特性等。简而言之,在提供底层 API 能力的同时,针对面向对象、多线程等环节提供简单易用的 API。

完整的介绍请参考:https://sqlite.org/wasm

4、Ruby 3.2 支持 WebAssembly

12 月发布的 Ruby 3.2 也增加了基于 WASI 的 WebAssembly 支持。使得 CRuby 二进制内容可用于浏览器、Serverless Edge、以及其他 WebAssembly/WASI 嵌入环境。

目前,此功能已通过除 Thread API 之外的 basic 和 bootstrap 测试套件。

cc324be37886f25fe23b6ac51b6e1f62.png

虽然目前基于安全原因,还缺少一些功能来实现纤程、异常和垃圾回收的特性,但是这已经让用户可以在浏览器中尝试原生的 CRuby:https://try.ruby-lang.org/playground/

5、Python 3.11 支持 WebAssembly

和 Ruby 社区的目标类似,Python 社区也在 4 月启动在 Python 3.11 增加对 WebAssembly 的支持。Python 3.11 对 wasm32-emscripten 和 wasm32-wasi 提供了支持,从而也实现了在浏览器执行 Python 的梦想。

具体细节可参考以下文档:

  • https://pythondev.readthedocs.io/wasm.html

  • https://docs.python.org/3/library/intro.html#webassembly-platforms

  • https://speakerdeck.com/tiran/python-3-dot-11-in-the-web-browser-a-journey-pycon-de-2022-keynote

因为有了 WebAssembly 魔法加持,Ruby 和 Python 等脚本语言也终于可以在浏览器玩耍了。

6、为 WebAssembly 而生的凹语言

WebAssembly 草案刚刚发布不久,国外就诞生了专门为其设计的 AssemblyScript 语言。

在 2022 年 7 月,国内 Gopher 也发起了针对 WebAssembly 平台的凹语言。目前凹语言不仅仅提供了在线的 Playground,还上线了用凹语言开发的贪吃蛇小游戏。希望新兴的语言可以为 WebAssembly 注入更多的活力。

  • 凹语言主页:https://wa-lang.org/

  • 凹语言仓库:https://github.com/wa-lang/wa

  • 凹语言开发的贪吃蛇:https://wa-lang.org/wa/snake/

PART. 4

Wasm 虚拟机实现

对于 JavaScript 用户,直接通过浏览器内置的 WebAssembly 模块即可,或者是通过 Node.js 提供的模块 API。我们这里简要介绍的是浏览器环境之外的 Wasm 虚拟机实现,这里介绍的主要有 C/C++、Rust 和 Go 语言几类实现。

总体来说,大家完全不需要担心 Wasm 虚拟机的选择和切换代价,只要遵循 Wasm 标准原则切换虚拟机就和换个鼠标一样容易。

1、C/C++ 语言|

WasmEdge、wasm3 和 WAMR

WasmEdge 和 Wasm3 是 C/C++ 语言实现的具有代表性的两个 WebAssembly 虚拟机(没有包含 V8 的虚拟机)。

WasmEdge 可以说是目前最受关注的 WebAssembly 虚拟机实现,因为它不仅仅是 CNCF 推荐的 Wasm 虚拟机,更是 Docker 内置的 WebAssembly 虚拟机。WasmEdge 是由美国的袁钧涛(Michael Juntao Yuan)发起,是由 CNCF 托管的云原生 WebAssembly runtime。

它广泛应用于边缘计算、汽车、Jamstack、Serverless、SaaS、服务网格,乃至区块链应用。WasmEdge 可以进行 AOT(提前编译)编译器优化,是当今市场上最快的 WebAssembly runtime 之一。

可以预计,随着 Docker Wasm 的普及,WasmEdge 将成为最流行的 Wasm 虚拟机实现之一。

a74f2a9bbed5fdcb31e4158f776389a6.png

  • WasmEdge:https://wasmedge.org

  • 袁钧涛(Michael Juntao Yuan):https://github.com/juntao

Wasm3 是 C 实现的 WebAssembly 引擎,可运行在嵌入式设备上。因为需要的资源比较少,目前可以运行在 Arduino 和树莓派环境。

  • Wasm3 仓库:https://github.com/wasm3/wasm3

由 Mozilla、英特尔、RedHat 和 Fastly 公司宣布成立字节码联盟(Bytecode Alliance)开发的 WebAssembly Micro Runtime(WAMR)也是一个非常优秀的虚拟机实现,其提供 AOT、JIT 等多种不同的优化手段,底层也是依赖 LLVM 后端的一些能力。

  • WAMR 的仓库:https://github.com/bytecodealliance/wasm-micro-runtime

2、Rust 语言|Wasmer 和 Wasmtime

Wasmer 和 Wasmtime 是 Rust 实现的两个流行的 WebAssembly 虚拟机。根据 2022 年 7 月的调查报告(300人提交问卷)显示,来自字节码联盟的 Wasmtime 最流行、其次为 Wasmer。不过从长期看,作者推测 WasmEdge 将随着 Docker/wasm 成为浏览器外最流行的 Wasm 虚拟机实现。

  • Wasmtime 仓库:https://github.com/bytecodealliance/wasmtime

  • Wasmer 仓库:https://github.com/wasmerio

3、Go 语言|WaZero

WaZero 是纯 Go 语言实现的 WebAssembly 虚拟机,因此不需要依赖 CGO 特性。目前凹语言内置的就是 WaZero 虚拟机。

仓库地址:https://github.com/tetratelabs/wazero

另外,国内张秀宏著的《WebAssembly 原理与核心技术》讨论了用 Go 语言如何实现 WebAssembly 虚拟机,感兴趣的读者可以参考。

PART. 5

支持 Wasm 的编程语言

WebAssembly 允许开发者用几十种编程语言(包括 AssemblyScript、C/C++、Rust、Golang、JavaScript 和凹语言等)编写应用程序。

支持  Wasm 的编程语言主要分为 3 类:

  1. 首先是专门为 WebAssembly 设计的新语言,比如 AssemblyScript 和凹语言等;

  2. 其次是将语言编译到 WebAssembly 目标平台,比如 C/C++、Rust、Golang 这类语言(和第一类有一定重叠);

  3. 最后是将语言的虚拟机或解释器编译到 WebAssembly 平台,比如 Lua、JavaScript、Ruby 和 Python 这些。

除此之外,还有一些其它的领域语言也在支持 WebAssembly 平台。

  • 支持 WebAssembly 的语言列表:https://github.com/appcypher/awesome-wasm-langs

1、JavaScript|

WebAssembly 替换的目标

JavaScript 开始其实是 WebAssembly 要替换的目标。但是随着 WasmEdge 等引擎支持 QuickJS 的解释器,JavaScript 逐渐变成了 WebAssembly 平台之上的最流行的编程语言。这里除了有 JavaScript 语言用户比较多的因素,同时 JavaScript 的单线程模型也非常契合 WebAssembly 的单线程模型(只是相对于 Python 等支持多线程的脚本语言,套娃的性能损失至少 10 倍起)。

JavaScript 和 WebAssembly 无限套娃的事情真在切实发生,同时 JavaScript 也失去了浏览器中的霸主地位,降级为普通公民。

2、AssemblyScript|

为 WebAssembly 而生的 TypeScript

AssemblyScript 是一个把 TypeScript 语法搬到 WebAssembly 的编译器。它目前是 WebAssembly 环境非常受欢迎的一个语言。

AssemblyScript 只允许 TypeScript 的有限功能子集,因此不需要花太多时间就可以上手。同时它与 JavaScript 非常相似,所以 AssemblyScript 使 Web 开发人员可以轻松地将 WebAssembly 整合到他们的网站中,而不必使用完全不同的语言。

下面是一个 AssemblyScript 程序,和 TypeScript 几乎是一样的:

export function add(a: i32, b: i32): i32 {
    return a + b;
}

不过 AssemblyScript 只有 WebAssembly 支持的基本类型,而复杂的类型通过内置库实现。同时为了提供灵活的扩展能力,AssemblyScript 编译器提供了扩展能力。

AssemblyScript 主页:https://www.assemblyscript.org/

3、C/C++|

WebAssembly 为其而生

C/C++ 是 WebAssembly 该技术前身 Emscripten 诞生时的初始目标。Emscripten 项目,尝试通过 LLVM 工具链将 C/C++ 语言编写的程序转译为 JavaScript 代码,在此过程中创建了 JavaScript 子集 asm.js,asm.js 仅包含可以预判变量类型的数值运算,有效的避免了 JavaScript 弱类型变量语法带来的执行效能低下的顽疴。

其中的核心魔法使 WebAssembly 和 C/C++ 采用相似的线性内存模型,提供为 JIT 提供了转化为相似代码的可能。

4、Rust 语言|

基于 LLVM 的输出 WebAssembly 能力

Rust 和 Emscripten 都诞生于 Mozilla 公司,因此目前 WebAssembly 社区和 Rust 社区有着很大的重叠部分。很多 Rust 实现的 WebAssembly 虚拟机,同时 Rust 编译器借助 LLVM 的能力输出 WebAssembly 模块。

可以说 Rust 技术的发展和抱住 WebAssembly 这个大腿有极大的关系。当然,因为 Rust 兼容 C/C++ 内存模型同时又无 GC 依赖,使得 Rust 可以构造出非常轻量高效的 Wasm 模块。不过 Rust 本身的超高门槛也为初学者带来了极大的挑战。

5、Go 语言|独立的 WebAssembly 后端

Go 语言作为云计算等领域的主流语言,从 Go1.11 开始,WebAssembly 开始作为一个标准平台被官方支持,这说明了 Go 语言官方团队也认可了 WebAssembly 平台的重要性和巨大潜力。

目前 Go 语言社区已经有众多与 WebAssembly 相关的开源项目,比如有很多开源的 WebAssembly 虚拟机就是采用 Go 语言实现的。不过 Go 语言对 WebAssembly 被诟病的一个方面是官方生成的 Wasm 文件不是 wasi 规范,同时因为 GC 等特性导致 Wasm 体积比较大。

社区有个针对嵌入式环境等 TinyGo 变种,后端同样借助 LLVM 的能力输出 WebAssembly 模块。不过因为 LLVM 的依赖非常重,导致 TinyGo 的单个命令行将近 100MB、同样的原因导致无法方便在浏览器环境使用。可以说 TinyGo 本身并不 Tiny,只是其目标平台是针对 Tiny 的单片机和 Wasm 等平台。

6、凹语言|

为 WebAssembly 而生的国产语言

凹语言是为 WebAssembly 而设计的新语言,是国内 Gopher 发起的纯社区构建的开源国产编程语言项目。

同时凹语言也是国内第一个实现纯浏览器内编译、执行全链路的自研静态类型的编译型通用编程语言。凹语言不仅仅点亮了 Arduino Nano 33 开发板,同时也通过实现了 BrainFuck 虚拟机证明了其图灵完备的能力,最近还验证了通过凹语言开发 Web 版本贪吃蛇的能力。

7、KCL|

向 WebAssembly 迁移的领域语言

Kusion 配置语言(KCL)是由来自蚂蚁的徐鹏飞负责设计的、基于约束的记录及函数语言。KCL 通过成熟的编程语言技术和实践来改进对大量繁杂配置比如云原生场景的编写,致力于构建围绕配置的更好的模块化、扩展性和稳定性,更简单的逻辑编写,以及更快的自动化集成和良好的生态延展性。

作为领域语言,KCL 目前也是基于 LLVM 的能力输出 WebAssembly 模块,通过 WebAssembly 模块良好的隔离性和跨平台特性,KCL 可以轻易实现在浏览器当中运行。

KCL 语言的主页:https://kcl-lang.io/

8、其它支持 Wasm 的语言

比如 Zig 等一些语言也支持 Wasm,本质上它们和 C/C++/Rust/TinyGo 一样,都是依赖 LLVM 的输出 Wasm 的能力。当然,也有一些采用类似 AssemblyScript 路线,通过 Binaryen 输出 Wasm。

还有一些特殊场景,比如 OPA 的 Rego 是独立实现输出 Wasm 的能力。Wasm 虽然和 C/C++ 采用相似的内存模型,但是依然有一些细微的差异,如果希望发挥其最大优势需要从语言设计和后端输出两个方便考虑,这也是很多新语言正在探索的方向。

PART. 6

Wasm 的一些场景

1、Web 应用

随着 WebAssembly 的成熟,Web 应用不再是 JavaScript 的天下。比如之前就有国外大牛基于 Wasm 技术将 Windows 2000 搬到了浏览器中。而像 AutoCAD 和谷歌地球这些重量级的应用均通过 WebAssembly 支持了浏览器。

当然,不仅仅是重量级的 Web 应用,随着 Wasm 原生编程语言的成熟,可以预期会有更多的其他语言开发的 Web 应用。

比如,下面是采用凹语言开发的贪吃蛇小游戏就是基于 WebAssembly:

ea11acf9bd34820050a89dfe4216aedc.png

贪吃蛇游戏在线地址:https://wa-lang.org/wa/snake/

2、Web3 和元宇宙应用

随着 Web3 和元宇宙概念的兴起,WebAssembly 也将作为其中的关键技术,甚至是基石技术。目前 Web3 相关的区块链行业有大量的技术基于 WebAssembly 构建,甚至专门定制 EWASM 技术标准。

而元宇宙作为数字化和现实完全融合的新社会生态,其底层的软件系统更是非常依赖纯开源软件和平台无关的通用技术,因此作者推测 GPL 开源协议和 WebAssembly 技术将会是元宇宙的两大关键支柱。

3、Serverless 应用

Serverless 强依赖高度优化的冷启动,Wasm 非常适合作为下一代无服务器平台运行时。SecondState、Cloudflare、Netlify 和 Vercel 等公司都支持通过其边缘运行时部署 WebAssembly 功能。

下图是 AWS Lambda 中的 WebAssembly Serverless 函数工作原理:

0a22a3ad0c737375353f950c51ac3e91.png

具体细节可以参考这个文章:https://www.cncf.io/blog/2021/08/25/webassembly-serverless-functions-in-aws-lambda/

4、插件系统应用

得益于 Wasm 的跨平台的特性,很多系统和框架在考虑通过 Wasm 开发插件系统。比如基于 eBPF 和 Wasm 技术实现给 Linux 打动态的补丁。

比如阿里云刚开源的 Higress 网关的插件系统也支持 Wasm,对比传统 Nginx 网关使用 lua 进行扩展,Wasm 的多语言和安全沙箱特性带来了革命性的变化。同时对比传统 Nginx 网关,修改 lua 代码后需要 reload 才能生效,Higress 可以实现插件的热分发和热加载,插件逻辑发生变化对流量完全无损,长连接也不会断开。

使用 Go 开发 Higress 插件可参考:https://higress.io/zh-cn/docs/user/wasm-go.html

比如蚂蚁开源的 MOSN(Modular Open Smart Network),是一款主要使用 Go 语言开发的云原生网络代理平台。

MOSN 就支持通过 Wasm 插件来扩展其能力。下图是 MOSN 插件的工作原理图:

cd461fe7e2ab297834bc4fec5799b3d0.png

MOSN 插件的细节可参考:https://mosn.io/blog/posts/mosn-wasm-framework/

5、单片机应用

Wasm 不仅仅应用在浏览器、云计算等行业,在边缘计算等嵌入式领域也有应用场景。比如 Wasm3 虚拟机就针对 arduino 提供的更精简的虚拟机,用户可以通过 Wasm 技术为不同的单片机开发应用。

bf9cb805522ee5be445b13bfd1846a8a.png

比如可以通过凹语言结合 Wasm3-arduino 来开发 arduino 的例子,下图是本地模拟环境代码和执行效果图:

543ac661c0b09c3b82504b2bc3e2af8b.png

Wasm3-arduino 仓库:https://github.com/wasm3/wasm3-arduino

PART. 7

Wasm 教程推荐

WebAssembly 属于这个新生态的根技术、而目前正是处于根技术生态的构建阶段。因此,这类推荐的更多是偏向 WebAssembly 规范、原理和实现的教程。我们希望当 WebAssembly 技术正在普及之后,用户可以通过流行的编程语言直接开发 WebAssembly 应用而不需要关系根技术的细节。

1、《WebAssembly 规范》|2022

WebAssembly 规范 1.0 草案在 2018 年发布,现在最新的 WebAssembly 2.0 在 2022 年发布。

WebAssembly 规范是市面上所有该技术的实现和实践的参与源头。任何希望追根溯源、获取最前沿的 WebAssembly 发展方向的同学不仅仅推荐精读该规范,甚至还建议跟踪规范的讨论和诞生的过程。

2e0c104a928b806a5cb80b7b93aa6b85.png

该文档并非正式出版的图书,目前规范只有在线电子版,建议自行打印。

2、《WebAssembly 标准入门》|2018

本书是本文作者和前同事于 2018 年合著,主要讲解了 WebAssembly 的基础知识,其内容涵盖了 Wasm 的历史背景、Wasm 中汇编语言和虚拟机指令、浏览器对 Wasm 的支持、其它高级语言对 Wasm 的支持等。

7a7de20fbb9f14bd351556ef0e1f9180.png

本书适合想要掌握 WebAssembly 技术、构建对应虚拟机工具、编程语言或希望了解底层细节的用户学习。

3、《WebAssembly

: The Definitive Guide》|2021

这是 Oreilly 出版的相对较新的 WebAssembly 专著,不仅仅覆盖了规范本身同时结合了主流编程语言的案例。

bbc210f099a6c494b50528d4ea209f2e.png

目前国内还没有中文版本,大家可以阅读英文版本。

4、《WebAssembly 

原理与核心技术》|2021

这是国内虚拟机实现专家张秀宏写的一本讲述如何实现 WebAssembly 虚拟机的专著。它不仅对 WebAssembly 的工作原理、核心技术和规范进行了全面的剖析和解读,而且给出了实现 WebAssembly 解释器和 AOT 编译器的思路和代码。

f2a13be6123ef7291f1f94a4083c2696.png

对于希望尝试自己实现 WebAssembly 的同学建议阅读本书。

PART. 8

2023 年展望

对于 WebAssembly 来说,2022 年是真正润物细无声开始落地的过程:从新的 2.0 标准到 Ruby、Python 两大主流脚本语言开始官方支持,从 SQLite3 开始官方支持、从 Docker 开始官方支持等,到为其而生的凹语言等,到真正的商业应用都有巨大的发展(而完全不是因为某个大佬的项目黄了就断言  Wasm 要凉的节奏)。

在商业应用上,Figma 基于 WebAssembly 打造在浏览器中的高性能应用,此后被 Adobe 以 200 亿美元收购,而 Adobe 也在向浏览器迁移。此外,WebAssembly 也是云厂商、边缘计算和 Serverless 的候选人。

随着 WebAssembly 的普及,有一些相关技术流行趋势也日趋明朗化。作者做 2 个小小的趋势预测:

  1. 首先是 WasmEdge 将成为浏览器外最流行的运行时;

  2. 其次是 JavaScript 将成为 WebAssembly 平台上最流行的编程语言。

不过这只是 5 年内的短期预测,更长的发展趋势还需要看 WebAssembly 生态其他的基础设施和编程语言发展状态。

尽管目前 WebAssembly 发展喜人,但百废待兴仍有许多工作要做。我们希望大家更多的是参与到 WebAssembly 建设中去,而不是仅仅作为围观者。作为凹语言作者,我们希望在 2023 年真正解决语言的可用性和易用性的问题,让 WebAssembly 应用构建更加简单。

WebAssembly 作为一个新兴的赛道,作为一个基础设施必将带来更大的生态洗牌,这是一个值得关注和投入的方向,让我们一起携手共建 Wasm 原生时代。

了解更多...

KusionStack Star 一下✨:
https://github.com/KusionStack/kusion

推荐观看...

   本周推荐阅读  

466c93c37964630ec5b6fb1882acea2c.png

WASM 将引领下一代计算范式[译]

425fb9bcd32dafbce1d2002177d67530.png

KusionStack 在蚂蚁集团的探索实践 (上)

09753ae04b90c884da47e95e41893194.png

Kusion 模型库和工具链的探索实践

3a958b1f620ce60039e1d4d78b8cf430.png

Go 内存泄漏,pprof 够用了么?

e76ff18b1f7482fc659709b0959a1440.jpeg

如何使用开源指令集体系 WAMR—A lightweight runtime for webassembly 快速地将WebAssembly程序转换为运行时环境? WebAssembly(Wasm)是一个开源的指令集体系,其目的在于取代JavaScript等脚本语言。它主要基于栈机器结构,具备安全、高效、互通、可移植性等特点。但Wasm作为一种底层编程语言仍处于不成熟阶段,还没有被广泛应用,尤其是在边缘计算领域。WAMR是由宋净超、李松洪、崔维等人开发的一个WebAssembly运行时,目的是提供一个轻量级的运行时环境,使得嵌入式设备、移动终端等设备上可以执行WebAssembly程序。基于该运行时环境,WAMR提供了面向模块化设计的功能,允许用户自定义模块接口。 阅读详情

相关推荐

xlinx项目系列之基于zynq-7020ISP图像处理

本Demo基于zynq-7020(正点原子启明星+OV5640+4.3'800x480)实现了ISP图像处理(将ov5640的isp关闭,在7020上实现ISP功能),输出到LCD和HDMI,软件基于SDK裸机开发,2592x1944@15fp。位置: xil_ip_repo/xil_isp_lite_1.0。项目获取链接:2.基于zynq-7020实现ISP图像处理。位置: xil_ip_repo/xil_vip_1.0。

JY6669991010的博客 2636

如何快速开始使用wazero:5分钟入门教程

wazero是一个零依赖的WebAssembly运行时,专为Go开发者设计,让你能够在Go应用程序中无缝运行WebAssembly模块。无论你是想要扩展应用功能,还是探索跨语言互操作性,wazero都能为你提供简单高效的解决方案。😊 ## 什么是wazero? wazero是第一个完全用Go编写的WebAssembly运行时,无需CGO依赖即可运行。这意味着你可以轻松地将WebAssembl

gitblog_00007的博客 1315

睿尔曼超轻量仿人机械臂-ROS第一篇 启动机械臂的Moveit

本文主要讲述了睿尔曼六轴机械臂在ROS中的功能包配置,及如何根据文件启动Moveit做仿真。

realman_Rop的博客 7490

Go-SQLite3:基于Wazero的无CGO SQLite绑定

`Go-SQLite3` 是一个基于 `Wazero` 的 `SQLite` 绑定库,完全避免了 `CGO` 的使用。它不仅提供了与 `database/sql` 兼容的驱动程序,还直接访问了大部分 `SQLite` 的 C API。通过嵌入 `Wasm` 版本的 `SQLite`,并使用 `wazero` 作为运行时,`Go-SQLite3` 实现了轻量级、高效的 `SQLite` 数据库操作。...

gitblog_01007的博客 692

长短期记忆网络(Long Short-Term Memory networks, LSTM)

如何简单的理解LSTM——其实没有那么复杂:

weixin_39910711的博客 2万+

MDB协议中设备级别和选项(Levels and Options)

MDB协议的LEVEL级别介绍

hbstart的博客 939

深入理解wazero项目的代码贡献规范与最佳实践

深入理解wazero项目的代码贡献规范与最佳实践 前言 wazero是一个基于Go语言实现的WebAssembly运行时,它允许开发者在Go应用程序中直接运行WebAssembly模块。作为一个开源项目,wazero有着严格的代码贡献规范,这些规范不仅保证了代码质量,也维护了项目的可持续发展。本文将深入解析wazero项目的贡献指南,帮助开发者更好地理解其背后的设计理念和工程实践。 代码风格规范 ...

gitblog_00626的博客 345

AntV G6避坑指南:折叠树状图那些意想不到的BUG(附解决方案)

本文深入剖析了在React项目中使用AntV G6实现折叠树状图时,从图标错乱、数据同步到状态管理的常见BUG与解决方案。文章基于实战经验,详细解读了G6的内部机制,提供了从环境配置、自定义节点绘制到事件处理与性能优化的完整避坑指南,帮助开发者彻底解决折叠展开功能的疑难杂症。

wasm7browser的博客 256

WASM 原生时代已经到来 | 解读 WebAssembly 的 2022

Ending定律:一切可编译为 WebAssembly 的,终将被编译为 WebAssembly(Any application that can be compiled to WebAssembly, will be compiled to WebAssembly eventually)。作者 | 柴树杉 责编 | 梦依丹出品 | 优快云(ID:优快云news)引子:作者在 20...

优快云资讯 8254

lammps模拟石墨烯吸附水分子(gcmc)

本文分享lammps gcmc吸附的一个案例代码,上下壁面的通道材料为石墨烯,吸附的分子为tip4p水分子。大家好,我是小马老师。

lammps_jiayou的博客 2590

Calibre 3Dstack --每日一个命令day27【overlap】(3-27)

本文介绍了Calibre3Dstack中overlap命令的使用方法。该命令用于检查两个已放置层之间的重叠量是否符合要求,支持设置检查名称、层类型、堆叠范围、检查方向等参数。关键参数包括:-constraint指定重叠约束条件,-exact控制百分比精度,-by_area切换为面积检查模式,-intersection报告相交区域。检查结果可通过RVE选项定制显示方式,适用于3D堆叠设计中的层间重叠验证场景。

u013620135的博客 112

广州蓝景分享—2022上半年的前端技术趋势解读

导语:如今的前端早已不再拘泥于满足页面展示,而是开始延展到通过全栈来闭环产品。这表明前端已经有能力透过业务深入产业,继而影响商业结果。这种表象的改变背后是本质的转变,从更为宏观的角度来说,前端正在通过持续的技术革新和技术融合不断突破自身边界,进而重新定义自身价值。在这种大变革的时代背景下,广州蓝景前端团队也正在与时俱进得进行着技术更新、优化与升级,结合自身这一年的快速发展,广州蓝景前端团队为大家带来2022年上半年大前端技术趋势解读。......

qq 2903359018博客 998

基于ZYNQ的HP总线与DDR交互:实现PL与PS高效数据传输的完整指南

本文将深入探讨如何通过AXI HP总线实现PL与PS的DDR交互,结合代码示例、硬件配置与创新优化,助力开发者掌握这一关键技术。ZYNQ内部通过AXI HP接口直接连接PL与DDR控制器,PL通过AXI协议发送读写请求,绕过PS的CPU直接操作DDR。通过AXI HP总线实现PL与PS的DDR交互,开发者可充分发挥ZYNQ异构架构的优势。在Xilinx ZYNQ系列芯片中,PS(Processing System)与PL(Programmable Logic)的协同设计是其核心优势。

QQ_778132974的博客 1223

编程语言千千万,选对“赛道”赢一半(上)

世界上有很多编程语言,有的历史悠久,还有的崭露头角;有的编程语言名扬四海,而有的则默默无闻,关于“哪种编程语言最好”的争论,从来就没有停止过。 对技术人来说,我们不可能和一种编程语言“厮守终生”,往往有各种原因要去了解其他编程语言,可能是为了完成项目、提高工作效率,又或者想多学门手艺、搞钱,还可能出于兴趣、想拓展视野、提高技术敏锐度等等。

gotea456的博客 4426

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

2026年云原生技术演进:Kubernetes 深度实战 × WebAssembly × Serverless 的融合之道

本文从生产环境视角探讨了Kubernetes 2026新特性、WebAssembly服务端落地现状及Serverless商业化进程的协同发展。主要内容包括: Kubernetes最新进化:Gateway API全面取代Ingress,实现更强大的网络抽象;Pod Security与RBAC深度整合增强安全性;拓扑感知调度优化资源分配。 WebAssembly崛起:作为轻量级运行时,WasmEdge在Serverless场景实现亚毫秒级冷启动,可作为高性能Sidecar替代方案,具有跨平台、高安全性等优势。

小二丶的博客 599

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

凹语言项目起源及现状[讲稿+视频]

本文是凹语言发起人之一丁尔男,受OSDT组织邀请做的“凹语言项目起源及现状”的报告讲稿整理。完整的视频已经上传到B栈,可以通过本文左下角阅读原文查看。大家好,很荣幸受吴老师的邀请参加OSDT2022大会,借此机会跟各位介绍一下 凹语言 项目的起源、发展过程和目前所取得的一些进展。事情得从2018年开始说起,因为工作的缘故,在工程实践中,需要一门具备这些特征的编程语言:首先对WebAssembly友...

光谷码农 609

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

2022 年云和 DevOps 趋势报告

近日 InfoQ 发布了DevOps and Cloud InfoQ Trends Report – June 2022[1],因为报告中所覆盖的技术领域过于宽泛,本文仅仅是对这篇报告的一点个人解读。我基本认同我关注的这些技术中「创新者」和「后期大众」阶段技术的划分。报告概括下面这段节选自原文的 takeaways:•数据可观察性将帮助企业更好地了解和排除其数据密集型...

ServiceMesher 321

Flutter 2022 战略和路线解读与想法

最近 Flutter 发布了官方关于 2022 的 战略 和 路线图 ,本篇主要针对内容做一些总结和解读,给正在使用 Flutter 或者正打算使用 Fluter 的人做个参考。 总结陈述相关 目前 Flutter 社区的发展已经很大,官方统计在过去的一年里,数据上 Flutter 已经基本超过超过其他跨平台框架,成为最受欢迎的移动端跨平台开发工具,截至 2022 年 2 月,有近 50 万个应用程序使用 Flutter。 在过去一年里, Flutter 社区有数千人为该项目提供了贡献和支持,从个人到 Ca

恋猫de小郭的博客 8971

深度解读波卡智能合约平台Gear:通往并行架构公链之路

作为开发者进入波卡生态的新入口,Gear 在技术主张和团队背景上让人耳目一新,但区块链特殊的业务逻辑与运行机制使其天生“敌视”并行多线程的工作方式,这对高举“并行计算”旗号的 Gear 团队无疑是巨大的障碍;同时,由于以太坊系的 EVM 虚拟机与 Solidity 语言本身近乎于“大而不倒”,面对波卡生态上因兼容 EVM 而获得以太坊系开发者青睐的 Moonbeam、Acala 和 Astar,Gear 仍面临着严峻考验。

GearFans的博客 1569

Blazor开发工具链全解析:从环境搭建到高效调试实践

在现代Web开发中,高效的工具链是提升开发效率与保障项目质量的核心要素。其基本原理是通过集成化的开发环境与自动化流程,将代码编写、调试、构建等环节无缝衔接。对于采用.NET技术栈的团队而言,一套成熟的工具链能显著降低开发复杂度,实现快速迭代。ASP.NET Core Blazor框架的官方工具链正是为此而生,它深度集成于.NET SDK及主流IDE中,为开发者提供了项目模板、热重载、集成调试与性能分析等关键能力。这些工具特别适用于需要构建交互式Web应用、追求技术栈统一或进行快速原型开发的场景。本文将聚焦于

weixin_34319111的博客 439

2022年前端技术趋势与框架演进分析

前端开发领域在2022年呈现出显著的技术分层与框架演进趋势。React、Vue、Angular三大主流框架通过并发渲染、Composition API等创新持续引领技术方向,而构建工具如Vite凭借ESM的极速开发体验实现爆发增长。工程实践方面,Monorepo管理方式和TypeScript类型系统的普及显著提升了项目维护效率。性能优化技术发生范式转移,ESM按需加载和Web Vitals指标重塑了前端性能标准。在国内生态中,UmiJS、Modern.js等框架深度整合企业级研发流程,低代码平台在电商领域实

weixin_29016865的博客 232

Oracle 官方定调:JVM 未来 3 大趋势(附可运行代码 + 落地时间表 + 避坑手册)

结合 10 余年 Java 底层实战经验与 Oracle《JVM 技术路线白皮书(2024-2027)》,拆解 JVM 三大未来趋势:2025 年 WASM 跨语言(附 Java 调用 Rust 可运行代码,延迟降 60%)、JDK 23 云原生动态内存(K8s 配置示例,解决 OOM)、2026 年 JDK 24 内置安全审计(对接 OpenTelemetry 代码,性能损耗<5%),所有技术点附 Oracle 官方链接、生产案例(电商 / 支付 / 银行)及避坑要点,读者可直接复用落地。

开源架构师的博客 1096

Blazor工具链深度解析:从dotnet CLI到生产部署全流程实战

在现代Web开发中,构建工具链的集成度与开发体验紧密相关。其核心原理在于通过统一的命令行接口和智能元数据管理,将代码编译、依赖管理和资源打包等复杂流程自动化,从而降低开发者的认知负担。这一技术价值体现在提升开发效率、确保构建一致性以及优化应用性能上,尤其在.NET全栈开发场景中至关重要。应用场景广泛覆盖从项目初始化、实时热重载调试到生产环境构建与部署的全生命周期。本文聚焦于ASP.NET Core Blazor框架,深入探讨其工具链如何通过dotnet CLI、MSBuild任务和项目文件配置,实现开发到部

weixin_30271335的博客 326

Blazor WebAssembly+Duende.IdentityServer+EF Core认证授权企业级实战

本文将从0开始介绍如何搭建一个适用于Blazor WASM应用的且基于OpenID和OAuth2.0的认证授权服务。我们会从创建空白项目一步一步开始,让大家了解到整个搭建流程,没有直接使用微软给定的认证模板或者IdentityServer的UI模板。 - 前端使用的是Blazor WebAssembly最新版本(基于 .net 5.0),主要我认为相对于Blazor Server来说,这个才是Web的未来。而且可以充分开会客户机的性能。 - 认证服务使用的Duende.IdentityServer

catshitone的专栏 3930

rhwp路线图解读:v1.0排版对齐到v3.0公共资产的演进蓝图

**rhwp** 是一款用 Rust + WebAssembly 打造的开源 **HWP/HWPX 文档查看器与编辑器**,目标是在任何平台(浏览器、桌面、移动端)免费打开、编辑并保存韩文文档。它的 [ROADMAP.md](https://link.gitcode.com/i/e31020d97a030b34f38307d546a77608) 把整个演进路径浓缩成四句话:**v0.5 打基础 →

gitblog_00214的博客 859
上一篇: Nydus 加速镜像一致性校验增强
下一篇: SOFA Weekly|SOFANew、本周贡献 & issue 精选
SOFAStack
博客等级 码龄7年 747粉丝 389原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值