6

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

उदाहरण के लिए पायथन में मेटाक्लास नहीं लगते हैं। स्मॉलटॉक में जेनरेटर की कोई अवधारणा नहीं है। और हालांकि दोनों को गतिशील रूप से टाइप किया जाता है, मुझे विश्वास है कि पायथन गतिशील विधि प्रेषण नहीं करता है। क्या ये सही है?

+2

"मैं विशेष रूप से यह जानना चाहता हूं कि कार्यान्वयन, सिंटेक्स, एक्सटेंसिबिलिटी और फिलॉसफी में मौलिक मतभेद क्या हैं।" ठीक है, यह सब कुछ काफी है। तो उस प्रश्न का उत्तर देने का एकमात्र तरीका आपको दोनों भाषाओं को पढ़ाना है। :-) –

+0

मैंने अब दोनों सीखा: डी –

उत्तर

9

उदाहरण के लिए अजगर प्रतीत नहीं होता।

यह सुनिश्चित करता है - यह सिर्फ परोक्ष हर वर्ग के लिए एक नया metaclass उत्पन्न नहीं करता है: यह माता पिता के वर्ग के रूप में एक ही metaclass का उपयोग करता है, या type डिफ़ॉल्ट रूप से। पाइथन के डिजाइन दर्शन, उर्फ ​​"पायथन" का ज़ेन, एक इंटरैक्टिव दुभाषिया के संकेत पर import this कर कर देखा जा सकता है; यहां लागू बिंदु दूसरा है, "स्पष्ट अंतर्निहित से बेहतर है।"

पायथन 2.x में, आप निम्न संरचना के साथ एक कस्टम metaclass निर्दिष्ट करें:

class sify(metaclass=mymeta): 
    ... 
:

class sic: 
    __metaclass__ = mymeta 
    ... 

अजगर 3.x में, और अधिक सुंदर ढंग से, आप नामित तर्क सिंटैक्स का उपयोग करें

स्मॉलटॉक में जनरेटर की अवधारणा अवधारणा नहीं है।

पायथन के जेनरेटर प्रथम श्रेणी (आमतौर पर स्टैंडअलोन) फ़ंक्शन हैं, और स्मॉलटाक में "स्टैंडअलोन" फ़ंक्शंस की अवधारणा नहीं है - इसमें कक्षाओं के अंदर विधियां हैं। लेकिन यह निश्चित रूप iterators है - वर्ग के रूप में, निश्चित रूप से:

iterator := aCollection iterator. 
[iterator hasNext] whileTrue: [iterator next doSomething]. 

के बाद से स्मालटाक प्रथम श्रेणी "कोड ब्लॉक" (रूबी उन्हें यह से लिया), तो आप यात्रा को पूरा, बस अन्य "नियंत्रण संरचनाओं" की तरह है एक उपयुक्त विधि करने के लिए एक कोड ब्लॉक भेज कर, और यदि आप चाहें तो आप ऐसा कर सकते सीधे संग्रह के साथ (लगता है select:):

aCollection select: [:item | item doSomething]. 
स्मालटाक (और रूबी) में

तो तुम यात्रा करने के लिए कोड ब्लॉक भेज ; पाइथन चीजों को दूसरे तरीके से करता है, पुनरावृत्ति आसपास के "कॉलिंग" कोड को मूल्य भेजती है। बहुत अलग दिखता है, लेकिन अंत में "गहराई से" अलग नहीं है।

प्रथम श्रेणी कोड ब्लॉक का मतलब है कि स्मालटाक की जरूरत नहीं है और न ही "नियंत्रण संरचना" बयान और इस तरह के if या while के रूप में कीवर्ड हैं: वे (उचित तरीकों के तर्कों के रूप में कोड ब्लॉक भेजने बूलियन्स की जैसे ifTrue: विधि द्वारा पूरा किया जा सकता)। (रूबी ने को के साथ प्रथम श्रेणी कोड ब्लॉक में चुनने का विकल्प चुना है; मैं कहूंगा कि पायथन [[स्पष्ट रूप से]] और स्मॉलटॉक [[implicitly]] दोनों कोशिश करते हैं, जैसे सी, "एक ही रास्ता प्रदान करना एक ऑपरेशन करने के लिए ", जबकि रुबी के पर्ल-इश स्कूल में" इसे करने के कई तरीके हैं ")।

और हालांकि दोनों dynamicly टाइप किया जा करने के लिए कहा जाता है, मेरा मानना ​​है कि कि अजगर गतिशील विधि प्रेषण नहीं करता है। क्या यह सही है?

नहीं है, पूरी तरह से गलत है - अजगर तीव्रता से गतिशील विधि प्रेषण, चरम पर है।उदाहरण के लिए विचार करें:

for i in range(10): 
    myobject.bah() 

अजगर अर्थ विज्ञान से, इस विधि bah के लिए 10 लुकअप करता myobject में - बस मामले में विधि के पिछले निष्पादन हुआ था myobject को पूरी तरह से पुनर्गठन ही आंतरिक रूप से इतना है कि इसके वर्तमानbah विधि पिछली एक से पूरी तरह से अलग है (प्रोग्रामर के लिए इतनी क्रूर गतिशीलता पर भरोसा करने के लिए एक बहुत ही पागल चीज हो सकती है, लेकिन पायथन इसका समर्थन करता है)। यही कारण है बनाता है:

themethod = myobject.bah 
for i in range(10): 
    themethod() 

अजगर कोड में एक आम हाथ से अनुकूलन - के बजाय पाश 10 पाश अंदर से पहले एक गतिशील देखने करता है, पैर प्रति एक (यह "निरंतर उत्थापन" का एक मामला है , क्योंकि संकलक को पाइथन के गतिशील लुकअप के चरम नियमों द्वारा स्वयं "निरंतर तह" करने से मना किया जाता है - जब तक कि यह साबित न हो कि यह निर्दोष होने की गारंटी है, और व्यवहार में ऐसा सबूत बहुत कठिन है इसलिए पाइथन कार्यान्वयन आमतौर पर परेशान नहीं होता है)।

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

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

1

Wikipedia के गतिशील विधि प्रेषण पर पेज के अनुसार:

स्मालटाक कार्यान्वयन

स्मालटाक एक प्रकार आधारित संदेश डिस्पैचर उपयोग करता है। प्रत्येक उदाहरण में एक प्रकार होता है जिसकी परिभाषा में विधियां होती हैं। जब किसी उदाहरण को संदेश प्राप्त होता है, तो प्रेषक प्रकार और के लिए संदेश-टू-विधि मानचित्र में संबंधित विधि को देखता है और फिर विधि को आमंत्रित करता है। [...]

कई अन्य गतिशील अजगर, रूबी, ऑब्जेक्टिव-सी और ग्रूवी समान तरीकों का उपयोग सहित भाषाओं, आपके द्वारा लिखा गया।

जोर जोड़ा गया, और एक पैराग्राफ फिसल गया। तो, कम से कम वह हिस्सा दो भाषाओं के बीच समान प्रतीत होता है।

2

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

किसी भी तरह ... शायद बिंदु तुलना द्वारा एक बिंदु नहीं, लेकिन वास्तव में इस पुस्तक को वास्तव में अच्छी तरह से पढ़ा जाता है।

7

पायथन निश्चित रूप से मेटाक्लास हैं।

स्मालटाक कुछ असामान्य सुविधाओं की है: (!)

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

स्मॉलटॉक में जेनरेटर की कोई अवधारणा नहीं है।

सच है, लेकिन उन्हें भाषा के भीतर से अधिकांश स्मॉलटॉक बोलियों में लागू किया जा सकता है। जीएनयू स्मॉलटाक जेनरेटर के साथ stream library के हिस्से के रूप में आता है।