将Python编译为WebAssembly
我已经读过可以将Python 2.7代码转换为Web Assembly,但是我找不到关于如何转换的权威指南。
到目前为止,我已经使用Emscripten及其所有必需的组件将C程序编译到Web
Assembly中,因此我知道它正在工作(使用的指南:http : //webassembly.org/getting-started/developers-
guide/)
为了在Ubuntu计算机上执行此操作,我必须采取什么步骤?我是否必须将python代码转换为LLVM位代码,然后使用Emscripten进行编译?如果是这样,我将如何实现?
回答:
WebAssembly与asm.js
首先,让我们看一下 WebAssembly 在原则上与 asm.js 有何不同,以及是否有可能重用现有的知识和工具。下面给出了很好的概述:
- 为什么已经存在asm.js时创建新标准?
- 为什么WebAssembly比asm.js更快
让我们概括一下,WebAssembly(MVP,因为它的路线图上还有更多内容,大概):
- 是具有静态类型的AST的二进制格式,可以由现有的JavaScript引擎(因此可以通过JIT或已编译的AOT执行)执行,
- 它比JavaScript压缩了10-20%(压缩比较),解析速度快了一个数量级,
- 它可以表达不适合JavaScript语法的更多低级操作,读取asm.js(例如64位整数,特殊CPU指令,SIMD等)
- 可以(在某种程度上)与asm.js转换。
因此,当前WebAssembly是asm.js的迭代,并且仅针对C / C ++(和类似语言)。
网路上的Python
看起来GC并不是阻止Python代码定位WebAssembly /
asm.js的唯一方法。两者都表示低级的静态类型代码,在其中无法(实际)表示Python代码。由于WebAssembly /
asm.js的当前工具链基于LLVM,因此可以轻松地将其编译为LLVM IR的语言可以转换为WebAssembly /
asm.js。但是可惜,正如Unladen
Swallow和PyPy的多次尝试所证明的那样,Python太动态了,无法适应它。
此asm.js演示文稿包含有关动态语言状态的幻灯片。这意味着当前只能将整个VM(C
/ C ++中的语言实现)编译为WebAssembly / asm.js并解释(在可能的情况下使用JIT)原始源。对于Python,有几个现有项目:
PyPy:PyPy.js(PyCon上的作者演讲)。这是发行回购。JS主文件
pypyjs.vm.js
为13 MB(后面为2MBgzip -6
)+ Python stdlib +其他内容。CPython:pyodide,EmPython,CPython-Emscripten,EmCPython等
empython.js
为5.8 MB(后为2.1 MBgzip -6
),没有stdlib。Micropython:这把叉子。
那里没有构建的JS文件,因此我可以trzeci/emscripten/
使用现成的Emscripten工具链来构建它。就像是:
git clone https://github.com/matthewelse/micropython.git cd micropython
docker run --rm -it -v $(pwd):/src trzeci/emscripten bash
apt-get update && apt-get install -y python3
cd emscripten
make -j
# to run REPL: npm install && nodejs server.js
产生的大小micropython.js
为1.1 MB(之后为225 KB gzip
-d)。如果只需要非常合规的实现而没有stdlib,则后者已经是要考虑的事情。
要生成WebAssembly版本,您可以将的第13行更改Makefile
为
CC = emcc -s RESERVED_FUNCTION_POINTERS=20 -s WASM=1
然后make -j
产生:
113 KB micropython.js 240 KB micropython.wasm
您可以查看的HTML输出emcc hello.c -s WASM=1 -o hello.html
,以了解如何使用这些文件。
这样,您还可以潜在地在WebAssembly中构建PyPy和CPython,以在兼容的浏览器中解释您的Python应用程序。
另一个可能有趣的事情是Nuitka,这是Python到C
的编译器。可能有可能将您的Python应用程序构建为C ,然后将其与带有Emscripten的CPython一起编译。但是实际上我不知道该怎么做。
解决方案
暂时,如果你正在建设一个传统的网站或网络应用程序,其中下载数兆字节的JS文件仅仅是一个选项,看看的Python到JavaScript
transpilers(如Transcrypt)或JavaScript
Python实现(例如Brython)。或者尝试从编译为JavaScript的语言列表中与其他人合作。
否则,如果下载大小不是问题,并且您已准备好解决很多毛病,请在上述三个选项中进行选择。
2020年第三季度更新
JavaScript端口已集成到MicroPython中。它位于 ports / javascript中。
该端口可通过名为MicroPython.js的npm软件包获得。您可以在RunKit中尝试一下。
在Rust中有一个积极开发的Python实现,称为 RustPython。由于Rust正式支持WebAssembly作为编译目标,因此自述文件顶部便有演示链接。不过,还早。他们的免责声明如下。
RustPython处于开发阶段,不应在生产或容错设置中使用。
我们当前的版本仅支持Python语法的一部分。
以上是 将Python编译为WebAssembly 的全部内容, 来源链接: utcz.com/qa/419023.html