देशी मशीन कोड में अजगर संकलक क्यों नहीं है?


25

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


4
वहाँ है । हास्केल जीएचसीआई के माध्यम से संकलित या व्याख्या के रूप में भी व्यवहार कर सकते हैं
टोस्ट_फ्लेक्स

C ++ में दुभाषिए भी हैं । और शायद अन्य भाषाओं के टन में दोनों कार्यान्वयन हैं।
क्लाउडियो

2
वास्तव में, IronPythong का चयन करके ( ironpython.net ) और "NGEN" का उपयोग द्वारा उत्पादित आईएल कोड संकलन ( msdn.microsoft.com/de-de/library/6t9t5wcf%28v=vs.110%29.aspx ) वहाँ है एक तरह से पायथन को देशी मशीन कोड पर संकलित करने के लिए। ऐसा नहीं है कि मैंने उस टूल चेन का परीक्षण किया था।
डॉक ब्राउन

10
कोई पायथन-टू-देशी कम्पाइलर लिख सकता है। वे सिर्फ इसलिए बहुत दिलचस्प नहीं हैं क्योंकि वे वास्तव में किसी भी महत्वपूर्ण मार्जिन से प्रदर्शन में सुधार नहीं करते हैं, जब तक कि वे वास्तव में पायथन की तरह दिखने वाली भाषा को लागू नहीं करते हैं लेकिन यह बहुत अधिक प्रतिबंधित है। मैंने पहले कहीं और समझाया कि क्यों।

जवाबों:


29

नहीं। पायथन और सी ++ जैसी भाषाओं के बीच गति के अंतर क्यों हैं क्योंकि सांख्यिकीय रूप से टाइप की गई भाषाएं प्रोग्राम की संरचना और इसके डेटा के बारे में संकलक जानकारी देती हैं जो इसे कम्प्यूटेशन और मेमोरी एक्सेस दोनों का अनुकूलन करने की अनुमति देती हैं। क्योंकि C ++ जानता है कि चर प्रकार int का है, यह प्रोग्राम को चलाने से पहले ही उस चर को हेरफेर करने का इष्टतम तरीका निर्धारित कर सकता है। दूसरी ओर पायथन में, रनटाइम को पता नहीं होता है कि जब तक दुभाषिया द्वारा लाइन नहीं पहुंचाई जाती है, तब तक चर में क्या मूल्य है। यह संरचनाओं के लिए अत्यंत महत्वपूर्ण है, जहां सी ++ में, संकलनकर्ता संरचना के आकार और संकलन के दौरान स्मृति के भीतर अपने क्षेत्रों के प्रत्येक स्थान को आसानी से बता सकता है। इससे यह अनुमान लगाने में बहुत बड़ी शक्ति मिलती है कि डेटा का उपयोग कैसे किया जा सकता है और यह उन पूर्वानुमानों के अनुसार अनुकूलन करने देता है।

प्रभावी रूप से पाइथन जैसी भाषाओं को संकलित करने के लिए आपको निम्न की आवश्यकता होगी:

  1. सुनिश्चित करें कि कार्यक्रम के निष्पादन के दौरान डेटा की संरचना स्थिर है। यह समस्याग्रस्त है क्योंकि पायथन में eval और metaclasses हैं। दोनों जो कार्यक्रम के इनपुट के आधार पर कार्यक्रम की संरचना को बदलना संभव बनाते हैं। यह उन चीजों में से एक है जो पायथन को ऐसी अभिव्यंजक शक्ति देते हैं।
  2. स्रोत कोड से ही सभी चर, संरचनाओं और कक्षाओं के प्रकारों को सुरक्षित रखें। हालांकि यह कुछ हद तक संभव है, स्थैतिक प्रकार प्रणाली और एल्गोरिथ्म इतना जटिल होगा कि इसे प्रयोग करने योग्य तरीके से लागू करना लगभग असंभव होगा। आप इसे भाषा के सबसेट के लिए कर सकते हैं, लेकिन निश्चित रूप से भाषा सुविधाओं के पूरे सेट के लिए नहीं।

6
यह ध्यान देने योग्य है कि यह समस्या को कठिन बनाता है , लेकिन असंभव नहीं है। sbcl कॉमन लिस्प को संकलित करता है जो कि गतिशील भी है eval, और कंपाइलर लेखकों को दुखी करने के लिए अन्य चीजों का एक समूह है। यह gcc के स्तर तक नहीं है, लेकिन यह निश्चित रूप से CPython के दुभाषिया की तुलना में तेज़ है।
डैनियल ग्रैज़र

3
@jozefg मैंने कहा कि प्रभावी ढंग से संकलन। सिर्फ संकलन नहीं। पायथन में भी साइथॉन कंपाइलर है जो देशी कोड का उत्पादन करता है। मुद्दा यह है कि संकलक उन सभी प्रकार के ऑप्टिमाइज़ेशनों का भी हिस्सा हैं जो सांख्यिकीय रूप से टाइप की गई भाषाओं के लिए संकलक हैं। और जब आप प्रदर्शन की तुलना करते हैं, तो इसे संकलित सी ++ की तुलना करें और पायथन की व्याख्या न करें।
व्यंग्यात्मक

2
वास्तव में, आपको आश्चर्य होगा कि sbcl क्या कर सकता है। बेंचमार्क गेम इसे जावा के रूप में तेजी से चलने वाला दिखाता है, लगभग जीएचसी जितना तेज़, और सी के 1x से 10x के भीतर। यह किसी भी मानक से धीमा नहीं है। हां, गतिशील प्रकार कुछ हद तक संकलन को रोकते हैं, लेकिन इतना नहीं जितना आप सोचते हैं।
डैनियल ग्रैज़र

3
संकलित अजगर की व्याख्या की गई अजगर की गति की तुलना अपने आप में दिलचस्प है। "C ++ का उपयोग करें" कहना बंद करें। शायद आपके पास पहले से ही पायथन में लिखा कोड है। शायद अजगर में कोड लिखना आसान है। किसे पड़ी है। जो मैं परवाह करता हूं वह 1.5x स्पीड अप (जो भी हो) है। जो बहुत बड़ा बदलाव ला सकता है।
थॉमस एडिंग

3
दूसरे शब्दों में, यदि आप संकलित करना चाहते हैं, तो उसके लिए ट्यून की गई दूसरी भाषा चुनें, जैसे C ++ या पास्कल।
Please_Dont_Bully_Me_SO_Lords 14

0

दो अवधारणाओं से हमें यह समझने में मदद मिल सकती है कि पायथन ने देशी मशीन कोड को क्यों संकलित किया है "संकलित सी या अन्य सामान्यतः संकलित भाषाओं के रूप में तेजी से नहीं चल सकता है"। उन्हें अर्ली बाइंडिंग और लेट बाइंडिंग कहा जाता है।

मुझे यह कहकर शुरू करना चाहिए कि मैं पायथन विशेषज्ञ नहीं हूं, और मैं दुर्घटना से इस साइट पर आया था। लेकिन मुझे यह साइट पसंद है।

जैसा कि यहां एक अन्य प्रतिक्रिया में उल्लेख किया गया है, सी ++ संकलक कार्यक्रम के बारे में बहुत कुछ जान सकता है और निर्णय ले सकता है कि विशिष्ट डेटा संरचनाओं के लिए कौन से संचालन का उपयोग करना है। एक उदाहरण के रूप में यदि दो पूर्णांक चर को एक साथ जोड़ने की आवश्यकता होती है, तो संकलक जानता है कि वे मूल पूर्णांक हैं, उदाहरण के लिए 32 बिट्स चौड़े हैं और यह उन्हें एक "ADD" निर्देश के साथ जोड़ सकता है। तो यह कोड में ADD निर्देश को संकलित करता है। जब प्रोग्राम चल रहा हो तो इसे लॉक किया गया है और इसे बदला नहीं जा सकता है। यह जल्दी बाध्यकारी है।

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


-4

मुझे लगता है कि पाइथन की बारीकियों के साथ ऐसा करने के लिए खुद को और अधिक करना होगा, उसी कारण से आप मशीन कोड में C # संकलन नहीं कर सकते। भाषा की बारीकियाँ वास्तव में आपके कार्यक्रमों को छोटी गाड़ी की तरह प्रस्तुत करेंगी भले ही भाषा की प्रकृति के कारण यह संभव हो। सिर्फ सी भाषा क्यों नहीं सीखते? सी ++ की तुलना में इसकी बहुत आसान और पायथन की तुलना में थोड़ा उन्नत लेकिन अभी भी स्वीकार्य है।


5
C # मशीन कोड पर सीधे जा सकता है: सामान्य मध्यवर्ती भाषा: समय संकलन का आगे - "सीएलआई-संगत निष्पादन वातावरण भी एक विधानसभा के आगे-आगे संकलन (एओटी) करने के विकल्प के साथ आते हैं ताकि इसे हटाकर तेजी से निष्पादित किया जा सके। रनटाइम के समय JIT प्रक्रिया। .NET फ्रेमवर्क में एक विशेष टूल है जिसे नेटिव इमेज जेनरेटर (NGEN) कहा जाता है जो AOT का प्रदर्शन करता है। मोनो में AOT करने का विकल्प भी है। "
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.