WebAssembly VS asm.js
首先,让我们来看看如何在原则上,WebAssembly是asm.js不同,以及是否有潜在的重用现有的知识和工具。下面给出了相当不错的概述:
让我们来概括,WebAssembly(MVP,因为有更多的its roadmap,大约):
- 是AST与静态类型的二进制格式,可以是由现有的JavaScript引擎执行(因此可以进行JIT编译或AOT编译),它可以比JavaScript更快10-20%(gzipip比较),解析速度比JavaScript快一个数量级,不适合JavaScript语法的高级操作,请阅读asm.js(例如64位整数,特殊CPU指令,SIMD等)
- 可以在一定程度上转换为/从asm.js.
因此,目前WebAssembly是一个关于asm.js的迭代,仅针对C/C++。
Python中的Web
它看起来并不像GC上是从目标WebAssembly/asm.js停止Python代码的唯一的事情。两者都代表低级静态类型代码,其中Python代码不能(真实地)表示。由于WebAssembly/asm.js的当前工具链基于LLVM,可以轻松编译为LLVM IR的语言可以转换为WebAssembly/asm.js。但是,唉,PyPy的Unladen Swallow和several attempts证明,Python太动态也无法适应它。
此asm.js演示文稿有slides about the state of dynamic languages。这意味着目前只能将整个VM(C/C++中的语言实现)编译为WebAssembly/asm.js并解释(尽可能使用JIT)原始资源。对于Python,有几个现有项目:
- PyPy:PyPy.js(作者的talk at PyCon)。这是release repo。主JS文件,
pypyjs.vm.js
,是13 MB(gzip -6
后2MB)+ Python stdlib +其他东西。
- CPython:EmPython,CPython-Emscripten, EmCPython等
empython.js
是5.8 MB(gzip -6
后2.1 MB),没有stdlib。
Micropython:this fork。
有没有内置的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
它产生1.1的micropython.js
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
你可以看看emcc hello.c -s WASM=1 -o hello.html
HTML输出,来看看如何使用这些文件。
这种方式,您可能还可以建立PyPy和CPython的在WebAssembly来解释一个兼容的浏览器您的Python应用程序。
另一个潜在的有趣的事情是Nuitka,一个Python到C++编译器。可能有可能将您的Python应用程序构建到C++,然后使用Emscripten与CPython一起进行编译。但实际上我不知道该怎么做。
解决方案
暂时,如果你正在建设一个传统的网站或网络应用程序,其中下载数兆字节的JS文件仅仅是一个选项,看看的Python到JavaScript transpilers(如Transcrypt)或JavaScript Python实现(例如Brython)。或尝试与list of languages that compile to JavaScript其他人的运气。
否则,如果下载大小不是问题了,你准备好应付很多粗糙的边缘,上述三者之间进行选择。
@guettli https://github.com/pypyjs/pypyjs/issues/145 – denfromufa