我已经了解到可以将Python2.7代码转换为Web程序集,但是我找不到关于如何这样做的明确指南。
到目前为止,我已经使用Emscripten及其所有必需的组件编译了一个C程序到Web程序集,因此我知道它正在工作(使用的指南:http://webassembly.org/getting-started/developers-guide/)
为了在Ubuntu机器上完成这项工作,我必须采取哪些步骤?我需要将python代码转换为LLVM位代码,然后使用Emscripten编译它吗?如果是这样,我该如何实现?
Tags:
WebAssembly与asm.js
首先,让我们看看,原则上,WebAssembly与asm.js有何不同,以及是否有可能重用现有的知识和工具。以下是很好的概述:
让我们概括一下,WebAssembly(MVP,因为有更多关于its roadmap的内容,大致如下):
因此,目前WebAssembly是As.js上的迭代,而目标仅是C/C++。
网络上的Python
看起来GC并不是阻止Python代码瞄准WebAssembly/asm.js的唯一方法。两者都表示低级静态类型的代码,其中Python代码不能(实际地)表示。由于当前WebAssembly/asm.js的工具链是基于LLVM的,因此可以将一种易于编译为LLVM-IR的语言转换为WebAssembly/asm.js。但遗憾的是,Python的动态性太强,无法容纳它,PyPy的Unladen Swallow和several attempts证明了这一点。
这个asm.js演示文稿有slides about the state of dynamic languages。它的意思是,目前只有将VM(语言实现在C/C++中)编译成WebSasMals/as.js,并用可能的JIT解释原始源。对于Python,有几个现有项目:
pypyjs.vm.js
是13mb(在gzip -6
之后是2MB)+Python stdlib+其他东西。empython.js
是5.8mb(在gzip -6
之后是2.1MB),没有stdlib。微蟒:this fork。
那里没有生成的JS文件,所以我可以用^{} 来生成它,这是一个现成的Emscripten工具链。类似于:
它产生1.1 MB的
micropython.js
(在gzip -d
之后225 KB)。如果您只需要非常兼容的实现而不需要stdlib,那么后者已经是需要考虑的了。要生成WebAssembly构建,可以将
Makefile
的第13行更改为然后
make -j
产生:您可以查看
emcc hello.c -s WASM=1 -o hello.html
的HTML输出,了解如何使用这些文件。这样,您还可以在WebAssembly中构建PyPy和CPython,以便在兼容的浏览器中解释Python应用程序。
另一个潜在有趣的事情是Nuitka,一个Python到C++编译器。潜在地,可以将您的Python应用程序构建到C++,然后与Emscripten一起使用CPython编译它。但实际上我不知道该怎么做。
解决方案
目前,如果您正在构建一个传统的web站点或web应用程序,而下载几个兆字节的JS文件几乎不是一个选项,那么看看Python到JavaScript的transpiler(例如Transcrypt)或JavaScript-Python实现(例如Brython)。或者和list of languages that compile to JavaScript的其他人碰碰运气。
否则,如果下载大小不是问题,并且您已经准备好处理许多粗糙的边,请在以上三者之间进行选择。
简而言之:您不能将任意的Python转换为Web程序集,我怀疑您在未来很长一段时间内是否能够。解决方法可能是Python-to-C-to-Web程序集,但这通常也行不通,因为Python-to-C是脆弱的(见下文)。
WebAssembly是专门针对C类语言的,您可以在http://webassembly.org/docs/high-level-goals/中看到
从Python到C的转换可以使用PyPy这样的工具来完成,PyPy已经开发了很长时间,但是对于任意的Python代码仍然不起作用。这有几个原因:
如果你仔细研究为什么Python to C(或者Python to C++)如此棘手,你可以看到这个简洁答案背后的详细原因,但我认为这超出了你的问题范围。
在web程序集实现垃圾回收之前,这是不可能的。你可以在这里跟踪进度:https://github.com/WebAssembly/proposals/issues/16
相关问题 更多 >
编程相关推荐