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 के साथ जहां संभव हो) मूल स्रोतों को संकलित करना संभव है। पायथन के लिए कई मौजूदा परियोजनाएं हैं:
PyPy: PyPy.js ( PyCon पर लेखक की बात )। यहां जारी है रेपो । मुख्य JS फ़ाइल, pypyjs.vm.js
13 MB (2MB बाद gzip -6
) + पायथन stdlib + अन्य सामान है।
CPython: pyodide , EmPython , CPython-Emscripten , EmCPython , आदि empython.js
5.8 MB (2.1 MB के बाद gzip -6
) हैं, कोई stdlib नहीं है।
माइक्रोपिथॉन: यह कांटा ।
वहाँ कोई निर्मित जेएस फाइल नहीं था, इसलिए मैं इसके साथ 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
यह micropython.js
1.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 अद्यतन
जावास्क्रिप्ट पोर्ट को माइक्रोप्थॉन में एकीकृत किया गया था । यह बंदरगाहों / जावास्क्रिप्ट में रहता है
।
पोर्ट एक npm पैकेज के रूप में उपलब्ध है जिसे MicroPython.js कहा जाता है । आप इसे RunKit में आज़मा सकते हैं ।
Rust में एक सक्रिय रूप से विकसित पायथन कार्यान्वयन है, जिसे RustPython कहा जाता है
। क्योंकि Rust आधिकारिक रूप से WebAssembly को संकलित लक्ष्य के रूप में समर्थन करता है , कोई आश्चर्य की बात नहीं है कि रीडमी के शीर्ष में डेमो लिंक है । हालांकि, यह जल्दी है। उनका अस्वीकरण निम्नानुसार है।
RustPython एक विकास के चरण में है और इसका उपयोग उत्पादन या एक गलती असहिष्णु सेटिंग में नहीं किया जाना चाहिए।
हमारा वर्तमान निर्माण केवल पायथन सिंटैक्स के एक सबसेट का समर्थन करता है।