Compiler Python à WebAssembly
j'ai lu qu'il est possible de convertir le code python 2.7 en assemblage Web, mais je ne peux pas trouver un guide définitif sur la façon de le faire.
Jusqu'à présent, j'ai compilé un programme C à L'assemblage Web en utilisant Emscripten et tous ses composants nécessaires, donc je sais qu'il fonctionne (guide utilisé: http://webassembly.org/getting-started/developers-guide / )
quelles sont les étapes que je dois suivre pour faire cela sur une machine Ubuntu? Faire Je dois convertir le code python en bitcode LLVM puis le compiler en utilisant Emscripten? Si oui, comment pourrais-je y parvenir?
3 réponses
WebAssembly vs asm.js
d'abord, voyons comment, en principe, WebAssembly est différent de asm.js , et s'il est possible de réutiliser les connaissances et les outils existants. Ce qui suit donne une assez bonne vue d'ensemble:
- Pourquoi créer une nouvelle norme alors qu'il y a déjà asm.js?
- Qu'est-ce que le différence entre asm.JS et web assembly?
- pourquoi WebAssembly est plus rapide que asm.js
récapitulons, WebAssembly (MVP, comme il y a plus sur sa feuille de route , en gros):
- est un format binaire de AST avec Dactylographie statique, qui peut être exécuté par les moteurs JavaScript existants (et donc JIT-able ou compilé AOT),
- c'est 10-20% plus compact (comparaison gzippée) et un ordre de grandeur plus rapide à analyser que JavaScript,
- il peut exprimer des opérations de bas niveau qui ne rentrent pas dans la syntaxe JavaScript, lire asm.js (p.ex. entiers 64 bits, instructions spéciales du CPU, SIMD, etc.)
- est convertible (dans une certaine mesure) à/de l'asm.js.
ainsi, actuellement WebAssembly est une itération sur asm.js et les objectifs que C/C++.
Python sur le Web
il ne semble pas que GC soit la seule chose qui empêche le code Python de cibler WebAssembly/asm.js. Les deux représentent du code de bas niveau statiquement typé, dans lequel le code Python ne peut pas (de façon réaliste) être représenté. Comme la chaîne d'outils actuelle de WebAssembly / asm.js est basé sur LLVM, un langage qui peut être facilement compilé en LLVM IR peut être converti en WebAssembly / asm.js. Mais hélas, Python est trop dynamique pour s'y intégrer aussi, prouvé par Hirondelle à vide et plusieurs tentatives de PyPy.
Cette asm.js présentation a diapositives sur l'état de la dynamique des langues . Ce que cela signifie, c'est qu'il n'est actuellement possible de compiler que la VM entière (implémentation du langage en C/C++) vers WebAssembly/asm.js et interpréter (avec JIT si possible) les sources originales. Pour Python, il existe plusieurs projets:
- PyPy: PyPy.js (auteur de parler à PyCon ). Voici release repo . Le fichier principal JS,
pypyjs.vm.js
, est de 13 Mo (2 Mo aprèsgzip -6
) + Python stdlib + autres trucs. - Disponible: EmPython , Disponible-Emscripten , EmCPython , etc.
empython.js
est de 5,8 MO (2.1 MO aprèsgzip -6
), pas de stdlib. -
Micropython: cette fourche .
il n'y avait pas de fichier JS construit là, donc j'ai pu le construire avec
trzeci/emscripten/
, une chaîne d'outils Emscripten prête à l'emploi. 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
elle produit
micropython.js
de 1,1 Mo (225 KO aprèsgzip -d
). Ce dernier point est déjà à prendre en considération, si vous n'avez besoin que d'une mise en œuvre très conforme sans stdlib.pour produire WebAssembly construire, vous pouvez changer la ligne 13 du
Makefile
àCC = emcc -s RESERVED_FUNCTION_POINTERS=20 -s WASM=1
puis
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 aussi potentiellement construire PyPy et CPython dans WebAssembly pour interpréter votre application Python dans un navigateur conforme.
une autre chose potentiellement intéressante ici est Nuitka , un Python pour le compilateur C++. Potentiellement, il peut être possible de construire votre application Python en C++ puis de la compiler avec CPython avec Emscripten. Mais pratiquement, Je ne sais pas comment faire.
Solutions
pour le moment, si vous construisez un site Web conventionnel ou une application web où télécharger le fichier JS de plusieurs mégaoctets est à peine une option, jetez un oeil aux transpilers Python-to-JavaScript (par exemple Transcrypt ) ou aux implémentations JavaScript Python (par exemple Brython ). Ou essayez votre chance avec d'autres de liste des langues qui compilent à JavaScript .
Sinon, si la taille du téléchargement n'est pas un problème, et que vous êtes prêt à vous attaquer à beaucoup d'arêtes, Choisissez entre les trois ci-dessus.
ce ne sera pas possible jusqu'à ce que l'assemblage web implémente la collecte des ordures. Vous pouvez suivre les progrès ici: https://github.com/WebAssembly/design/issues/1079
en bref: vous ne pouvez pas convertir Python arbitraire en assemblée Web, et je doute que vous serez en mesure pour un long moment à venir. Une solution de contournement pourrait être Python to C to Web Assembly, mais cela ne va généralement pas fonctionner non plus puisque Python-to-c est fragile (voir ci-dessous).
WebAssembly est spécifiquement destiné aux langages de type C comme vous pouvez le voir à http://webassembly.org/docs/high-level-goals /
Traduire de Python to C peut être fait avec des outils comme PyPy, qui est en développement depuis longtemps, mais qui ne fonctionne toujours pas pour du code Python arbitraire. Il y a plusieurs raisons à cela:
1) Python a quelques structures de données très pratiques, abstraites et agréables, mais elles sont difficiles à traduire en code statique. 2) Python dépend de la collecte dynamique des ordures. 2) La plupart du code Python dépend fortement de diverses bibliothèques, dont chacune a ses propres bizarreries et problèmes (comme être écrit en C, ou même assembleur).
si vous regardez plus attentivement pourquoi Python-en-C (ou Python en C++) a été si délicat, vous pouvez voir les raisons détaillées derrière cette réponse courte, mais je pense que c'est en dehors de la portée de votre question.