WebAssemblyとasm.js
まず、原則としてWebAssemblyがasm.jsとどのように異なるのか、そして既存の知識とツールを再利用する可能性があるかどうかを見てみましょう。以下は、かなり良い概要を示しています。
要約してみましょう、WebAssembly(MVP、ロードマップには詳細があります):
- は、静的型付けを使用したASTのバイナリ形式であり、既存のJavaScriptエンジン(したがって、JIT対応またはコンパイル済みAOT)で実行できます。
- JavaScriptよりも10〜20%コンパクト(gzip圧縮された比較)であり、解析が1桁高速です。
- JavaScript構文に適合しない、より低レベルの操作を表現できます。asm.jsを読み取ります(64ビット整数、特別なCPU命令、SIMDなど)。
- asm.jsとの間で(ある程度)変換可能です。
したがって、現在WebAssemblyはasm.jsのイテレーションであり、C / C ++(および同様の言語)のみを対象としています。
Web上のPython
PythonコードがWebAssembly / asm.jsをターゲットにするのを阻止するのはGCだけではないようです。どちらも低レベルの静的に型付けされたコードを表しており、Pythonコードは(現実的に)表現できません。WebAssembly / asm.jsの現在のツールチェーンはLLVMに基づいているため、LLVMIRに簡単にコンパイルできる言語をWebAssembly / asm.jsに変換できます。しかし残念ながら、Unladen Swallowといくつかの試みで証明されているように、Pythonは動的すぎてそれに適合しません。PyPyの。
このasm.jsプレゼンテーションには、動的言語の状態に関するスライドがあります。つまり、現在、VM全体(C / C ++での言語実装)をWebAssembly / asm.jsにコンパイルし、(可能な場合はJITを使用して)元のソースを解釈することしかできません。Pythonの場合、いくつかの既存のプロジェクトがあります。
PyPy:PyPy.js(PyConでの著者の講演)。これがリリースリポジトリです。メインのJSファイルpypyjs.vm.js
は13MB(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
これは、生産micropython.js
1.1メガバイト(後に225キロバイトの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アプリケーションを解釈することもできます。
ここでもう1つの潜在的に興味深いのは、Nuitkaです。、PythonからC ++へのコンパイラです。潜在的に、PythonアプリをC ++でビルドし、Emscriptenを使用してCPythonと一緒にコンパイルすることが可能です。しかし、実際にはどうすればいいのかわかりません。
ソリューション
当分の間、あなたは、ダウンロードに数メガバイトJSファイルはほとんどのオプションである、従来のWebサイトやWebアプリケーションを構築している場合は、PythonのツーJavaScriptのtranspilers(例えば見てみましょうTranscrypt)またはJavaScriptのPython実装(例えばBrython)。または、JavaScriptにコンパイルされる言語のリストから他の人と運試しをしてみてください。
それ以外の場合、ダウンロードサイズが問題ではなく、多くの荒削りに取り組む準備ができている場合は、上記の3つから選択してください。
2020年第3四半期の更新
JavaScriptポートがMicroPythonに統合されました。それは
ports / javascriptにあります。
このポートは、MicroPython.jsと呼ばれるnpmパッケージとして利用できます。RunKitで試すことができます。
Rustには、RustPythonと呼ばれる活発に開発されたPython実装があり
ます。RustはコンパイルターゲットとしてWebAssemblyを公式にサポートしているため、Readmeの上部にデモリンクがあります。しかし、それは早いです。彼らの免責事項は次のとおりです。
RustPythonは開発段階にあるため、本番環境や障害に耐えられない設定では使用しないでください。
現在のビルドは、Python構文のサブセットのみをサポートしています。