पायथन को C में क्यों लिखा जाता है और C ++ में नहीं?


76

में अजगर के ट्यूटोरियल एक पढ़ सकते हैं सी में है कि अजगर के मूल कार्यान्वयन;

दूसरी ओर, पायथन कार्यान्वयन, सी में लिखा गया है, (...)

मैं बहुत उत्सुक हूं कि पायथन सी में क्यों लिखा गया और सी ++ नहीं?

मैं इस निर्णय के पीछे के तर्क को जानना चाहता हूं और उत्तर को ऐतिहासिक संदर्भों द्वारा समर्थित होना चाहिए (और राय आधारित नहीं)।


10
मुझे पता नहीं क्यों, लेकिन मुझे इस पर कुछ संदेह है: thread.gmane.org/gmane.comp.version-control.git/57643/… :)
Matthieu

13
@ लॉरी कोलमैन: कभी लाइनस रेंट नहीं देखा? आपको "इन्टर्नेट्स" ...> _> से बचना चाहिए
डॉ। हैनिबल लेक्चरर

18
@ लैरी मैंने इस शेख़ी को देखा और इसे पढ़ने के बाद लिनुस के लिए लगभग सभी सम्मान खो दिए। उस पर शर्म आती है।
पिओट्र डोब्रोगोस्ट

5
खैर, यह लिनस रैंट की
avi

6
मैं "(भाषा X) और नहीं (भाषा Y) में लिखित" क्यों (लोकप्रिय कार्यक्रम) है पूछने के बिंदु को देखने में विफल। या यों कहें कि एक ही सवाल उलटा हो सकता है: वाई और एक्स क्यों नहीं?
एंड्रेस एफ।

जवाबों:


119

मैंने जो कुछ भी देखा है, वह व्यावहारिक और ऐतिहासिक कारणों का एक संयोजन है। (ज्यादातर) ऐतिहासिक कारण यह है कि सीपीथॉन 1.0 को 1989 में जारी किया गया था। उस समय, सी को हाल ही में मानकीकृत किया गया था। C ++ लगभग अज्ञात और निश्चित रूप से गैर-पोर्टेबल था, क्योंकि लगभग किसी के पास C ++ कंपाइलर नहीं था।

यद्यपि C ++ आज अधिक व्यापक और आसानी से उपलब्ध है, फिर भी CPython को C के साथ संगत करने के लिए C ++ के साथ संगत करने के लिए उचित मात्रा में काम करेगा। अपने आप से, वह काम बहुत कम या कोई वास्तविक लाभ प्रदान करेगा।

यह जोएल के ब्लॉग पोस्ट पर शुरू होने के बारे में थोड़ा सा है और पूरी तरह से फिर से लिखना एक सबसे खराब गलती है जो एक सॉफ्टवेयर कंपनी कर सकती है। मुझे लगता है कि Microsoft के रूपांतरण को Windows 3.0 कोर से Windows NT कोर और Apple के MacOS 9 से Mac OS / X में रूपांतरण द्वारा काउंटर करूँगा। न तो किसी ने कंपनी को मार डाला - लेकिन दोनों निश्चित रूप से बड़ी, महंगी, दीर्घकालिक परियोजनाएं थीं। दोनों यह भी कहते हैं कि सफलता के लिए महत्वपूर्ण है: दोनों कोड आधारों को लंबे समय तक बनाए रखना (अधिकांश) उपयोगकर्ता अपने कम से कम (कम से कम कथित) लाभों के आधार पर नए कोड आधार पर स्विच कर सकते हैं।

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

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

मुझे यह भी लगता है कि जबकि रिश्तेदार आसानी के साथ बहुत सारे सी कोड को सी ++ में बदलना संभव है , कि सी ++ से बहुत अधिक वास्तविक लाभ प्राप्त करने के लिए न केवल उससे थोड़ा अधिक पुनर्लेखन की आवश्यकता होती है, बल्कि इसमें शामिल अधिकांश डेवलपर्स की पर्याप्त पुन: शिक्षा की आवश्यकता होती है। अधिकांश अच्छी तरह से लिखे गए C ++, समान चीज़ों को करने के लिए लिखे गए C से काफी अलग हैं। यह नहीं बदल रहा है का मामला mallocकरने के लिए newऔर printfकरने के लिए cout, कल्पना के किसी भी खिंचाव से।


2
+1 तुम बहुत बोली; वे दिलचस्प हैं। ऐसा लगता है कि लिंक को जोड़ा जा सकता है तो यह और भी बेहतर होगा।
n611x007

1
बस योएल के ब्लॉग पोस्ट पर एक लिंक के साथ एक संपादन प्रस्तुत करें joelonsoftware.com/articles/fog000000006969.html
MarkJ

यह एक उत्कृष्ट उत्तर था। मैंने इससे बहुत कुछ सीखा।
गेम्स ब्रेनियाक

1
+1 विशेष रूप से उस ग का उल्लेख करने के लिए जिसे सी ++ में पोर्ट किया जा सकता है, सापेक्ष आसानी से करने योग्य नहीं है। मैं यह पहले से ही लंबे समय से जानता था, लेकिन जवाब ने वास्तव में बिंदु को मजबूत किया प्लस इसे देखने के लिए कई आयाम जोड़े।
fkl

1
"एप्पल MacOS 9 से मैक ओएस के लिए रूपांतरण / एक्स" ध्यान दें कि ओएस / एक्स खरोंच से एक पुनर्लेखन नहीं है: यह बल्कि NeXTSTEP को MacOS9 से एक स्विच था, सुधार हुआ है और एप्पल के लिए पुनः ब्रांड
Jivan

30

मुझे लगता है कि इसका कारण यह था कि मूल रूप से ANSI C89 में लिखा गया था , क्योंकि बस वापस आ गया है, C ++ सिर्फ एक व्यावहारिक विकल्प नहीं था जो विभिन्न संकलक और इस तरह के बीच असंगति के साथ था। मेरा मतलब है, यह तब तक था, जब यह 2005 था, एक एबीआई विनिर्देश के साथ आने के लिए जो एक संकलक के साथ संकलित कोड को एक अलग संकलक के साथ संकलित करने की अनुमति देगा?

अधिक दिलचस्प सवाल यह है कि यह अभी भी C89 में क्यों लिखा गया है।

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

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

बेशक, आजकल, सीपीथॉन अब केवल पायथन कार्यान्वयन नहीं है। PyPy है, जो RPython (Python का एक स्टेटिक रूप से टाइप किया गया उपसमुच्चय), Java में Jython, C # में IronPython, NQP में Pynie और PIR इत्यादि में लिखा गया है।


3
मैं इसको उभारने के लिए आधा ललचा रहा हूँ, लेकिन मुझे ऐसा कोई मंच नहीं पता है जहाँ C ++ कंपाइलर मौजूद नहीं है (विशेष रूप से दिया गया है कि Comeau C ++ C को संकलित करता है)
Billy ONeal

1
ABI
jk का

3
@ अब्दुल: नहीं, अजगर कोई सॉफ्टवेयर नहीं है। यह एक विनिर्देश है। उस विनिर्देश के कई कार्यान्वयन हैं, जो कई भाषाओं में लिखे गए हैं। IronPython को CP, Java में Jython, RPython में PyPy, NQP में Pynie, PIR, और Perl6, P ++ में C ++, CPython को C. लिखाया जाता है। बयान में "Python C में लिखा गया है, इसका कोई मतलब नहीं है।" अजगर एक सॉफ्टवेयर नहीं है। यह एक विनिर्देश है। यह अंग्रेजी में लिखा गया है, किसी प्रोग्रामिंग भाषा में नहीं। "जावा C का व्युत्पन्न है" मुख्य रूप से गलत है। जावा ऑब्जेक्टिव-सी से प्रेरित है, लेकिन यह अधिकांश सी भागों से छुटकारा पाता है और ज्यादातर स्मालटाक भागों को ले जाता है।
जोर्ग डब्ल्यू मित्तग

3
@ मीलोंरौट: ऐसे कई मामले हैं जहां विनिर्देश CPython से विचलित होता है। उदाहरण के लिए: पायथन विनिर्देश निर्धारक अंतिम निर्धारण की गारंटी नहीं देता है, लेकिन सीपीथॉन कम से कम गैर-परिपत्र संदर्भों के लिए करता है। लेकिन भले ही सीपीथॉन गैर-परिपत्र संदर्भों के लिए निर्धारक अंतिमकरण की गारंटी देता है, लेखन कोड जो उस तथ्य पर निर्भर करता है टूट गया है , क्योंकि यह कल्पना का हिस्सा नहीं है। (मैं अभी उद्धरण नहीं पा सकता हूं, लेकिन जीवीआर ने स्पष्ट रूप से कहा है कि नियतात्मक अंतिमकरण और संदर्भ की गिनती सीपीथॉन के निजी आंतरिक कार्यान्वयन विवरण हैं।)
जोर्ग डब्ल्यू मित्तग

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

10

एक बेहतर सवाल यह हो सकता है: "पायथन में पायथन क्यों नहीं लिखा गया है?"

इस बिंदु पर अधिक, एक बार पायथन कक्षाओं और वस्तुओं के लिए पर्याप्त आदिम सी में लिखे गए हैं, उन का उपयोग बाकी दुभाषिया लिखने के लिए किया जा सकता है, इसलिए आप इसके बजाय सी ++ का उपयोग करके कुछ भी हासिल नहीं करेंगे।


1
यदि आप मेरे उत्तर की पहली कड़ी का अनुसरण करते हैं, तो आप पायथन में पायथन के कार्यान्वयन का संदर्भ देखेंगे। यह अभी तक तैयार नहीं है। वह यूरोपीय संघ द्वारा वित्त पोषित है। यदि मेरे उत्तर का पता लगाना मुश्किल है तो codespeak.net/pypy/dist/pypy/doc वह लिंक है।
vpit3833

2
यह वास्तव में एक बहुत गहरा जवाब है। ऐसा नहीं है कि गुइडो का पायथन शाब्दिक रूप से पायथन में लिखा गया है, लेकिन सी में निम्न स्तर की संरचनाओं का उपयोग उच्च-स्तरीय लोगों को लिखने के लिए किया जाता है।
जेरेमी

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

अब जब PyPy उपलब्ध है और दिलचस्प रूप से CPython कभी-कभी बाहर निकलता है, तो मुझे लगता है कि यह एक बहुत अच्छा विचार है।
साई कुमार बट्टिनजू
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.