अजगर को एक कंपाइलर की आवश्यकता क्यों नहीं है?


29

बस सोच रहा था (अब जब मैंने C ++ से शुरुआत की है जिसे एक कंपाइलर की आवश्यकता है) तो पायथन को एक कंपाइलर की आवश्यकता क्यों नहीं है?

मैं बस कोड दर्ज करता हूं, इसे एक निष्पादन के रूप में सहेजता हूं, और इसे चलाता हूं। C ++ में मुझे बिल्ड और उस अन्य मज़ेदार सामान को बनाना होगा।


4
अजगर कई कार्यान्वयन के साथ एक भाषा है। आयरन पायथन को उसी तरह संकलित किया जाता है जैसे C # और C ++ संकलित किया जाता है, और इसके जैसे अन्य कार्यान्वयन भी हो सकते हैं।
जॉब

1
C # और C ++ को समान तरीके से संकलित नहीं किया गया है - हालांकि आप तर्क दे सकते हैं कि वे दोनों अंततः मशीन के निर्देशों के रूप में समाप्त होते हैं, लेकिन यदि आप करते हैं तो आप कह सकते हैं कि BASIC को भी उसी तरह संकलित किया गया है।
gbjbaanb

7
@ जीबीजैनब लेकिन फिर अंग्रेजी को संकलित नहीं किया गया है और एक वाक्य का शब्दार्थ विश्लेषण दो समान रूप से मान्य परिणाम प्राप्त कर सकता है और ऊपर पढ़ा जा सकता है "लौह अजगर को केवल C # और C ++ संकलित किया जाता है"
Rune FS

अपने पायथन कोड को लिखने के लिए आप किस प्लेटफॉर्म / सॉफ्टवेयर का उपयोग कर रहे हैं? यदि आप एक .py फ़ाइल लिखते हैं, तो यह एक निष्पादन योग्य नहीं है। यह अभी भी एक स्रोत कोड फ़ाइल है। कमांड लाइन से आप python.py फ़ाइल की व्याख्या करने के लिए कमांड का उपयोग कर रहे हैं या यदि आप आईडीएल का उपयोग करते हैं या आईडीई ग्रहण करते हैं तो यह आपके लिए करता है।
रिक हेंडरसन

जवाबों:


68

पायथन में एक कंपाइलर है! आप बस इसे नोटिस नहीं करते क्योंकि यह स्वचालित रूप से चलता है। आप इसे बता सकते हैं, हालांकि: उन मॉड्यूल के लिए उत्पन्न होने वाली फ़ाइलों को देखें .pyc(या .pyoयदि आपने ऑप्टिमाइज़र चालू किया है) import

इसके अलावा, यह देशी मशीन के कोड को संकलित नहीं करता है। इसके बजाय, यह एक बाइट कोड को संकलित करता है जो एक आभासी मशीन द्वारा उपयोग किया जाता है। वर्चुअल मशीन अपने आप में एक संकलित कार्यक्रम है। यह जावा के काम करने के तरीके के समान है; इसी तरह, वास्तव में, एक पायथन वेरिएंट ( जाइथन ) है जो जावा वर्चुअल मशीन के बाइट कोड के बजाय संकलित करता है! इसमें आयरनपिथॉन भी है , जो माइक्रोसॉफ्ट के सीएलआर (.NET द्वारा उपयोग) के लिए संकलित है। (सामान्य पाइथन बाइट कोड कंपाइलर को कभी-कभी CPython कहा जाता है, इसे इन विकल्पों से अलग करने के लिए।)

C ++ को इसकी संकलन प्रक्रिया को उजागर करने की आवश्यकता है क्योंकि भाषा स्वयं अपूर्ण है; यह सब कुछ निर्दिष्ट नहीं करता है जो लिंकर को आपके प्रोग्राम को बनाने के लिए जानना आवश्यक है, और न ही यह संकलन विकल्पों को आंशिक रूप से निर्दिष्ट कर सकता है (कुछ संकलक आपको उपयोग करने देते हैं #pragma, लेकिन यह मानक नहीं है)। इसलिए आपको बाकी काम मेकफाइल्स और संभवतः ऑटो हेल (ऑटोकॉन्फ़ / ऑटोकेक / लिबटूल) के साथ करना होगा। यह वास्तव में सी कैसे किया गया था से सिर्फ एक पकड़ है। और सी ने इसे इस तरह से किया क्योंकि इसने संकलक को सरल बना दिया, जो एक मुख्य कारण है यह इतना लोकप्रिय है (80 के दशक में कोई भी एक साधारण सी संकलक को क्रैंक कर सकता है)।


कुछ चीजें जो संकलक या लिंकर के संचालन को प्रभावित कर सकती हैं लेकिन C या C ++ के सिंटैक्स के भीतर निर्दिष्ट नहीं हैं:

  • निर्भरता का संकल्प
  • बाहरी पुस्तकालय आवश्यकताओं (निर्भरता आदेश सहित)
  • आशावादी स्तर
  • चेतावनी सेटिंग्स
  • भाषा विनिर्देश संस्करण
  • लिंकर मैपिंग (अंतिम कार्यक्रम में कौन सा खंड कहां जाता है)
  • लक्ष्य वास्तुकला

इनमें से कुछ का पता लगाया जा सकता है, लेकिन उन्हें निर्दिष्ट नहीं किया जा सकता है; उदाहरण के लिए, मैं यह पता लगा सकता हूं कि C ++ किसके साथ उपयोग में है __cplusplus, लेकिन मैं यह निर्दिष्ट नहीं कर सकता कि C ++ 98 कोड के भीतर ही मेरे कोड के लिए उपयोग किया जाता है; मुझे इसे मेकफाइल में कंपाइलर को एक ध्वज के रूप में पास करना है, या एक संवाद में एक सेटिंग करना है।

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

इनमें से कई का उपयोग करके सेट किया जा सकता है #pragma, लेकिन यह गैर-मानक है, और मैं मानक की बात कर रहा था। इन सभी चीजों को एक मानक द्वारा निर्दिष्ट किया जा सकता है, लेकिन पिछड़े संगतता के हित में नहीं है। प्रचलित ज्ञान यह है कि Makefiles और IDEs टूट नहीं रहे हैं, इसलिए उन्हें ठीक न करें।

अजगर भाषा में यह सब संभालता है। उदाहरण के लिए, importएक स्पष्ट मॉड्यूल निर्भरता को निर्दिष्ट करता है, निर्भरता के पेड़ का अर्थ है, और मॉड्यूल हेडर और स्रोत फ़ाइलों (यानी इंटरफ़ेस और कार्यान्वयन) में विभाजित नहीं हैं।


3
पायथन का सी कार्यान्वयन CPython है , साइथन कुछ अलग है।
ग्रेग हेविगिल

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

2
@ एक बड़े अपवाद के साथ सिलिंडर कि c / c ++ में एक प्रोग्रामर के रूप में आपको एक निश्चित तरीके से सामान करना होता है (या तो मेकफाइल्स या हर चीज़ को एक ही ब्लॉब में डंप करना) अजगर में आप बस अपना काम करते हैं और VM के साथ मिलकर कंपाइलर करते हैं बाकी का ख्याल रखता है
FS

3
"C ++ को अपनी संकलन प्रक्रिया को उजागर करने की आवश्यकता है क्योंकि भाषा स्वयं अपूर्ण है" एर, क्या ??
लाइटनेस दौड़ मोनिका

3
आप उसके ठीक बाद वाला भाग पढ़ते हैं , है ना? "यह सब कुछ निर्दिष्ट नहीं करता है कि लिंकर को आपके प्रोग्राम को बनाने के लिए जानने की जरूरत है, और न ही यह संकलन के विकल्प को आंशिक रूप से निर्दिष्ट कर सकता है।" आप इसे संकलक को खिलाकर किसी भी C ++ फ़ाइल का निर्माण नहीं कर सकते हैं ; बार-बार आपको मेटाडेटा प्रदान करना होता है जैसे संकलित झंडे, पथ शामिल करना, आदि। यह मेटाडेटा मानक द्वारा निर्दिष्ट नहीं है और पोर्टेबल नहीं है, यही कारण है कि हमें अन्य चीज़ों जैसे कि मेक, सेमीक, विज़ुअल स्टूडियो, या जो कुछ भी है में खींचना होगा काम खत्म करो। इसलिए मानक को कुछ चीजों को संकलन इकाई में और अन्य को प्रोग्राम-वाइड के रूप में कॉल करना होगा।
माइक डीमोन

7

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

जब C ++ (संकलित भाषा) जैसी भाषा संकलित की जाती है, तो इसका मतलब है कि निष्पादित होने पर इसे सीधे हार्डवेयर द्वारा पढ़ने के लिए मशीन कोड में बदल दिया जाता है। संकलित भाषाओं पर विकिपीडिया लेख एक दिलचस्प विपरीत प्रदान कर सकते हैं।


21
व्याख्या या संकलित भाषा जैसी कोई चीज नहीं है। एक भाषा गणितीय नियमों का एक सार सेट है। कोई भाषा संकलित या व्याख्या नहीं की जाती है। एक भाषा अभी है । संकलन और व्याख्या संकलक या दुभाषिया (दोह!) के लक्षण हैं, न कि भाषा। हर भाषा को एक संकलक के साथ लागू किया जा सकता है और हर भाषा को दुभाषिया के साथ लागू किया जा सकता है। अधिकांश भाषाओं ने कार्यान्वयन को संकलित और व्याख्या दोनों किया है। सी ++ के लिए व्याख्याकार हैं और पायथन के लिए कंपाइलर हैं। (वास्तव में, वर्तमान में सभी मौजूदा पायथन कार्यान्वयन में कंपाइलर हैं।)
जॉर्ग डब्ल्यू मित्तग

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

10
@ JörgWMittag: आप तकनीकी रूप से सही हैं। हालाँकि, अधिकांश भाषाओं की व्याख्या संदर्भ या पूर्ण संकलन के लिए की गई थी। GW BASIC या कॉमन लिस्प के लिए दुभाषिया लिखना, C ++ या C # के लिए एक लिखने से ज्यादा आसान है; इंटरैक्टिव पर्यावरण के बिना पायथन अपने कई विक्रय बिंदु खो देता है; PHP के लिए एक कंपाइलर लिखना बहुत मुश्किल है, और शायद बहुत ही अयोग्य है, क्योंकि संकलित निष्पादन योग्य में eval () और इसी तरह के निर्माण के कारण पूरे PHP दुभाषिया को समाहित करना होगा - कोई यह तर्क दे सकता है कि ऐसा कंपाइलर धोखा दे रहा होगा।
tdammers

2
@ दोस्त, हाँ। हम यथोचित रूप से "संकलित भाषा" का अर्थ "भाषा आमतौर पर संकलित" कर सकते हैं। लेकिन यह बात याद आती है कि PHP, Java, Python, Lua और C # सभी बायोटेक के कंपाइलर के रूप में लागू किए गए हैं। इन सभी भाषाओं में उनके लिए JIT का कार्यान्वयन भी किया गया है। इसलिए वास्तव में, आप वास्तव में इनमें से कुछ भाषाओं को संकलित नहीं कर सकते हैं और कुछ की व्याख्या की गई है क्योंकि उन्हें एक ही कार्यान्वयन रणनीति मिली है।
विंस्टन एवर्ट

2
@ बिलियन, कम से कम अजगर के लिए सच नहीं है। आप अजगर बाइटकोड को वितरित कर सकते हैं और स्रोत के बिना चला सकते हैं। लेकिन यह सच है कि आप एक संकलक के बिना अजगर वितरित नहीं कर सकते।
विंस्टन ईवर्ट

5

सभी संकलित भाषाओं में इन-फेस-एडिट-संकलन-लिंक-रन-चक्र नहीं है।

आप जो चला रहे हैं वह C ++ (या कम से कम C ++ कार्यान्वयन) की एक विशेषता / सीमा है।

कुछ भी करने के लिए, आपको अपना कोड फ़ाइलों में संग्रहित करना चाहिए, और लिंकिंग नामक एक प्रक्रिया द्वारा एक अखंड छवि का निर्माण करना चाहिए।

विशेष रूप से, यह इस अखंड लिंकिंग प्रक्रिया है जो संकलन और व्याख्या के बीच अंतर के लिए गलत है।

कुछ भाषाएं यह सब कुछ बहुत अधिक गतिशील रूप से करती हैं, अनाड़ी लिंकिंग स्टेप को समाप्त करके, मशीन कोड के संकलन को समाप्त करके नहीं। स्रोत को अभी भी ऑब्जेक्ट फ़ाइलों के लिए संकलित किया गया है, लेकिन ये एक रन-टाइम छवि में लोड किए गए हैं, बजाय एक अखंड निष्पादन योग्य में लिंक किए।

आप कहते हैं "इस मॉड्यूल को पुनः लोड करें", और यह स्रोत को लोड करता है और इसकी व्याख्या करता है, या इसे संकलित करता है, जो कुछ मोड स्विच पर निर्भर करता है।

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

कुछ भाषाओं में इससे कहीं अधिक महीन दानेदार मॉडर्नाइजेशन है, और भवन और लोडिंग उनके रन-टाइम के भीतर से की जाती है, इसलिए यह अधिक सहज है।


2

प्रारंभिक प्रश्न से क्या उलटा पड़ता है ... एक बिंदु का उल्लेख नहीं किया गया है कि एक अजगर कार्यक्रम का स्रोत वह है जो आप उपयोग करते हैं और वितरित करते हैं, उपयोगकर्ता के दृष्टिकोण से यह कार्यक्रम है। हम चीजों को उन श्रेणियों में सरल बनाने की कोशिश करते हैं जो अच्छी तरह से परिभाषित नहीं हैं।

संकलित कार्यक्रमों को आमतौर पर मशीन कोड की अकेले फाइलें माना जाता है। (विशेष रूप से विशिष्ट ऑपरेटिंग सिस्टम से जुड़े गतिशील लिंक पुस्तकालयों के लिए लिंक अक्सर युक्त)। इसने कहा ... अधिकांश प्रोग्रामिंग भाषा की भिन्नता है जिसे संकलित या व्याख्या के रूप में वर्णित किया जा सकता है।

पायथन को एक कंपाइलर की आवश्यकता नहीं होती है क्योंकि यह एक एप्लिकेशन (एक दुभाषिया कहा जाता है) पर निर्भर करता है जो एक ऐसे कोड को बनाए बिना मशीन कोड को संकलित और चलाता है, जिसे आप आसानी से एक्सेस या वितरित कर सकते हैं।


1

सभी प्रोग्रामिंग भाषाओं को मानव अवधारणाओं से लक्ष्य मशीन कोड में अनुवाद की आवश्यकता होती है। यहां तक ​​कि विधानसभा भाषा का भी मशीन कोड में अनुवाद किया जाना चाहिए। यह अनुवाद आमतौर पर निम्नलिखित चरणों में होता है:

चरण 1: विश्लेषण और अनुवाद (पार्सिंग) एक मध्यवर्ती कोड में। चरण 2: बाहरी संदर्भ के लिए स्थान धारकों के साथ लक्ष्य मशीन कोड में मध्यवर्ती कोड का अनुवाद। चरण 3: मशीन के निष्पादन योग्य कार्यक्रम में बाहरी संदर्भ और पैकेजिंग का समाधान।

इस अनुवाद को अक्सर पूर्व-संकलन और "जस्ट इन टाइम" (JIT) या रन-टाइम-संकलन के रूप में जाना जाता है।

C, C ++, COBOL, फोरट्रान, पास्कल (सभी नहीं) और असेंबली जैसी भाषाएं पहले से तैयार की गई भाषाएं हैं जिन्हें किसी दुभाषिए की जरूरत के बिना सीधे opertating प्रणाली द्वारा निष्पादित किया जा सकता है।

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

अधिकांश आधुनिक उच्च स्तरीय भाषाएँ व्याख्या की गई (JIT के साथ) श्रेणी में आती हैं। यह ज्यादातर पुरानी भाषाएं जैसे C & C ++ है जो पहले से तय की गई है।

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