我已经读到了将Python2.7代码转换为Web程序集是可能的,但我找不到关于如何转换的明确指南
到目前为止,我已经使用Emscripten及其所有必要组件编译了一个C程序到Web Assembly,所以我知道它正在工作(使用指南:http://webassembly.org/getting-started/developers-guide/)
为了在Ubuntu机器上实现这一点,我必须采取哪些步骤?我是否必须将python代码转换为LLVM位代码,然后使用Emscripten进行编译?如果是,我将如何实现这一点
WebAssembly与asm.js
首先,让我们来看看,在原理上,EM> WebAssembly 不同于ASM.JS,以及是否有重用现有知识和工具的潜力。下面给出了一个很好的概述:
- 既然已经有了asm.js,为什么还要创建新标准
- asm.js和web程序集之间有什么区别
- 为什么WebAssembly比asm.js快
让我们概括一下WebAssembly(MVP,大致上在其路线图上有更多内容):
- 是一种带有静态类型的AST二进制格式,可由现有JavaScript引擎执行(因此可JIT或编译AOT)
- 它比JavaScript紧凑10-20%(gzip比较),解析速度快一个数量级
- 它可以表达不适合JavaScript语法的低级操作,读取asm.js(例如64位整数、特殊CPU指令、SIMD等)
- 可以(在某种程度上)从asm.js转换到asm.js
因此,目前WebAssembly是asm.js上的一个迭代,只针对C/C++(和类似的语言)
网络上的Python
看起来GC并不是阻止Python代码以WebAssembly/asm.js为目标的唯一因素。两者都表示低级静态类型的代码,而Python代码无法(实际地)表示。由于WebAssembly/asm.js当前的工具链是基于LLVM的,因此可以将一种易于编译为LLVM IR的语言转换为WebAssembly/asm.js。但遗憾的是,Python太过动态,无法适应它,UnladenSwallow和PyPy的几次尝试证明了这一点
此asm.js演示文稿包含有关动态语言状态的幻灯片。这意味着目前只能将整个VM(C/C++语言实现)编译为WebAssembly/asm.js并解释(可能的话使用JIT)原始源代码。对于Python,有几个现有项目:
-
PyPy:PyPy.js(作者在PyCon上的演讲)。这是发行回购协议。主JS文件
pypyjs.vm.JS,是13MB(在gzip-6之后是2MB)+Python stdlib+其他东西 -
CPython:pyodide、EmPython、cpythonemscripten、EmCPython等。
EmPython.js是5.8MB(在gzip-6之后是2.1MB),没有stdlib -
微型蟒蛇:这个叉子
那里没有构建的JS文件,所以我可以使用
trzeci/emscripten/,一个现成的emscripten工具链来构建它。比如:git克隆https://github.com/matthewelse/micropython.git cd微型蟒蛇 docker run--rm-it-v$(pwd):/src trzeci/emscripten bash apt获取更新&&;apt get安装-y python3 cd电子脚本 make-j #要运行REPL:npm安装&&;nodejs server.js它产生了1.1MB的
micropython.js(在gzip-d之后是225KB)。如果您只需要非常兼容的实现而不使用STDLIB。要生成WebAssembly构建,您可以将
Makefile的第13行更改为CC=emcc-s保留函数\u指针=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应用程序
另一个潜在有趣的事情是NuITKA,一个Python到C++编译器。潜在地,可以将您的Python应用程序构建到C++,然后与Emscripten一起使用CPython编译它。但实际上我不知道怎么做
解决方案
目前,如果您正在构建一个传统的网站或web应用程序,下载几兆字节的JS文件几乎不是一个选项,那么请看一下Python到JavaScript的Transpiler(例如Transcrypt)或JavaScript Python实现(例如Brython)。或者在编译成JavaScript的语言列表中的其他语言中试试运气
否则,如果下载大小不是一个问题,并且您已经准备好处理许多粗糙的边缘,请在以上三种之间进行选择
2020年第三季度更新
-
JavaScript端口被集成到MicroPython中。它生活在
端口/javascript -
该端口作为名为MicroPython.js的npm包提供。
你可以在RunKit中试用 -
Rust中有一个积极开发的Python实现,名为
锈蟒。因为Rust正式支持WebAssembly作为
编译目标,毫不奇怪在
自述文件的顶部。虽然现在还早。他们的免责声明如下RustPython正处于开发阶段,不应在中使用
生产或故障不容忍设置我们当前的构建只支持Python语法的一个子集