盘点 2023 年排名前20的编程语言对 WebAssembly的支持!

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

高级前端‬进阶

前言

本文主要和大家介绍在 2023 年哪些编程语言已经支持 WebAssembly。在年初,我也确实使用 WebAssembly 将客户端应用成功移植到了 Web,这也是为什么我一直对 WebAssembly 充满好奇的原因。我甚至在头条上开了一个合集《WebAssembly 前沿技术》来专门探讨 WebAssembly ,并将持续关注 WebAssembly 的最新动态。

下面是已发布部分文章传送门:

正如大家所看到的,当我们还在迟疑是否要在日常开发中引入 WebAssembly 的时候,很多优秀的应用、工具已经开始吃 WebAssembly 的红利了,而且取得了不错的成就,这可能也是为什么各个浏览器厂商、开发者如此热衷 WebAssembly 的原因吧。

本文主要内容来自 Fermyon 平台编写的《The Complex World of Wasm Language Support》,文章链接已经在文末给出,但是高级前端进阶对部分内容进行自组织、加工,从而能够更好的读懂它。

1 WebAssembly 与 WASI

Wasm,即 WebAssembly,是一种用来补充 JS 在运行上不足的底层语言,基于二进制编写。WebAssembly 的目标之一是达到在网页上如同运行机器语言一样快速高效,其开发团队分别来自 Mozilla、Google、Microsoft、Apple 等。

WASI 即 WebAssembly System Interface, 是一个新的 API 体系, 由 Wasmtime 项目设计, 目的是为 WASM 设计一套引擎无关(engine-indepent),面向非 Web 系统(non-Web system-oriented)的 API 标准。

2.WebAssembly 的语言支持情况

2.1 排名前 20 种语言的 WebAssembly 支持情况

下图使用不同的图标来表示 WebAssembly 的支持级别,分别是:

而图表中所有语言都来自 RedMonk 排名前 20 位的语言, 而部分语言,如: CSS、PowerShell 和 Shell 在 Wasm 中并没有真正有意义的表达。 但是,为了完整起见,下表依然保留这几个语言。所有语言的 WebAssembly 支持情况如下图所示:

总体来看,大多数语言对 WebAssembly 的支持都取得了重大进展。总体分为以下几个级别:

2.2 WebAssembly 优先的特定语言

有一些特定于 Wasm 的语言,如:Grain、AssemblyScript 和 Motoko。

如 Grain、AssemblyScript 和 Motoko 等,这些语言也很有机会在 Wasm 生态系统中得到关注,即使目前还缺乏很强的吸引力。

从上图可以看出,Grain、AssemblyScript 和 Motoko 都已经完全支持浏览器、CLI、WASI 等核心能力。

2.3 其他值得关注的语言

以下语言虽然不在前 20 名中,但是使用也很广泛,并且至少有一定程度的 WebAssembly 支持。

如上图所示,可以将这些语言的支持分为以下三类:

2.4 那种语言 WebAssembly 支持最好

经常被问及生产级 WebAssembly 最推崇哪些语言,其实非常建议使用 C/C++、Rust 和 AssemblyScript。MDN 上针对 C/C++、Rust 等模块与 WebAssembly 的集成都已经有非常详细的教程,可以直接使用。

可以针对模块的编写语言,选择不同的工具进行 WebAssembly 输出编译。

3.WebAssembly 工具链发展

3.1 官方与设计工具链支持

当谈论 WebAssembly 工具链时,实际上谈论的是获取语言源代码、并使其可运行所必需的一组工具。

一些语言工具链支持 Wasm 作为核心功能,例如:Rust、Zig 和 LLVM (包括 C 和 C++)都支持 Wasm。 值得一提的是 .NET 工具链,微软在这方面做得非常出色,NET 每次发布时都给人留下了深刻的印象。

2022 年 Python 和 Ruby 都宣布解释器可以编译成 Wasm,这意味着 Wasm 支持两种语言!

虽然,有多种语言尚未引入官方 Wasm 支持,但其社区已经弥合了这一差距。 例如,Swiftwasm 项目提供了一个 Swift-to-wasm 编译器, TeaVM 、CheerpJ 等 支持将 Java 编译为 Wasm, TinyGo 支持编译 Go 到 Wasm。

3.2 JavaScript 的 WebAssembly 工具链

排名第一的语言 JavaScript 一直有点反常规。 这是历史遗留问题,正如最初设想的那样,Wasm 与 JavaScript 同时在浏览器中并存。 因此,在 Wasm 内部运行 Javascript 的想法似乎违反直觉。 但是,在 Wasm 中运行 JavaScript,已经出现了浏览器内和浏览器外(云原生、边缘计算等)的情况。

Safari、V8 (包括 Chrome、Edge 等)和 Firefox 都有复杂的 JavaScript 引擎, 但第一个成功的 JS-on-Wasm 竞争者来自 QuickJS 的开源项目。当然, 不过,Mozilla 的 Spidermonkey 也逐渐加入竞争。后者是一个复杂的执行环境,能比 QuickJS 等解释器更快地运行 Javascript。

许多语言都已经支持 Wasm, 但正如上文所言,要获得 Wasm 支持,必须使用通常工具链之外的专门工具。在 2023 年初,已经看到 Go 团队在权衡添加 Wasm 和 WASI(Wasm 系统接口)支持的前景,也许会取代 TinyGo 中的 Wasm WASI 支持。

4.WebAssembly 标准流程的优缺点

WebAssembly 由 W3C 标准化, 即标准化 HTML、CSS 和 Web 的组织。

但是,标准、尤其是成熟的标准机构中的标准,很少能快速发展。 从开始到完成,标准可能需要数年时间。 虽然 Wasm 的核心是一个完整的标准,但还有一些附加标准并没有快速发展,比如:Wasm 的垃圾收集规范(缩写为 Wasm-gc)。

垃圾收集描述了在非主动使用内存时清理正在运行的程序中的内存的功能, 许多语言使用垃圾收集器来防止内存不足。

在 Wasm 支持方面,一些语言选择了自己实现内存管理, Swift、.NET 和 Go 就是典型的例子。 但由于各种原因,其他语言选择等待 Wasm-gc 规范达到其最终阶段,比如: Kotlin 和 Dart。不过, Wasm-gc 在 2022 年取得了长足的进步,因此 Kotlin 和 Dart 很可能会脱颖而出。

5.本文总结

本文主要和大家介绍2023年那些编程语言已经支持 WebAssembly。因为篇幅有限,文章并没有过多展开,如果有兴趣,可以在我的主页继续阅读,同时文末的参考资料提供了大量优秀文档以供学习。最后,欢迎大家点赞、评论、转发、收藏!


参考资料

https://www.fermyon.com/wasm-languages/webassembly-language-support

https://www.fermyon.com/blog/complex-world-of-wasm-language-support

https://blog.csdn.net/inthat/article/details/124973667

https://wasmlabs.dev/articles/webassembly-language-runtimes-march-2023/

https://zhuanlan.zhihu.com/p/430138253

https://blog.csdn.net/inthat/article/details/115472227

https://zhuanlan.zhihu.com/p/354509243

https://rustwasm.github.io/wasm-pack/book/

展开阅读全文

更新时间:2024-08-25

标签:进阶   编译器   模块   本文   浏览器   语言   情况   功能   工具   标准

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top