有一长串语言可以编译成Wasm。用 C 或 Rust 这样的东西编写 Python 有什么性能提升吗?还是因为它被编译到 Wasm,所以都是一样的?
简短回答:是的,因为Python,语言本身,不是编译为Wasm,而是编译为它的解释器。
说Python支持Wasm并不总是意味着相同的意思。首先,Python不是一种编译语言,它是一种脚本语言。不要指望脚本语言会被编译为原生(或Wasm(语言,因为它不是这样工作的。
那么 Python 如何支持 Wasm?像cpython这样的Python解释器/运行时,它是用C编写的,被编译为Wasm。有两个流行的Python运行时支持Python:pyodide和micropython的Wasm端口(除了这两个之外,还有很多努力在浏览器中运行Python(。它们都是解释器,将Python转换为自己的字节码,然后在Wasm中执行字节码。当然,就像原生环境中的 cpython 一样,会有巨大的性能损失。
编译到WebAssembly基本上只是模拟一种针对虚拟硬件的特殊形式的汇编。当你读到"可以将语言X编译到Wasm"时,并不总是意味着该语言直接编译到Wasm。就Python而言,据我所知,这意味着"他们将Python解释器编译为Wasm"(例如CPython,PyPy(,所以整个Python解释器都是Wasm,但它仍然正常解释Python源代码文件,它不会将它们转换为特殊的Wasm模块或其他任何东西。这意味着 Python 解释器的所有开销都在那里,除了 Wasm 引擎的开销之外,等等。
所以是的,出于同样的原因,C 和 Rust(可以通过交换编译器后端直接针对 Wasm(仍然比针对编译到 Wasm 的 CPython 的 Python 代码运行得更快。在本机运行时加速 Python 的工具(例如 Cython、原始 CPython C 扩展等(也可以在 Wasm 中工作以获得相同的速度提升,但它不是免费的"将慢速解释语言编译到 Wasm 并成为快速编译语言";计算机还没有那么智能。