एक स्थिर प्रकार प्रणाली एक प्रोटोटाइप-आधारित भाषा के डिजाइन को कैसे प्रभावित करती है?


15

प्रोटोटाइप-आधारित भाषाओं पर विकिपीडिया लेख निम्नलिखित पैराग्राफ में शामिल हैं:

लगभग सभी प्रोटोटाइप-आधारित सिस्टम व्याख्या और गतिशील रूप से टाइप की गई भाषाओं पर आधारित हैं। हालाँकि, वैधानिक रूप से टाइप की गई भाषाओं पर आधारित प्रणालियाँ तकनीकी रूप से व्यवहार्य हैं।

किस तरह से एक स्थिर प्रकार की प्रणाली प्रतिबंधों को लागू करती है या प्रोटोटाइप-आधारित भाषा में जटिलता का परिचय देती है, और क्यों अधिक गतिशील रूप से टाइप किए गए प्रोटोटाइप भाषाएं हैं?


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

मैं अभी उसी प्रक्रिया के लिए खुद को शुरू कर रहा हूं :)
जो 12

जवाबों:


6

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

प्रोटोटाइप-आधारित प्रोग्रामिंग के लिए आपको रनटाइम पर ऑब्जेक्ट्स को म्यूट करने की आवश्यकता होती है। उन्हें नरम टाइप का होना चाहिए क्योंकि रनटाइम पर प्रत्येक परिवर्तन, एक प्रकार का एक वर्ग दूसरे में बदलता है - इसका प्रकार बदलता है।

यद्यपि आप मौलिक और व्युत्पन्न गैर-वस्तु प्रकारों को स्थिर रख सकते हैं। लेकिन यह एक अजीब विषमता का परिचय देता है, वस्तुएं नरम-टाइप की जाती हैं, गैर-वस्तुएं स्थिर-टाइप की जाती हैं, और दोनों के बीच एक कठोर बारियर स्थापित होना चाहिए। क्या आपको एक संरचना को आकार देने में सक्षम होना चाहिए? एक स्ट्रिंग? क्या संख्या एक वर्ग या एक मौलिक प्रकार, या मूलभूत प्रकारों का एक समूह होना चाहिए, int / float / bignum / etc?

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

स्टैटिक-टाइप किया गया है:

  • लागू करने के लिए आसान है
  • तेज / अधिक कुशल
  • सुरक्षित
  • अमूर्तता के कारण बड़ी प्रणालियों को बनाए रखना / दस्तावेज़ करना आसान है।

डायनामिक-टाइप है:

  • में लिखने के लिए तेज़
  • अधिक संक्षिप्त
  • भाषा सीखना आसान
  • डिज़ाइन त्रुटियों के लिए अधिक क्षमा करना।

दोनों को सम्मिश्रित करके तुम बहुत त्याग करते हो।

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

1
एक उदाहरण प्रदान करने के लिए मन क्यों वस्तुओं को "परिवर्तनशील" होने की आवश्यकता है (मेरा मानना ​​है कि आप इसके अतिरिक्त और विशेषताओं को हटाने का मतलब है, उन्हें बदलना नहीं, जैसा कि आमतौर पर टाइप करने के लिए असंबंधित है)।

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

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

@delnan: आपने रचना के माध्यम से क्लासिक विरासत का वर्णन किया है। हाँ, यह काफी प्रोटोटाइप दिखता है और क्लासिक वंशानुक्रम मॉडल की भाषा में प्रोटोटाइप-आधारित प्रोग्रामिंग करने का एक (बहुत नीरफ) तरीका है। यह सिर्फ 90% फन की स्ट्रिप pb.p है, जो इसके सबसे बड़े फायदे (और साथ ही सबसे बड़े खतरों को दूर करता है) को मारती है। हां, पुरानी फुट-शूटिंग सादृश्य में, पूरी तरह से चित्रित pb.p आपको चाय के चम्मच के साथ अपने दोनों पैरों को शूट करने में मदद करेगा। यदि आप इस तरह की शक्ति को पसंद नहीं करते हैं, तो आप क्लासिक विरासत के लिए बेहतर रहेंगे।
एसएफ।

1
आप "प्रोटोटाइप" के साथ "गतिशील" को भ्रमित करते हैं। ये फ्रीडम जो स्थैतिक प्रकार की प्रणालियों के साथ अच्छी तरह से मिश्रण नहीं करते हैं वे प्रोटोटाइप की विशेषताएं नहीं हैं, वे गतिशीलता की विशेषताएं हैं। बेशक स्थैतिक टाइपिंग उन्हें जोड़ने से रोकता है, लेकिन वे प्रोटोटाइप का हिस्सा नहीं हैं (यह IMGO मुख्य रूप से माता-पिता के रूप में कार्य करने के लिए क्लोनिंग ऑब्जेक्ट के पक्ष में कक्षाओं का अभाव है)। यह गतिशीलता प्रोटोटाइप के लिए ऑर्थोगोनल है। सभी लोकप्रिय प्रोटोटाइप भाषाएं उन्हें शामिल करने के लिए होती हैं, लेकिन वे पहले से बताए गए प्रोटोटाइप से स्वतंत्र हैं । एक काल्पनिक भाषा में इस स्निपेट पर विचार करें: pastebin.com/9pLuAu9F । यह प्रोटोटाइप कैसे नहीं है?

3

यह देखने में कठिनाई बहुत सरल है: वस्तुओं के शब्दों को तरीकों के शब्दकोशों के रूप में लेना, या उन चीजों के रूप में जो संदेशों का जवाब देती हैं, सामान्य रूप से टाइप किए गए OO भाषाओं के बारे में निम्नलिखित देखें:

  • सभी शब्दकोश कुंजी / संदेश आम तौर पर पहले से घोषित किए जाते हैं, सांख्यिकीय रूप से घोषित पहचानकर्ताओं का उपयोग करते हुए।

  • संदेशों के कुछ सेट अग्रिम में घोषित किए जाते हैं, और ऑब्जेक्ट इन सेटों से जुड़े होते हैं यह निर्धारित करने के लिए कि वे कौन से संदेशों का जवाब देते हैं।

  • संदेशों के एक सेट के दूसरे के उपसमुच्चय के संबंध को सांख्यिकीय और स्पष्ट रूप से घोषित किया जाता है; अघोषित लेकिन तार्किक उपसमूह मान्य नहीं हैं।

  • टाइप-चेकिंग यह सुनिश्चित करने का प्रयास करती है कि सभी संदेश केवल उन वस्तुओं पर भेजे जाएं जो उनका जवाब देती हैं।

प्रोटोटाइप आधारित प्रणाली के साथ इनमें से हर एक कुछ हद तक संघर्ष करता है:

  • संदेश के नाम अग्रिम में घोषित किए जा सकते हैं, "परमाणु" या इंटर्नेड स्ट्रिंग्स या व्हाट्सन के रूप में, लेकिन बहुत कम; वस्तुओं की प्लास्टिसिटी का मतलब है कि तरीकों को टाइप करना अजीब है।

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

  • उपरोक्त दो हिट का वास्तविक प्रभाव समावेशी रिश्तों के साथ है, जहां स्पष्ट घोषणाएं पूरी तरह से अस्थिर हैं। स्थैतिक, नाममात्र उपप्रकार अर्थ में निहित एक प्रोटोटाइप-आधारित प्रणाली के लिए एंटीथेटिकल है।

जो हमें अंतिम बिंदु पर लाता है, जिसे हम वास्तव में बदलना नहीं चाहते हैं। हम अभी भी यह सुनिश्चित करना चाहेंगे कि संदेश केवल उन वस्तुओं को भेजे जाएं जो उनका जवाब देती हैं। तथापि:

  • हम सांख्यिकीय रूप से यह नहीं जान सकते हैं कि संदेशों को एक साथ रखा जा सकता है।
  • हम नहीं जान सकते कि कौन से समूह दूसरों के सबसेट हैं।
  • हम नहीं जान सकते कि कौन से समूह संभव हैं।
  • हम यह भी निर्दिष्ट नहीं कर सकते हैं कि एक संदेश के साथ किस तरह के तर्क भेजे जाते हैं।
  • मूल रूप से हमने पाया है कि हम पूरी तरह से सामान्य मामले में कुछ भी निर्दिष्ट नहीं कर सकते हैं।

तो यह कैसे काम किया जा सकता है? या तो पूर्ण सामान्यता को किसी भी तरह सीमित करें (जो अप्रिय है, और पहली बार में प्रोटोटाइप-आधारित सिस्टम का उपयोग करने के किसी भी लाभ को मार सकता है), या सटीक प्रकार के बजाय टाइप सिस्टम को अधिक तरल पदार्थ और एक्सप्रेस बाधाओं को बनाएं ।

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

सारांश में: यह संभव है, नाममात्र स्थिर प्रकार की प्रणाली या रनटाइम मेटाडेटा पर आधारित एक गतिशील प्रणाली की तुलना में ऐसा करना कठिन है, और इसलिए बहुत कम लोग परेशान करते हैं।


1

मेरा मानना ​​है कि एक वैधानिक-टाइप, प्रोटोटाइप-आधारित भाषा को प्राप्त करने का एक तरीका यह होगा कि टेम्प्लेट और अवधारणाओं के आसपास की भाषा को आधार बनाया जाए।

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

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

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

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