WebAssembly生态(1)--开发语言

前序

最近在紧锣密鼓地适配鸿蒙平台,没时间整理沉淀,只能先拿出一些存货,咱们言归正传,接下来开启WebAssembly生态之旅。

WebAssembly 作为一项新兴的技术,其迭代演进的速度也是让人喜出望外的。目前在其新版本上增加了更全面的指令支持和对大容量内存的友好性;SIMD指令的加入也提高了 WebAssembly 在复杂计算场景下的性能表现。目前,WebAssembly 已经广泛应用于各种 Web 和非 Web 场景,例如 Web 端的视频渲染、编解码、算法移植,以及非 Web 端的 Serverless、客户端跨平台等领域。

随着 WebAssembly 技术的不断进步,未来还有许多值得期待的方向。例如 WebAssembly 的多线程支持、AI 模型的推理和训练。这些发展方向有助于进一步提高 WebAssembly 的性能和功能,从而推动 Web 上更多应用场景的发展。

除了在更广泛场景的支持上,WebAssembly 还具有跨平台、高效、安全的优点。它可以在各种计算机架构上运行,并且具有接近原生代码的性能。此外,WebAssembly 的代码可以在沙箱中运行,有助于保护用户数据和隐私,不会影响主机环境的稳定性和安全性,可以让更多用户放心选择。

针对 WebAssembly 的巨大发展潜力和广泛应用前景,社区和公司也在建设 WebAssembly 生态上投入了巨大的精力。多个流行语言已经相继支持了 WebAssembly 产物,同时WebAssembly的工程化和工具链也在丰富中。

本文将介绍当前 WebAssembly 生态中比较流行的开发语言,后面会继续介绍工具链和引擎方向,请各位老铁敬请期待。值得注意的是,WebAssembly生态在不断迭代和发展。

WebAssembly 语言生态介绍

JavaScript —— WebAssembly 取而代之

JavaScript 其实最开始是 WebAssembly 要替换的目标。但是随着 WasmEdge 等引擎支持 QuickJS 的解释器,JavaScript 逐渐变成了 WebAssembly 平台之上的最流行的编程语言。但JavaScript 庞大的用户群和JavaScript 的单线程模型契合 WebAssembly 的单线程模型,导致JavaScript在WebAssembly平台的风向发生了转变。

 C/C++ —— WebAssembly 先行者

由于 C/C++ 的历史地位,其拥有庞大的用户群体以及完备的工具链。在 WebAssembly 生态中,C/C++ 也是先行者。WebAssembly 技术前身 Emscripten 诞生时就将C/C++ 为初始语言。Emscripten 项目,尝试通过 LLVM 工具链将 C/C++ 语言编写的程序转译为 JavaScript 代码现如今,C/C++ 最常用编译工具链之一的 LLVM 已经把 WebAssembly 添加为受支持的后端。

此外,社区发展了 WebAssembly System Interface 标准(简称 WASI,非 WebAssembly Proposal)。基于这套标准,WebAssembly 的运行环境能够获取系统 IO 等能力,不再依赖宿主语言,变成了一个独立的能够运行在非 Web 端的产品。C/C++中大量使用系统调用的基础库能够移植到 WebAssembly,将 WebAssembly 的能力下沉到了原生。

Rust —— WebAssembly之LLVM

提到WebAssembly 中的Rust,就不得不提Mozilla、英特尔、RedHat 和 Fastly 公司联合成立字节码联盟 ,其 Rust 实现的 wasmtime 虚拟机就是最重量级的 WebAssembly 高性能虚拟机之一。

Rust 编译器借助 LLVM 的能力生成 WebAssembly 产物,因此 WebAssembly 也是 Rust 的目标语言之一。同时,Rust 兼容 C/C++ 的内存模型,无 GC,因此生成的 WebAssembly 产物体积小巧性能表现良好。

Rust 生态同样支持 WASI 标准。因此非 Web 端应用也成了 Rust WebAssembly 生态发展的热门方向。在 wasmtime 虚拟机[2]的加持下,Rust 在服务端应用同样大有可为。

Go  —— WebAssembly 后端支持

Go的内存安全,高性能使其快速成为服务端领域的主流语言,从 Go1.11 开始,WebAssembly 开始作为一个标准平台被官方支持,这说明了 Go 语言官方团队也认可了 WebAssembly 平台的重要性和巨大潜力。同时,社区也存在 Go 实现的大量开源项目,例如 wazero[3] 就是 Go 实现的高性能 WebAssembly 虚拟机。

不过 Go 语言对 WebAssembly 被诟病的一个方面是官方生成的 WASM 文件不是 wasi 规范,同时因为 GC 等特性导致 WASM 体积比较大。社区有个针对嵌入式环境等 TinyGo 变种,后端同样借助 LLVM 的能力输出 WebAssembly 模块。不过因为 LLVM 的依赖非常重,导致 TinyGo 的单个命令行将近 100MB、同样的原因导致无法方便在浏览器环境使用。

总而言之,虽然 Go 能够作为 WebAssembly 开发语言使用,但是也有不小的局限性。

AssemblyScript -- WebAssembly 的 TypeScript

AssemblyScript 是一个把 TypeScript 语法搬到 WebAssembly 的编译器。它目前是 WebAssembly 环境非常受欢迎的一个语言。WebAssembly 最初就是为了前端场景设计的,AssemblyScript 的语法让前端开发者能够很自然地写出可编译为 WebAssembly 的程序。

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

但AssemblyScript 虽然方便了前端程序员编写 WebAssembly 项目,但是其内置的部分库,以及生成的 WebAssembly 稍显臃肿,优化也没有做到最优。例如,导入导出部分生成的代码进行了内存拷贝、pow 库函数生成了大量冗余代码,这些都有待优化。

凹语言 -- WebAssembly 的 国产语言

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

其他支持的语言

除了上面提到的语言之外,还有一些主流语言以各种方式支持了 WebAssembly。例如,Lua 社区存在将 Lua 引擎编译到 WebAssembly 的项目,它让 Lua 脚本运行在浏览器上;C# 社区存在将 C# 编译到 WebAssembly 的实验项目,同时微软官方也有实验中的 C# to WebAssembly 项目。然而,这些项目大部分都处于实验性质,或多或少存在一些限制,导致其无法用在生产环境。

当然,也有一些采用类似 AssemblyScript 路线,通过 Binaryen 输出 WASM。WASM 虽然和 C/C++ 采用相似的内存模型,但如果希望发挥其最大优势需要从语言设计和后端输出两个方向考虑,这也是很多新语言正在探索的方向。

后记

后面我们会继续开启WebAssembly的工具链和引擎篇,敬请期待。

微信公众号首发,欢迎关注、转发、收藏,感谢支持。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值