अजगर को WebAssembly के लिए संकलित करना


90

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

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

उबंटू मशीन पर ऐसा करने के लिए मुझे क्या कदम उठाने चाहिए? क्या मुझे अजगर कोड को LLVM बिटकोड में बदलना है तो इसे Emscripten का उपयोग करके संकलित करें? यदि हां, तो मैं इसे कैसे हासिल करूंगा?



1
बाहर की जाँच करें pyodide: hacks.mozilla.org/2019/04/…
एलेक्स

1
Pyodide WebAssembly के माध्यम से ब्राउज़र में Python रनटाइम लाता है: github.com/iodide-project/pyodide
guettli

जवाबों:


146

WebAssembly बनाम asm.js

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

चलो पुनरावृत्ति करें, WebAssembly (MVP, क्योंकि इसके रोडमैप पर और अधिक है , मोटे तौर पर):

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

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

वेब पर पायथन

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

इस asm.js प्रस्तुति में गतिशील भाषाओं की स्थिति के बारे में स्लाइड है । इसका क्या मतलब है कि वर्तमान में केवल पूरे VM (C / C ++ में भाषा कार्यान्वयन) को WebAssembly / asm.js और व्याख्या (JIT के साथ जहां संभव हो) मूल स्रोतों को संकलित करना संभव है। पायथन के लिए कई मौजूदा परियोजनाएं हैं:

  1. PyPy: PyPy.js ( PyCon पर लेखक की बात )। यहां जारी है रेपो । मुख्य JS फ़ाइल, pypyjs.vm.js13 MB (2MB बाद gzip -6) + पायथन stdlib + अन्य सामान है।

  2. CPython: pyodide , EmPython , CPython-Emscripten , EmCPython , आदि empython.js5.8 MB (2.1 MB के बाद gzip -6) हैं, कोई stdlib नहीं है।

  3. माइक्रोपिथॉन: यह कांटा

    वहाँ कोई निर्मित जेएस फाइल नहीं था, इसलिए मैं इसके साथ 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 
    

    यह micropython.js1.1 एमबी (225 केबी के बाद gzip -d) का उत्पादन करता है । उत्तरार्द्ध पहले से ही विचार करने के लिए कुछ है, अगर आपको स्टैडलिब के बिना केवल बहुत ही कार्यान्वयन की आवश्यकता है।

    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 आउटपुट को देख सकते हैं।

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

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

समाधान

कुछ समय के लिए, यदि आप एक पारंपरिक वेब साइट या वेब ऐप का निर्माण कर रहे हैं, जहाँ कई मेगाबाइट जेएस फाइल डाउनलोड होती है, तो मुश्किल से एक विकल्प है, पायथन-टू-जावास्क्रिप्ट ट्रांसपिलर्स (जैसे ट्रांसक्रिप्ट ) या जावास्क्रिप्ट पायथन कार्यान्वयन (जैसे ब्रायथन ) पर एक नज़र डालें )। या जावास्क्रिप्ट के लिए संकलित भाषाओं की सूची से दूसरों के साथ अपनी किस्मत आज़माएं ।

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

Q3 2020 अद्यतन

  1. जावास्क्रिप्ट पोर्ट को माइक्रोप्थॉन में एकीकृत किया गया था । यह बंदरगाहों / जावास्क्रिप्ट में रहता है ।

  2. पोर्ट एक npm पैकेज के रूप में उपलब्ध है जिसे MicroPython.js कहा जाता है । आप इसे RunKit में आज़मा सकते हैं

  3. Rust में एक सक्रिय रूप से विकसित पायथन कार्यान्वयन है, जिसे RustPython कहा जाता है । क्योंकि Rust आधिकारिक रूप से WebAssembly को संकलित लक्ष्य के रूप में समर्थन करता है , कोई आश्चर्य की बात नहीं है कि रीडमी के शीर्ष में डेमो लिंक है । हालांकि, यह जल्दी है। उनका अस्वीकरण निम्नानुसार है।

    RustPython एक विकास के चरण में है और इसका उपयोग उत्पादन या एक गलती असहिष्णु सेटिंग में नहीं किया जाना चाहिए।

    हमारा वर्तमान निर्माण केवल पायथन सिंटैक्स के एक सबसेट का समर्थन करता है।


1
वे .js .wasm आकार वास्तव में उचित नहीं हैं। स्ट्रीम संपीड़न अच्छी तरह से समर्थित है और इसका उपयोग दोनों के आकार को कम करने के लिए किया जा सकता है। कितनी बड़ी फाइलें हैं, gzipped? इसके अलावा, अच्छा जवाब।
enigmaticPhysicist

इसलिए जोड़ना चाहता था कि 2020 में, ऐसा लगता है कि ओपी की तलाश में सबसे करीबी चीज है। यह वेब असेंबली में पायथन रनटाइम है (मैं पुट सी और फिर पायथन को wasm में मानूंगा)। यह कई पुस्तकालयों का भी समर्थन करता है। इसके अलावा, उपयोग करने के लिए काफी आसान लगता है।
डेविड फ्रिक

3

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


17
जरुरी नहीं। आप GC को लागू कर सकते हैं - और विशेष रूप से संदर्भ की गिनती, जैसा कि यह पायथन IIRC द्वारा उपयोग किया जाता है - Wasm के शीर्ष पर। सिद्धांत रूप में, आपको CPython लेने में सक्षम होना चाहिए और इसे Emscripten का उपयोग करके Wasm में संकलित करना चाहिए।
एंड्रियास रॉसबर्ग

1
ओपी से मेरा कहना था कि वे मौजूदा साधनों का उपयोग करना चाहते थे - अपने आप में एक परियोजना की तरह लगता है कि cpython GC को लागू करना
मैल्कम व्हाइट

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

3

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

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

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

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

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.