WebAssembly vs asm.js
Tout d'abord, jetons un coup d'oeil la façon dont, en principe, WebAssembly est différente de asm.jset si il y a un potentiel de réutiliser des connaissances et de l'outillage. La suite donne assez bonne vue d'ensemble:
Nous allons récapituler, WebAssembly (MVP, comme il n'y a plus sur sa feuille de route, à peu près):
- est un format binaire de l'AST avec le typage statique, qui peut être exécuté par les moteurs JavaScript (et donc JIT-mesure ou de la compilation AOT),
- il est de 10 à 20% plus compact (format de comparaison) et un ordre de grandeur plus rapide à analyser que JavaScript,
- il peut exprimer plus bas niveau de fonctionnement qui ne rentrent pas dans la syntaxe JavaScript, lire asm.js (par exemple, les entiers 64 bits, special instructions du PROCESSEUR, SIMD, etc)
- est convertible (dans une certaine mesure) à/de asm.js.
Ainsi, actuellement WebAssembly est une itération sur asm.js et ne cible que C/C++.
Python sur le Web
Il ne ressemble pas à GC est la seule chose qui arrête le code Python de ciblage WebAssembly/asm.js. Les deux représentent un faible niveau de typage statique de code, dans lequel le code Python ne peut pas (réaliste) être représenté. Comme le courant de la chaîne de WebAssembly/asm.js est basé sur LLVM, une langue qui peut être facilement compilé à l'IR LLVM peut être converti à WebAssembly/asm.js. Mais hélas, le Python est trop dynamique pour s'adapter ainsi, comme l'a démontré par Unladen Swallow et plusieurs tentatives de PyPy.
Cette asm.js présentation de diapositives sur l'état de la dynamique des langues. Ce que cela signifie, c'est qu'actuellement, il est seulement possible de compiler l'ensemble de la VM (langage d'implémentation en C/C++) pour WebAssembly/asm.js et l'interpréter (avec JIT si possible) les sources d'origine. Pour Python, il y en a plusieurs projets existants:
- PyPy: PyPy.js (l'auteur de parler à PyCon). Voici libération repo. Principal fichier JS,
pypyjs.vm.js
, elle est de 13 MO (2 MO après l' gzip -6
) + Python stdlib + d'autres trucs.
- Disponible: pyodide, EmPython, Disponible-Emscripten, EmCPython, etc.
empython.js
est de 5,8 MO (2.1 MO après l' gzip -6
), pas de stdlib.
-
Micropython: cette fourche.
Il n'y avait pas construit JS fichiers, j'ai donc été en mesure de construire avec des trzeci/emscripten/
, un ready-made de la chaîne d'Emscripten. Quelque chose comme:
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
Il produit micropython.js
de 1.1 MO (225 KO après gzip -d
). Celui-ci est déjà quelque chose à considérer si vous avez besoin que de très conforme à la mise en œuvre sans stdlib.
Pour produire WebAssembly construction, vous pouvez modifier la ligne 13 de l' Makefile
de
CC = emcc -s RESERVED_FUNCTION_POINTERS=20 -s WASM=1
Ensuite, make -j
produit:
113 KB micropython.js
240 KB micropython.wasm
Vous pouvez regarder la sortie HTML de emcc hello.c -s WASM=1 -o hello.html
, pour voir comment utiliser ces fichiers.
De cette façon, vous pouvez également potentiellement construire PyPy et Disponible dans WebAssembly à interpréter votre application Python dans un navigateur compatible.
Un autre potentiellement intéressant ici, c'est Nuitka, un Python de compilateur C++. Potentiellement, il peut être possible de construire votre application Python en C++ et puis compilez-le avec Disponible avec Emscripten. Mais pratiquement, je n'ai aucune idée de comment le faire.
Solutions
Pour le moment, si vous êtes en train de construire un site web classique ou une application web où télécharger plusieurs méga-octets fichier JS est à peine une option, prendre un coup d'oeil à Python-à-JavaScript transpilers (par exemple Transcrypt) ou JavaScript implémentations de Python (par exemple Brython). Ou tentez votre chance avec les autres à partir de la liste des langues que les compiler en JavaScript.
Sinon, si la taille de téléchargement n'est pas un problème, et vous êtes prêt à s'attaquer à beaucoup d'aspérités, de choisir entre les trois ci-dessus.