पायथन में एक कंपाइलर है! आप बस इसे नोटिस नहीं करते क्योंकि यह स्वचालित रूप से चलता है। आप इसे बता सकते हैं, हालांकि: उन मॉड्यूल के लिए उत्पन्न होने वाली फ़ाइलों को देखें .pyc
(या .pyo
यदि आपने ऑप्टिमाइज़र चालू किया है) import
।
इसके अलावा, यह देशी मशीन के कोड को संकलित नहीं करता है। इसके बजाय, यह एक बाइट कोड को संकलित करता है जो एक आभासी मशीन द्वारा उपयोग किया जाता है। वर्चुअल मशीन अपने आप में एक संकलित कार्यक्रम है। यह जावा के काम करने के तरीके के समान है; इसी तरह, वास्तव में, एक पायथन वेरिएंट ( जाइथन ) है जो जावा वर्चुअल मशीन के बाइट कोड के बजाय संकलित करता है! इसमें आयरनपिथॉन भी है , जो माइक्रोसॉफ्ट के सीएलआर (.NET द्वारा उपयोग) के लिए संकलित है। (सामान्य पाइथन बाइट कोड कंपाइलर को कभी-कभी CPython कहा जाता है, इसे इन विकल्पों से अलग करने के लिए।)
C ++ को इसकी संकलन प्रक्रिया को उजागर करने की आवश्यकता है क्योंकि भाषा स्वयं अपूर्ण है; यह सब कुछ निर्दिष्ट नहीं करता है जो लिंकर को आपके प्रोग्राम को बनाने के लिए जानना आवश्यक है, और न ही यह संकलन विकल्पों को आंशिक रूप से निर्दिष्ट कर सकता है (कुछ संकलक आपको उपयोग करने देते हैं #pragma
, लेकिन यह मानक नहीं है)। इसलिए आपको बाकी काम मेकफाइल्स और संभवतः ऑटो हेल (ऑटोकॉन्फ़ / ऑटोकेक / लिबटूल) के साथ करना होगा। यह वास्तव में सी कैसे किया गया था से सिर्फ एक पकड़ है। और सी ने इसे इस तरह से किया क्योंकि इसने संकलक को सरल बना दिया, जो एक मुख्य कारण है यह इतना लोकप्रिय है (80 के दशक में कोई भी एक साधारण सी संकलक को क्रैंक कर सकता है)।
कुछ चीजें जो संकलक या लिंकर के संचालन को प्रभावित कर सकती हैं लेकिन C या C ++ के सिंटैक्स के भीतर निर्दिष्ट नहीं हैं:
- निर्भरता का संकल्प
- बाहरी पुस्तकालय आवश्यकताओं (निर्भरता आदेश सहित)
- आशावादी स्तर
- चेतावनी सेटिंग्स
- भाषा विनिर्देश संस्करण
- लिंकर मैपिंग (अंतिम कार्यक्रम में कौन सा खंड कहां जाता है)
- लक्ष्य वास्तुकला
इनमें से कुछ का पता लगाया जा सकता है, लेकिन उन्हें निर्दिष्ट नहीं किया जा सकता है; उदाहरण के लिए, मैं यह पता लगा सकता हूं कि C ++ किसके साथ उपयोग में है __cplusplus
, लेकिन मैं यह निर्दिष्ट नहीं कर सकता कि C ++ 98 कोड के भीतर ही मेरे कोड के लिए उपयोग किया जाता है; मुझे इसे मेकफाइल में कंपाइलर को एक ध्वज के रूप में पास करना है, या एक संवाद में एक सेटिंग करना है।
जब आप सोच सकते हैं कि संकलक में "निर्भरता रिज़ॉल्यूशन" प्रणाली मौजूद है, तो स्वचालित रूप से निर्भरता रिकॉर्ड बनाते हैं, ये रिकॉर्ड केवल यह कहते हैं कि कौन सी हेडर किसी दिए गए स्रोत फ़ाइल का उपयोग करता है। वे यह नहीं बता सकते हैं कि एक निष्पादन योग्य कार्यक्रम में जोड़ने के लिए अतिरिक्त स्रोत कोड मॉड्यूल की क्या आवश्यकता है, क्योंकि C या C ++ में कोई मानक तरीका नहीं है जिससे यह संकेत मिलता है कि किसी दिए गए हेडर फ़ाइल को किसी अन्य स्रोत कोड मॉड्यूल के लिए इंटरफ़ेस परिभाषा दी गई है, जो कि सिर्फ एक गुच्छा के विपरीत है। लाइनों को आप कई स्थानों पर दिखाना चाहते हैं ताकि आप खुद को न दोहराएं। फ़ाइल नामकरण परंपराओं में परंपराएं हैं, लेकिन ये संकलक और लिंकर द्वारा ज्ञात या लागू नहीं हैं।
इनमें से कई का उपयोग करके सेट किया जा सकता है #pragma
, लेकिन यह गैर-मानक है, और मैं मानक की बात कर रहा था। इन सभी चीजों को एक मानक द्वारा निर्दिष्ट किया जा सकता है, लेकिन पिछड़े संगतता के हित में नहीं है। प्रचलित ज्ञान यह है कि Makefiles और IDEs टूट नहीं रहे हैं, इसलिए उन्हें ठीक न करें।
अजगर भाषा में यह सब संभालता है। उदाहरण के लिए, import
एक स्पष्ट मॉड्यूल निर्भरता को निर्दिष्ट करता है, निर्भरता के पेड़ का अर्थ है, और मॉड्यूल हेडर और स्रोत फ़ाइलों (यानी इंटरफ़ेस और कार्यान्वयन) में विभाजित नहीं हैं।