2017-06-26 11 views
18

मैंने पढ़ा है कि पाइथन 2.7 कोड को वेब असेंबली में परिवर्तित करना संभव है, लेकिन मुझे ऐसा करने के तरीके पर एक निश्चित मार्गदर्शिका नहीं मिल रही है।पाइथन को WebAssembly में संकलित करना

अब तक मैं वेब सभा के लिए एक सी कार्यक्रम Emscripten और उसके सभी आवश्यक घटक का उपयोग कर तैयार की है, इसलिए मैं यह कर रहा है (गाइड का प्रयोग किया: http://webassembly.org/getting-started/developers-guide/) काम कर पता

क्या कदम मैं क्रम में करने के लिए रखना चाहिए रहे हैं यह उबंटू मशीन पर है? क्या मुझे पाइथन कोड को एलएलवीएम बिटकोड में परिवर्तित करना है, फिर इसे Emscripten का उपयोग करके संकलित करें? यदि हां, तो मैं इसे कैसे प्राप्त करूं?

+0

@guettli https://github.com/pypyjs/pypyjs/issues/145 – denfromufa

उत्तर

22
asm.js

पहले बनाम WebAssembly

, चलो एक बार देख ले कैसे, सिद्धांत रूप में, WebAssemblyasm.js से अलग है, और वहाँ मौजूदा पुन: उपयोग करने की क्षमता है, चाहे ज्ञान और टूलींग।

(, एमवीपी के रूप में वहाँ its roadmap के बारे में अधिक, मोटे तौर पर), के पुनरावृत्ति करते WebAssembly:

  • निम्नलिखित काफ़ी अच्छा सिंहावलोकन देता है स्थिर टाइपिंग के साथ एएसटी का एक द्विआधारी प्रारूप है, जो हो सकता है मौजूदा JavaScript इंजन (और इस प्रकार JIT करने योग्य या संकलित AOT) द्वारा निष्पादित,
  • यह 10-20% अधिक कॉम्पैक्ट (gzipped तुलना) और परिमाण तेजी जावास्क्रिप्ट से पार्स करने के लिए की एक आदेश,
  • इसे और अधिक कम व्यक्त कर सकते हैं है स्तरीय ऑपरेशन जो जावास्क्रिप्ट सिंटैक्स में फिट नहीं होगा, asm.js पढ़ें (उदाहरण के लिए 64-बिट पूर्णांक, विशेष सीपीयू निर्देश, सिम, आदि)
  • परिवर्तनीय (कुछ हद तक) asm.js. से/से है।

इस प्रकार, वर्तमान में WebAssembly asm.js पर एक पुनरावृत्ति है और केवल सी/सी ++ को लक्षित करता है।

अजगर वेब

यह जीसी तरह नहीं दिखता है पर केवल एक चीज है कि लक्षित कर WebAssembly/asm.js से अजगर कोड बंद हो जाता है। दोनों निम्न स्तर के स्थैतिक टाइप किए गए कोड का प्रतिनिधित्व करते हैं, जिसमें पाइथन कोड (वास्तविक रूप से) का प्रतिनिधित्व नहीं किया जा सकता है। चूंकि WebAssembly/asm.js का वर्तमान टूलचेन एलएलवीएम पर आधारित है, एक ऐसी भाषा जिसे आसानी से एलएलवीएम आईआर में संकलित किया जा सकता है उसे WebAssembly/asm.js में परिवर्तित किया जा सकता है। लेकिन हां, पाइथन भी इसमें फिट होने के लिए बहुत गतिशील है, जैसा कि Unladen Swallow और several attempts पाइप के द्वारा साबित हुआ है।

यह asm.js प्रस्तुति slides about the state of dynamic languages है। इसका अर्थ यह है कि वर्तमान में वेब Vssembly/asm.js में पूरे वीएम (सी/सी ++ में भाषा कार्यान्वयन) को संकलित करना और मूल स्रोतों के साथ (जहां संभव हो वहां जेआईटी के साथ) संकलन करना संभव है।

  1. PyPy: PyPy.js (लेखक का talk at PyCon) पायथन के लिए वहाँ कई मौजूदा परियोजनाओं कर रहे हैं।यहां release repo है। मुख्य जेएस फ़ाइल, pypyjs.vm.js, 13 एमबी (gzip -6 के बाद 2 एमबी) + पायथन stdlib + अन्य सामान है।
  2. CPython: EmPython, CPython-Emscripten, EmCPython, आदि empython.js 5.8 एमबी (2.1 एमबी gzip -6 के बाद), कोई stdlib है।
  3. माइक्रोप्रिथॉन: this fork

    वहां कोई निर्मित जेएस फ़ाइल नहीं थी, इसलिए मैं इसे trzeci/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 एमबी (gzip -d के बाद 225 KB) पैदा करता है। उत्तरार्द्ध पहले से ही कुछ विचार करने के लिए है, अगर आपको 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 आउटपुट में देख सकते हैं, कि कैसे इन उपयोग करने के लिए देखने के लिए फ़ाइलें।

    इस तरह आप एक कुशल ब्राउज़र में अपने पायथन एप्लिकेशन की व्याख्या करने के लिए वेबएस्क्रिप्ट में संभावित रूप से पीपीपी और सीपीथन बना सकते हैं।

एक अन्य संभावित दिलचस्प बात यह है यहाँ Nuitka, एक अजगर सेल्सियस तक ++ संकलक है। संभावित रूप से आपके पाइथन ऐप को सी ++ में बनाना संभव हो सकता है और उसके बाद इसे साइप्रथन के साथ ईएमएसस्क्रिप्ट के साथ संकलित करना संभव हो सकता है। लेकिन व्यावहारिक रूप से मुझे नहीं पता कि यह कैसे करना है।

समाधान

कुछ समय के लिए, आप एक पारंपरिक वेब साइट या वेब अनुप्रयोग जहां डाउनलोड कई-मेगाबाइट जे एस फ़ाइल मुश्किल से एक विकल्प है का निर्माण कर रहे हैं, अजगर करने वाली जावास्क्रिप्ट transpilers पर एक नज़र डालें (जैसे Transcrypt) या जावास्क्रिप्ट पायथन कार्यान्वयन (उदाहरण के लिए Brython)। या list of languages that compile to JavaScript से दूसरों के साथ अपनी किस्मत आजमाएं।

अन्यथा, यदि डाउनलोड आकार कोई मुद्दा नहीं है, और आप बहुत से मोटे किनारों से निपटने के लिए तैयार हैं, तो ऊपर दिए गए तीनों के बीच चयन करें।

6

यह तब तक संभव नहीं होगा जब तक वेब असेंबली कचरा संग्रह लागू न करे। आप प्रगति यहाँ का पालन कर सकते हैं: https://github.com/WebAssembly/design/issues/1079

+3

आवश्यक नहीं है। आप जीसी - और विशेष रूप से संदर्भ गिनती को कार्यान्वित कर सकते हैं, क्योंकि इसका उपयोग पायथन आईआईआरसी द्वारा किया जाता है - वासम के शीर्ष पर। सिद्धांत रूप में, आप सीपीथॉन लेने और एम्सक्रिप्टन का उपयोग करके वासम को संकलित करने में सक्षम होना चाहिए। –

+0

ओपी से मेरा लेना यह था कि वे मौजूदा टूल्स का उपयोग करना चाहते थे - एपीएम ध्वनियों के शीर्ष पर सीपीथॉन जीसी को लागू करने के लिए खुद को एक परियोजना की तरह –

+0

आपको कुछ भी अतिरिक्त नहीं करना चाहिए, बस संकलन करने के लिए सीपीथॉन प्राप्त करें। इसमें पहले ही आरसी कार्यान्वयन, AFAICT शामिल है। –

2

संक्षेप में: आप मनमाने ढंग से पाइथन को वेब असेंबली में परिवर्तित नहीं कर सकते हैं, और मुझे संदेह है कि आप आने वाले लंबे समय तक सक्षम होंगे। एक वर्कअराउंड वेब पर असेंबली के लिए पाइथन हो सकता है, लेकिन आमतौर पर यह काम नहीं करेगा क्योंकि पाइथन-टू-सी नाजुक है (नीचे देखें)।

WebAssembly विशेष रूप से सी-जैसी भाषाओं के लिए लक्षित है के रूप में आप http://webassembly.org/docs/high-level-goals/

अजगर से सी PyPy है, जो एक लंबे समय के लिए विकास के तहत किया गया है जैसे उपकरणों के साथ किया जा सकता है में अनुवाद पर देख सकते हैं, लेकिन जो अभी भी होता है मनमानी पायथन कोड के लिए काम नहीं करते हैं। इसके लिए कई कारण हैं:

1) पायथन के पास कुछ बहुत ही आसान, अमूर्त और अच्छी डेटा संरचनाएं हैं, लेकिन उन्हें स्थिर कोड में अनुवाद करना मुश्किल है। 2) पायथन गतिशील कचरा संग्रह पर निर्भर करता है। 2) अधिकांश पायथन कोड विभिन्न पुस्तकालयों पर भारी निर्भर करता है, जिनमें से प्रत्येक के अपने स्वयं के quirks और मुद्दों (जैसे सी, या यहां तक ​​कि assembler में लिखा जा रहा है) है।

यदि आप अधिक सावधानी से देखते हैं कि क्यों पाइथन-टू-सी (या पाइथन टू सी ++) इतना मुश्किल हो गया है तो आप इस जवाब के पीछे विस्तृत कारण देख सकते हैं, लेकिन मुझे लगता है कि यह आपके प्रश्न के दायरे से बाहर है।

संबंधित मुद्दे