现在可以部署到Web Assembly的6种语言

B站影视 内地电影 2025-04-17 17:54 1

摘要:WebAssembly或Wasm为开发人员提供了一种在浏览器或您可以部署WebAssembly运行时的其他地方创建以接近原生速度运行的程序的方法。但你通常不会直接在Wasm中编写程序。相反,你用其他语言编写程序——有些语言比其他语言更适合翻译成Wasm——并以

Rust、Go、JavaScript、C/C++和JavaScript都可以在Wasm上运行。这是你需要知道的。

WebAssembly或Wasm为开发人员提供了一种在浏览器或您可以部署WebAssembly运行时的其他地方创建以接近原生速度运行的程序的方法。但你通常不会直接在Wasm中编写程序。相反,你用其他语言编写程序——有些语言比其他语言更适合翻译成Wasm——并以Wasm作为目标编译它们。

这六种语言(我算C和C++为两种)都可以通过不同的工具部署到Wasm运行时,并且具有不同程度的易用性和兼容性。如果您想探索使用Wasm作为代码的部署目标,您将想知道您选择的语言有多适合作为Wasm运行。我还将讨论每个部署所涉及的工作水平。

Rust

在某些方面,Rust是最适合部署到WebAssembly的语言。您现有的Rust代码不需要进行大量修改即可编译到Wasm,大多数更改都涉及设置正确的编译器目标和编译设置。该工具还自动生成样板JavaScript,允许编译的Wasm模块直接与网页配合使用。

编译模块的大小会有所不同,但Rust可以生成相当精简和高效的代码,因此一个简单的“Hello, world”通常不会超过几千字节。Rust的维护者撰写了使用Rust的Wasm的完整指南,详细介绍了如何保持交付的二进制文件的大小,以及为现有的通用Rust板条箱添加Wasm支持。

C/C++

C和C++是第一批编译为Wasm的语言之一,这部分原因是这些语言中的许多低级行为很好地映射到Wasm的指令集。早期的Wasm演示是用C/C++编写的图形演示和游戏的移植,这些概念验证项目在很大程度上将Wasm作为一种技术来销售。(看!我们可以在浏览器中玩Doom!)

最早开发用于将C/C++编译为Wasm的工具之一是Emscripten工具链。从那时起,Emscripten已经成为将C或C++编译为Wasm的全面工具链——从这个意义上说,它提供了移植代码的详细说明。SIMD(Wasm支持)、网络、C++异常、异步代码和许多其他高级功能都可以移植到Wasm,尽管工作量因功能而异。例如,默认情况下不启用Pthread支持,并且仅当Web服务器正确设置了某些源标头时,才会在浏览器中工作。

从版本8及更高版本起,Clang C/C++编译器可以原生编译成Wasm,无需额外的工具。然而,Emscripten使用与Clang(LLVM编译器框架)相同的基础技术,并可能专门为编译提供更完整的工具集。

Go

Go语言在2018年8月增加了对WebAssembly的支持,作为1.11版本的编译目标。Wasm最初是一个实验项目,现在作为一个目标得到了相当好的支持,但有一些注意事项。

与Rust一样,为了Wasm,对Go程序的大多数更改都涉及更改编译过程,而不是程序本身。Wasm工具链包含在Go编译器中,因此您不需要安装任何其他工具或软件包;您只需在编译时更改GOOS和GOARCH环境变量即可。您需要手动设置JavaScript模板才能使用Wasm编译的Go模块,但这样做并不难;它主要涉及复制一些文件,如果需要,您可以自动执行该过程。

使用Go for Wasm的更复杂的部分涉及与DOM的交互。通过syscalls/js软件包包含的工具可以工作,但除了基本交互之外,其他任何东西都很尴尬。对于任何更大的东西,请选择一个合适的第三方图书馆。

使用Go with Wasm的另一个缺点是生成的二进制工件的大小。Go的运行时间意味着即使是“Hello, world”模块也可以多到两兆字节。您可以压缩Wasm二进制文件以节省空间,或者使用不同的Go运行时,如TinyGo——尽管该选项仅适用于Go语言的子集。

JavaScript

将JavaScript翻译成Wasm似乎是多余的。毕竟,Wasm最常见的目的地之一是浏览器,大多数浏览器都内置了JavaScript运行时。但如果你愿意,可以将JavaScript编译为Wasm。

JavaScript-to-Wasm最现成的工具是Javy,由Bytecode联盟(Wasm计划的主要支持者)创建和支持。Javy没有将JavaScript代码编译到Wasm,而是在基于Wasm的JavaScript运行时中执行它。它还使用动态链接策略来保持生成的Wasm模块合理地小,尽管大小会因程序中使用的功能而异。

Python

Python的情况与Go的情况类似,但更明显。没有Python运行时,您无法运行Python程序,没有Python标准库就很难做任何有用的事情——更不用说第三方Python软件包的生态系统了。您可以通过Wasm运行时运行Python,但它笨重笨重,Python-on-Wasm工具的当前状态没有简化。

通过Wasm运行时运行Python应用程序的常见方法是Pyodide,这是CPython运行时通过Emscripten到Wasm的端口。它的一个实现,PyScript,允许您根据JavaScript在网页中运行Python程序。它还包括对Python和JavaScript/DOM方面之间的双向通信支持。

尽管如此,Pyodide还是有很多缺点。使用C扩展(例如NumPy)的软件包必须手动移植到Pyodide才能工作。只能从PyPI安装纯Python软件包。此外,Pyodide必须为Python运行时下载一个单独的Wasm软件包,该软件包运行到几兆字节,因此对于那些不期望每次使用该语言时都有大量下载的人来说,这可能会造成负担。

来源:AI中国一点号

相关推荐