कक्षाओं के रूप में मौलिक प्रकार (जैसे int) को लागू करने के लिए क्या हैं?


27

जब डिजाइनिंग और एक वस्तु उन्मुख प्रोग्रामिंग भाषा implenting, कुछ बिंदु से एक में एक (जैसे मौलिक प्रकार लागू करने के बारे चुनाव करना चाहिए int, float, doubleया समकक्ष) वर्ग या कुछ और के रूप में। स्पष्ट रूप से, सी परिवार की भाषाओं में उन्हें वर्गों के रूप में परिभाषित नहीं करने की प्रवृत्ति है (जावा में विशेष आदिम प्रकार हैं, सी # उन्हें अपरिवर्तनीय संरचनाओं के रूप में लागू करता है, आदि)।

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

बेशक, मैं आंशिक रूप से समझ सकता हूं कि भाषा डिजाइनर अपने तरीके से यह क्यों तय करते हैं: कक्षा के उदाहरणों में कुछ स्थानिक ओवरहेड होते हैं (क्योंकि उदाहरणों में उनकी मेमोरी लेआउट में एक व्यवहार्य या अन्य मेटाडेटा शामिल हो सकता है), जो कि आदिम / संरचना की आवश्यकता है। है (यदि भाषा उन पर वंशानुक्रम की अनुमति नहीं देती है)।

क्या स्थानिक दक्षता (और बेहतर स्थानिक स्थानीयता, विशेष रूप से बड़े सरणियों में) एकमात्र कारण है कि मौलिक प्रकार अक्सर वर्ग नहीं होते हैं ?

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

क्या उपरोक्त गलत है, या कुछ और है जो मुझे याद आ रहा है?


जवाबों:


19

हाँ, यह बहुत दक्षता के लिए नीचे आता है। लेकिन आप प्रभाव को कम करके आंक रहे हैं (या विभिन्न अनुकूलन कितनी अच्छी तरह काम करते हैं) को कम करके आंका गया है।

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

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

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

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

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

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


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

@ TheodorosChatzigiannakis मैं पलायन विश्लेषण में आवंटन रणनीति को बदलना शामिल करता हूं (क्योंकि ईमानदारी से यह एकमात्र चीज लगती है जो कभी भी इसके लिए उपयोग की जाती है)।

अपने दूसरे पैराग्राफ को फिर से लिखें: ऑब्जेक्ट्स को हमेशा हीप-आबंटित या संदर्भ प्रकार होने की आवश्यकता नहीं होती है। वास्तव में, जब वे नहीं होते हैं, तो यह आवश्यक अनुकूलन को समान रूप से आसान बनाता है। एक प्रारंभिक उदाहरण के लिए C ++ के स्टैक-आबंटित ऑब्जेक्ट्स को देखें, और Rust के स्वयं के सिस्टम को भाषा में सीधे विश्लेषण से बचने का एक तरीका है।
आमोन

@ मैं जानता हूं, और शायद मुझे वह स्पष्ट करना चाहिए था, लेकिन ऐसा लगता है कि ओपी को केवल जावा में दिलचस्पी है- और सी # जैसी भाषाएं जहां हीप उप-संदर्भ और उपप्रकार के कारण संदर्भ शब्दार्थ और दोषरहित जाति के कारण आवंटन लगभग अनिवार्य (और निहित) है। हालांकि विश्लेषण से बचने के लिए क्या मात्रा का उपयोग कर जंग के बारे में अच्छी बात!

@delnan यह सच है कि मैं ज्यादातर उन भाषाओं में दिलचस्पी रखता हूं, जो भंडारण विवरण को अलग करती हैं, लेकिन कृपया बेझिझक कुछ भी शामिल करें जो आपको लगता है कि प्रासंगिक है, भले ही यह उन भाषाओं में लागू न हो।
थियोडोरोस चट्जीगानियाकिंस

27

क्या स्थानिक दक्षता (और बेहतर स्थानिक स्थानीयता, विशेष रूप से बड़े सरणियों में) एकमात्र कारण है कि मौलिक प्रकार अक्सर वर्ग नहीं होते हैं?

नहीं।

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

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

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


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

3
int + intएक नियमित भाषा-स्तरीय ऑपरेटर हो सकता है जो एक आंतरिक निर्देश को आमंत्रित करता है जो देशी सीपीयू पूर्णांक जोड़ से अधिक के संकलन (या व्यवहार) की गारंटी देता है। से intविरासत में मिलने का लाभ objectन केवल दूसरे प्रकार से प्राप्त करने की संभावना है int, बल्कि intएक objectमुक्केबाजी के बिना व्यवहार की संभावना भी है । सी # जेनरिक पर विचार करें: आपके पास सहसंयोजक और विरोधाभासी हो सकते हैं, लेकिन वे केवल वर्ग प्रकारों पर लागू होते हैं - संरचनात्मक प्रकारों को स्वचालित रूप से बाहर रखा जाता है, क्योंकि वे केवल object(अंतर्निहित, संकलक-उत्पन्न) बॉक्सिंग के माध्यम से बन सकते हैं ।
थियोडोरोस चैट्ज़िआनियाकिन्स

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

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

1
लाइब्रेरी सीमाओं के पार @ TheodorosChatzigiannakis इनलाइनिंग निश्चित रूप से संभव है, हालांकि यह अभी भी "उच्च अंत वाली आशाओं पर एक और आइटम है जो मैं चाहता हूं" खरीदारी सूची। मुझे लगता है कि हालांकि यह पूरी तरह से सही होने के लिए पूरी तरह से सही होने के लिए कुख्यात होने के रूप में बेकार है के रूप में इंगित करने के लिए बाध्य लगता है।

4

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

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

  • आपके आदिम प्रकारों में सुपरटेप्स होते हैं और आप चाहते हैं कि एक आदिम प्रकार के सुपरपाइप के प्रकार के साथ चर हों। उदाहरण के लिए, मान लें कि आपके intएस हैं Hashable, और आप एक ऐसा फ़ंक्शन घोषित करना चाहते हैं Hashableजो एक पैरामीटर लेता है जो नियमित ऑब्जेक्ट प्राप्त कर सकता है लेकिन intएस भी ।

    इस प्रकार के गैरकानूनी तरीके से "हल" किया जा सकता है: सबटाइपिंग से छुटकारा पाएं और यह तय करें कि इंटरफेस प्रकार नहीं हैं, लेकिन प्रकार की बाधाएं हैं। जाहिर है कि आपके प्रकार प्रणाली की स्पष्टता कम कर देता है, और इस प्रकार की प्रणाली को ऑब्जेक्ट-ओरिएंटेड नहीं कहा जाएगा। इस रणनीति का उपयोग करने वाली भाषा के लिए हास्केल देखें। C ++ वहाँ आधा है क्योंकि आदिम प्रकार में सुपरटेप नहीं होते हैं।

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

  • आपको स्टैटिक टाइपिंग की सुविधा नहीं है। एक चर आदिम प्रकार या वस्तुओं सहित किसी भी मूल्य को पकड़ सकता है। इसलिए मजबूत टाइपिंग की गारंटी के लिए सभी आदिम प्रकारों को हमेशा बॉक्सिंग करने की आवश्यकता होती है।

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


एक intसभी भाषाओं में शायद ही अपरिवर्तनीय है।
स्कॉट व्हिटलॉक

6
@ScottWhitlock मैं देखता हूं कि आप ऐसा क्यों सोच सकते हैं, लेकिन सामान्य रूप से आदिम प्रकार अपरिवर्तनीय मूल्य प्रकार हैं। कोई भी समझदार भाषा आपको संख्या सात के मान को बदलने की अनुमति नहीं देती है। हालांकि, कई भाषाएं आपको एक चर को फिर से असाइन करने की अनुमति देती हैं जो एक आदिम प्रकार के मूल्य को एक अलग मूल्य पर रखती है। सी जैसी भाषाओं में, एक चर नामांकित स्मृति स्थान है, और एक सूचक की तरह कार्य करता है। एक वैरिएबल वैसा नहीं है जैसा वह मान बताता है। एक intमान अपरिवर्तनीय है, लेकिन एक intचर नहीं है।
आमोन

1
@ वामन: कोई भी भाषा नहीं; जस्ट
मेसन व्हीलर

get rid of subtyping and decide that interfaces aren't types but type constraints.... such a type system wouldn't be called object-oriented any longer लेकिन यह प्रोटोटाइप आधारित प्रोग्रामिंग की तरह लगता है, जो निश्चित रूप से ओओपी है।
माइकल

1
@ScottWhitlock सवाल यह है कि यदि आपके पास int b = a है, तो आप b के लिए कुछ कर सकते हैं जो a के मान को बदल देगा। कुछ भाषा कार्यान्वयन भी हुए हैं जहाँ यह संभव है, लेकिन यह आमतौर पर एक सरणी के लिए समान करने के विपरीत, पैथोलॉजिकल और अवांछित माना जाता है।
रैंडम 832

2

अधिकांश कार्यान्वयन मैं इस तरह के वर्गों पर तीन प्रतिबंध लगाने के बारे में जानता हूं जो संकलक को समय के विशाल बहुमत को अंतर्निहित प्रतिनिधित्व के रूप में आदिम प्रकारों का कुशलतापूर्वक उपयोग करने की अनुमति देते हैं। ये प्रतिबंध हैं:

  • अचल स्थिति
  • अंतिमता (से प्राप्त होने में असमर्थ)
  • स्थैतिक टाइपिंग

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

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


1

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

स्मॉलटाकल कंपाइलर (स्रोत कोड -> वीएम बायोटकोड्स) और वीएम नैटिविज़र (बायटेकॉड्स -> मशीन कोड) दोनों उत्पन्न कोड (जेआईटी) का अनुकूलन करते हैं ताकि इन मूल वस्तुओं के साथ प्राथमिक संचालन के दंड को कम किया जा सके।


1

मैं एक OO लैंग्वेज और रनटाइम डिज़ाइन कर रहा था (यह पूरी तरह से अलग कारणों से असफल रहा)।

अंतः सच्‍ची कक्षाओं जैसी चीजें बनाने में कुछ भी गलत नहीं है; वास्तव में यह GC को डिज़ाइन करना आसान बनाता है क्योंकि 3 (क्लास, एरे और आदिम) के बजाय अब केवल 2 प्रकार के हीप हेडर (क्लास एंड एरे) हैं [तथ्य यह है कि हम प्रासंगिक होने के बाद क्लास और एरे को मर्ज कर सकते हैं। ]।

वास्तविक महत्वपूर्ण मामला आदिम प्रकारों में ज्यादातर अंतिम / सील तरीके (+ वास्तव में मायने रखता है, ToString इतना नहीं) होना चाहिए। यह संकलक को फ़ंक्शन के लगभग सभी कॉलों को स्थिर रूप से हल करने और उन्हें इनलाइन करने की अनुमति देता है। अधिकांश मामलों में यह व्यवहार की नकल के रूप में कोई फर्क नहीं पड़ता है (मैंने भाषा स्तर पर उपलब्ध एम्बेडिंग बनाने के लिए चुना है। [इसलिए .NET। फ़ंक्शन का उपयोग int + int लागू करने के लिए किया जाता है।

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