python编译成汇编_将Python编译为WebAssembly WebAssembly与asm.js
⾸先,让我们看看,原则上,WebAssembly与asm.js有何不同,以及是否有可能重⽤现有的知识和⼯具。以下是很好的概述:
让我们概括⼀下,WebAssembly(MVP,因为有更多关于its roadmap的内容,⼤致如下):是具有静态类型的AST⼆进制格式,可以由现有的JavaScript引擎执⾏(因此可以使⽤JIT或编译AOT)
它⽐JavaScript紧凑10-20%(gzip⽐较),解析速度快⼀个数量级
它可以表⽰更多不符合JavaScript语法的低级操作,读取asm.js(例如64位整数、特殊CPU指令、SIMD等)
可以(在某种程度上)转换到/从asm.js。
因此,⽬前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,有⼏个现有项⽬:PyPy:PyPy.js(作者的talk at PyCon)。这是release repo。JS主⽂件pypyjs.vm.js是13mb(在gzip -6之后是2MB)+Python stdlib+其他东西。
CPython:pyodide,EmPython,CPython-Emscripten,EmCPython等,empython.js是5.8mb(在gzip -6之后是2.1MB),没有stdlib。
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.1 MB的micropython.js(在gzip -d之后225 KB)。如果您只需要⾮常兼容的实现⽽不需要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应⽤程序。
如何下载javascript另⼀个潜在有趣的事情是Nuitka,⼀个Python到C++编译器。潜在地,可以将您的Python应⽤程序构建到C++,然后与Emscripten⼀起使⽤CPython编译它。但实际上我不知道该怎么做。
解决⽅案
⽬前,如果您正在构建⼀个传统的web站点或web应⽤程序,⽽下载⼏个兆字节的JS⽂件⼏乎不是⼀个选项,那么看看Python到JavaScript的transpiler(例如Transcrypt)或JavaScript-Python实现(例如Brython)。或者和list of languages that compile to JavaScript的其他⼈碰碰运⽓。
否则,如果下载⼤⼩不是问题,并且您已经准备好处理许多粗糙的边,请在以上三者之间进⾏选择。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论