将Python编译为WebAssembly
我已经读到了将Python2.7代码转换为Web程序集是可能的,但我找不到关于如何转换的明确指南 到目前为止,我已经使用Emscripten及其所有必要组件编译了一个用于Web组装的C程序,所以我知道它正在工作(使用指南:)将Python编译为WebAssembly,python,emscripten,webassembly,Python,Emscripten,Webassembly,我已经读到了将Python2.7代码转换为Web程序集是可能的,但我找不到关于如何转换的明确指南 到目前为止,我已经使用Emscripten及其所有必要组件编译了一个用于Web组装的C程序,所以我知道它正在工作(使用指南:) 为了在Ubuntu机器上实现这一点,我必须采取哪些步骤?我是否必须将python代码转换为LLVM位代码,然后使用Emscripten进行编译?如果是这样,我将如何实现这一点?在web程序集实现垃圾收集之前,这是不可能的。您可以在此处跟踪进度:WebAssembly vs
为了在Ubuntu机器上实现这一点,我必须采取哪些步骤?我是否必须将python代码转换为LLVM位代码,然后使用Emscripten进行编译?如果是这样,我将如何实现这一点?在web程序集实现垃圾收集之前,这是不可能的。您可以在此处跟踪进度:WebAssembly vs asm.js
首先,让我们来看看,原则上,WebAssembly如何不同于ASM.JS,以及是否有重用现有知识和工具的潜力。下面给出了一个很好的概述:
- 是一种带有静态类型的AST二进制格式,可由现有JavaScript引擎执行(因此可JIT或编译AOT)
- 它比JavaScript紧凑10-20%(gzip比较),解析速度快一个数量级
- 它可以表达不适合JavaScript语法的低级操作,读取asm.js(例如64位整数、特殊CPU指令、SIMD等)
- 可以(在某种程度上)从asm.js转换到asm.js
pypyjs.vm.JS
,是13MB(在gzip-6
之后是2MB)+Python stdlib+其他东西
empython.js
是5.8MB(在gzip-6
之后是2.1MB),没有stdlib
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
它产生了1.1MB的micropython.js
(在gzip-d之后是225KB)。如果您只需要非常兼容的实现而不使用STDLIB。
要生成WebAssembly构建,您可以将Makefile
的第13行更改为
CC = emcc -s RESERVED_FUNCTION_POINTERS=20 -s WASM=1
然后make-j
生成:
113 KB micropython.js
240 KB micropython.wasm
您可以查看emcc hello.c-s WASM=1-o hello.HTML的HTML输出,了解如何使用这些文件
通过这种方式,您还可以在WebAssembly中构建PyPy和CPython,以便在兼容浏览器中解释Python应用程序
这里另一个有趣的事情是,Python到C++编译器。潜在地,可以将您的Python应用程序构建到C++,然后与Emscripten一起使用CPython编译它。但实际上我不知道怎么做
解决 目前,如果您正在构建一个传统的web站点或web应用程序,下载几兆字节的JS文件几乎不是一个选项,那么看看Python到JavaScript的transpilers(例如)或JavaScript Python实现(例如)。或者和其他人一起碰碰运气 否则,如果下载大小不是一个问题,并且您已经准备好处理许多粗糙的边缘,请在以上三种之间进行选择 2020年第三季度更新简而言之:有Transpiler,但您不能自动将任何任意Python转换为Web汇编,我怀疑您在很长一段时间内都不能。虽然从理论上讲,这些语言同样强大,而且手动翻译总是可能的,但Python允许一些数据结构和表达模式,这需要非常智能的跨语言编译器(或transpiler)[见下文]。解决方法可能是Python-to-C-to-Web组装,因为Python-to-C技术已经相当成熟,但这通常也不起作用,因为Python-to-C也很脆弱(见下文) WebAssembly专门针对类C语言,如您在 从Python到C的转换可以通过PyPy这样的工具完成,PyPy已经开发了很长时间,但对于任意Python代码仍然不起作用。这有几个原因: