110 votes

Compiler Python dans WebAssembly

J'ai lu qu'il est possible de convertir Python 2.7 code Web de l'Assemblée, mais je ne peux pas trouver un guide détaillé sur la façon de ainsi.

Jusqu'à présent, j'ai compilé un programme C Web de l'Assemblée à l'aide de Emscripten et toutes ses composantes nécessaires, donc je sais qu'il travaille (guide utilisé: http://webassembly.org/getting-started/developers-guide/)

Quelles sont les étapes que je doit prendre pour ce faire sur une machine Ubuntu? Dois-je convertir le code python pour LLVM bitcode puis le compiler à l'aide de Emscripten? Si oui, comment pourrais-je y parvenir?

167voto

saaj Points 412

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:

  1. 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.
  2. 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.
  3. 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.

6voto

GregD Points 176

En bref: vous ne pouvez pas convertir arbitraire Python pour le Web de l'Assemblée, et je doute que vous serez en mesure de pour une longue période à venir. Une solution pourrait être de Python C Web de l'Assemblée, mais qui n'est en général pas aller au travail, soit depuis Python-C est fragile, (voir ci-dessous).

WebAssembly est spécifiquement ciblée sur C-comme langues comme vous pouvez le voir à http://webassembly.org/docs/high-level-goals/

La traduction de Python, C peut être fait avec des outils tels que PyPy, qui a été en développement pendant une longue période, mais qui ne fonctionne toujours pas pour arbitraire de code Python. Il y a plusieurs raisons à cela:

1) Python a quelques très pratique, abstrait et nice structures de données, mais ils sont difficiles à traduire en code statique. 2) Python dépend de la dynamique de collecte des ordures. 2) la Plupart du code Python dépend fortement des bibliothèques différentes, dont chacune a ses propres particularités et des enjeux (comme le fait d'être écrit en C, ou même de l'assembleur).

Si vous regardez plus attentivement pourquoi Python-C (ou Python, C++) a été aussi difficile que vous pouvez voir en détail les raisons de cette laconique réponse, mais je pense que c'est en dehors de la portée de votre question.

3voto

Malcolm White Points 163

Cela ne sera possible que si l'assembly Web implémente la récupération de place. Vous pouvez suivre les progrès ici: https://github.com/WebAssembly/proposals/issues/16

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X