我已经读过可以将Python 2.7代码转换为Web Assembly,但是我找不到关于如何转换的权威指南。
到目前为止,我已经使用Emscripten及其所有必需的组件将C程序编译到Web
Assembly中,因此我知道它正在工作(使用的指南:http : //webassembly.org/getting-started/developers-
guide/
)
为了在Ubuntu计算机上执行此操作,我必须采取什么步骤?我是否必须将python代码转换为LLVM位代码,然后使用Emscripten进行编译?如果是这样,我将如何实现?
首先,让我们看一下 WebAssembly 在原则上与 asm.js 有何不同,以及是否有可能重用现有的知识和工具。下面给出了很好的概述:
让我们概括一下,WebAssembly(MVP,因为它的路线图上还有更多内容,大概):
因此,当前WebAssembly是asm.js的迭代,并且仅针对C / C ++(和类似语言)。
看起来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(后面为2MB gzip -6
)+ Python stdlib +其他内容。
CPython:pyodide,EmPython,CPython-Emscripten,EmCPython等empython.js
为5.8 MB(后为2.1 MB gzip -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的语言列表中与其他人合作。
否则,如果下载大小不是问题,并且您已准备好解决很多毛病,请在上述三个选项中进行选择。
JavaScript端口已集成到MicroPython中。它位于 ports / javascript中。
该端口可通过名为MicroPython.js的npm软件包获得。您可以在RunKit中尝试一下。
在Rust中有一个积极开发的Python实现,称为 RustPython。由于Rust正式支持WebAssembly作为编译目标,因此自述文件顶部便有演示链接。不过,还早。他们的免责声明如下。
RustPython处于开发阶段,不应在生产或容错设置中使用。
我们当前的版本仅支持Python语法的一部分。
问题内容: 我正在尝试在Win32 python2.7上使用Scapy 我已经设法编译了所有其他依赖项 可以帮助达到此可执行文件的目标吗?“ dnet-1.12.win32-py2.7.exe” (我保证也会更新这个问题和船长手册, 在Windows上使用Python 2.7运行Scapy ) 更新: 我已经设法使用mingw32编译了它,而我正在使用vs2005,并且我必须对libdnet进行一
问题内容: 如何将我的Python应用程序转换为?我编写了一个程序,想知道如何使其他人使用它。我使用Python 3.3。我搜索了一下,但找不到任何东西。 问题答案: cx_Freeze这样做,但是创建了一个具有很多依赖关系的文件夹。py2exe现在执行此操作,并使用 –bundle-files 0选项,仅创建一个EXE,这可能是对您问题的最佳解决方案。 更新:遇到py2exe无法“查找”的第三方
背景背景(原因): 我们有一个用Python编写的项目,运行在集装箱平台上。我们正在使用一个网络文件系统(基于OpenStack)来存储映像和装载,这在时间点恢复方面非常有用,但是Docker映像的大小已经开始扼杀我们的部署。 python:2.7-slim映像大约为180Mb(根据我们的代码和依赖项,大约为200Mb),大约需要45秒的时间。(有很多节点!) 我想做的事: 我想从Python代码
我是Android Studio的初学者,我希望主要活动是在java上而不是在kotlin上。我测试了一些可用的堆栈溢出解决方案,例如: Menu->Tools->Kotlin->将kotlin反编译到java 菜单>工具>Kotlin>显示Kotlin字节码 单击“反编译”按钮 复制java代码 并且总是禁用“反编译”按钮。
问题内容: 我知道Java 7不能提供Java 7的运行时功能,但是由于 没有添加 新的字节码,因此新的字节码仅与非Java语言有关,我想知道转换Java会有多困难纯Java 6的7个源代码(新语句,菱形运算符)(即能够开始将源转换为Java 7而又不失去Java 6兼容性)。 有指针吗? 问题答案: 将Java 7 javac输出的.class文件标记为1.6.0版(即0x32) (根据http
问题内容: 为什么要编译Python脚本?您可以直接从.py文件运行它们,并且效果很好,那么在性能上有什么优势吗? 我还注意到,我的应用程序中的某些文件被编译为.pyc,而另一些则没有,为什么? 问题答案: 它被编译为字节码,可以更快,更快速地使用。 无法编译某些文件的原因是,每次运行脚本时都会重新编译与之一起调用的主脚本。所有导入的脚本将被编译并存储在磁盘上。 Ben Blank的 重要补充:
问题内容: 如何将Android DEX(VM字节码)文件反编译为相应的Java源代码? 问题答案: It’s easy 获取以下工具: 1)dex2jar将dex文件转换为jar文件 2)jd-gui查看jar中的java文件 由于dex2jar进行了一些优化,因此源代码具有很高的可读性。 Procedure:: 这是有关如何反编译的过程: 步骤1: 将中的转换为 注1:在Windows计算机上
我正在玩基于Windows上的MoarVM构建的perl6版本。我创建了一些perl6文件并想将其编译为exe。我尝试了以下操作: 现在我想把r编译成可执行文件 我发现这个链接谈论如何使用鹦鹉,但我正在使用MoarVM目标:http://perlgeek.de/blog-en/perl-6/my-first-executable.writeback 我的问题如何将MoarvVM目标文件编译为Win