असेंबली भाषा के संदर्भ में OOP "ऑब्जेक्ट" और "क्लासेस" को मेमोरी में कैसे व्यवस्थित किया जाता है?


13

वस्तुओं को स्मृति में कैसे व्यवस्थित किया जाता है?

उदाहरण के लिए, मुझे पता है कि एक फ़ंक्शन मेमोरी में कोड का एक टुकड़ा है, जो स्टैक और / या रजिस्टरों के माध्यम से मापदंडों की अपेक्षा करता है और इसे स्वयं स्टैक फ्रेम के रूप में संभालता है।

लेकिन ऑब्जेक्ट एक बहुत अधिक जटिल संरचना हैं। वे कैसे व्यवस्थित हैं? क्या प्रत्येक वस्तु में तरीकों के लिए "लिंक" हैं और उस पद्धति से खुद को पता पास करता है?

इस विषय की अच्छी व्याख्या देखना बहुत अच्छा होगा।

युपीडी। मैंने प्रश्न को अधिक सटीक बनाया, और मुझे मुख्य रूप से सांख्यिकीय रूप से टाइपिंग भाषाओं में दिलचस्पी है।


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

मैंने प्रश्न को अपडेट कर दिया है, इसलिए मुझे लगता है कि गतिशील रूप से टाइप की जाने वाली भाषाओं को समझना कठिन है।
निकोलाई गोलूब

जवाबों:


17

यदि कोई गतिशील प्रेषण (बहुरूपता) नहीं है, तो "विधियाँ" केवल शर्करा कार्य हैं, शायद एक अतिरिक्त पैरामीटर के साथ। तदनुसार, बिना पॉलिमॉर्फिक व्यवहार वाले वर्गों के उदाहरण अनिवार्य रूप structसे कोड पीढ़ी के उद्देश्य के लिए हैं।

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

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

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

void needs_a_trait(SomeTrait &x) { x.method2(1); }
ConcreteType x = ...;
needs_a_trait(x);

इसे नीचे संकलित किया गया है:

functionpointer SomeTrait_ConcreteType_vtable[] = { &method1, &method2, ... };
void needs_a_trait(void *x, functionpointer vtable[]) { vtable[1](x, 1); }
ConcreteType x = ...;
needs_a_trait(x, SomeTrait_ConcreteType_vtable);

इसका मतलब यह भी है कि vtable जानकारी ऑब्जेक्ट में एम्बेडेड नहीं है। यदि आप एक "उदाहरण की विशेषता" के संदर्भ चाहते हैं जो कि सही ढंग से व्यवहार करेगा, उदाहरण के लिए, डेटा संरचनाओं में संग्रहीत जिसमें कई अलग-अलग प्रकार होते हैं, तो एक वसा सूचक बना सकता है (instance_pointer, trait_vtable)। यह वास्तव में उपरोक्त रणनीति का एक सामान्यीकरण है।


5

यह कहावत के अर्थ में उत्तर है "यदि आप एक आदमी को एक मछली देते हैं जिसे आप उसे एक दिन के लिए खिलाते हैं, जबकि यदि आप उसे मछली सिखाते हैं तो आप उसे जीवन के लिए खिलाते हैं" क्योंकि आपका प्रश्न बहुत व्यापक है

1. अनुसंधान खुली सूचना स्रोतों

"असेंबली ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग" के लिए Google बहुत सारे अलग-अलग प्रासंगिक संसाधनों को सूचीबद्ध करता है।

उदाहरण के लिए विधानसभा में ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग, एथन जे। एल्ड्रिज, दिसंबर 15, 2011 3 लिंक के रूप में आया और अच्छा लग रहा है

2. मौजूदा हाथ से लिखे गए कोड से सीखें

आप देख सकते हैं कि ओओपी के साथ कुछ लोकप्रिय विधानसभा भाषाओं के साथ लिखे गए स्रोत कोड का अध्ययन करके यह कैसे काम करता है जैसे स्पष्ट रूप से घोषित

3. संकलक द्वारा उत्पन्न कोड पैटर्न से सीखें

आप देख सकते हैं कि यह आपकी पसंद के OOP संकलक द्वारा निर्मित मध्यवर्ती विधानसभा भाषा फ़ाइलों का अध्ययन करके कैसे काम करता है। C ++ और FreePascal दोनों कंपाइलरों को कॉन्फ़िगर किया जा सकता है ताकि आप देख सकें कि विधानसभा भाषा कोड में उच्च स्तरीय OOP कोड का ट्रांसक्रिप्शन कैसा दिखता है

4. अपने सामान्य ज्ञान के साथ पहेली को हल करें

अब यह बहुत देर हो चुकी है क्योंकि आप पहले से ही अन्य उत्तरों से संकेत जानते हैं। लेकिन इससे पहले कि इंटरनेट पर खोज करना इतना आसान था और इससे पहले कि वे साइटें थीं, जहां आप कुछ स्वयंसेवकों से मुफ्त में कई घंटों के लिए बिना किसी प्रयास के अपना जवाब पा सकते हैं, जिन्होंने इसे कठिन तरीका सीखा, किसी के लिए भी मुफ्त में उपलब्ध एकमात्र तरीका था

अपने आप से पूछें: "मैं इसे कैसे लागू करूंगा?"

आपके दिमाग में चल रही पृष्ठभूमि-विचार प्रक्रिया के कई दिनों के बाद और कई कागजी ड्राफ्ट डिजाइनों को फेंकने के बाद, आप पाएंगे कि आप जिस समाधान के साथ आए थे, वह समाधान के समान है जो अन्य प्रोग्रामर के साथ आया था और पहले से ही लागू किया गया था।


अब मेरा जवाब राय आधारित है, ओपी के सवाल का सीधे जवाब नहीं देता है और वरिष्ठ उच्च-प्रतिनिधि उपयोगकर्ता स्वतंत्र रूप से मुझे नीचा दिखा सकते हैं

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