如果用 C 语言而不是 Python 编写,WebAssembly 会运行得更快吗?

Posted

技术标签:

【中文标题】如果用 C 语言而不是 Python 编写,WebAssembly 会运行得更快吗?【英文标题】:Does WebAssembly run faster if written in C as opposed to Python? 【发布时间】:2020-03-31 00:52:31 【问题描述】:

有一长串可以编译成 Wasm 的语言。在 Python 上用 C 或 Rust 之类的东西编写是否有任何性能提升?还是编译成 Wasm 后都一样?

【问题讨论】:

取决于您使用什么将它们编译为 WebAssembly 以及您的代码是什么,但几乎可以肯定是的。 C(或 C++)和 Rust 中缺乏垃圾收集使它们更适合 WebAssembly。有计划公开原生垃圾收集器,但不确定它是否已经实现。 【参考方案1】:

简短回答:是的,因为 Python 语言本身并未编译为 Wasm,而是编译为它的解释器。

说 Python 支持 Wasm 并不总是相同的意思。首先,Python 不是一种编译语言,它是一种脚本语言。不要指望脚本语言会被编译为原生(或 Wasm)语言,因为它不应该以这种方式工作。

那么 Python 是如何支持 Wasm 的呢?用 C 编写的 Python 解释器/运行时(如 cpython)被编译为 Wasm。有两个流行的 Python 运行时支持 Python:pyodide 和 Wasm port for micropython(除了这两者之外,还有很多努力要在浏览器中运行 Python)。它们都是解释器,将 Python 翻译成自己的字节码,然后在 Wasm 中执行字节码。当然会像原生环境中的 cpython 一样有巨大的性能损失。

【讨论】:

那么 Python 字节码是否与 Python-WASM-interpreter 一起发送到客户端执行? 不,Python 字节码是由解释器在运行时生成的。您不能预发送字节码,只能预发送原始脚本。这就是性能损失。 "Python 不是编译语言。"它不是为运行它的 CPU 编译的,而是为 Python 提供的虚拟机编译的。【参考方案2】:

编译到 WebAssembly 基本上只是模拟一种针对虚拟硬件的特殊形式的程序集。当您将“可以编译语言 X”读入 Wasm 时,并不总是意味着该语言从字面上直接编译为 Wasm。在 Python 的情况下,据我所知,这意味着“他们将 Python 解释器编译为 Wasm”(例如 CPython、PyPy),所以整个 Python 解释器都是 Wasm,但它仍然可以正常解释 Python 源代码文件,它不会转换他们到特殊的 Wasm 模块或任何东西。这意味着 Python 解释器的所有开销都在那里,除了 Wasm 引擎的开销等等。

所以是的,出于同样的原因,C 和 Rust(可以通过换出编译器后端直接以 Wasm 为目标)仍将比以 CPython 编译为 Wasm 的 Python 代码运行得更快。在本机运行时加速 Python 的工具(例如 Cython、原始 CPython C 扩展等)也可以在 Wasm 中工作以获得相同的加速,但它不是免费的“将慢速解释语言编译为 Wasm 并成为快速编译语言” ;计算机还没有那么智能。

【讨论】:

更多关于 WebAssembly 上 Python 状态的详细信息here。

以上是关于如果用 C 语言而不是 Python 编写,WebAssembly 会运行得更快吗?的主要内容,如果未能解决你的问题,请参考以下文章

学python用啥编译器啊,哪位大佬推荐一下

用C语言编写“判断一个数是不是为完数”!

什么是python的搭建环境?

用C语言只能编写consoleapplication?

用Python编写web爬虫的5个方法

将更新从 Python 服务器推送到 Web 界面