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