2010-10-28 7 views
7

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

धन्यवाद टी


N.B. एलएलवीएम के साथ मेरा अनुभव मूल रूप से कैलिडोस्कोप ट्यूटोरियल से आता है और इसके साथ खेलने से थोड़ा अतिरिक्त है लेकिन मुझे एलएलवीएम एपीआई की पूरी समझ होने से बहुत दूर है।

+0

मुझे नहीं लगता कि प्रश्न का उत्तर देने के लिए यहां पर्याप्त जानकारी है। आप एलएलवीएम के साथ क्या हासिल करना चाहते हैं? (बीटीडब्ल्यू मैं एलएलवीएम के बारे में बहुत कम जानता हूं और शायद उत्तर देने वाला नहीं होगा।) – Qwertie

+0

@Qwertie। अंतिम लक्ष्य मेरी छोटी भाषा के लिए एक कंपाइलर को कार्यान्वित करना है और अभी मैं सी ++ शैली शैली को लागू करने की कोशिश कर रहा हूं। तो इस बारे में कोई जानकारी कैसे अच्छी होगी, लेकिन मुझे लगता है कि शायद मुझे एलएलवीएम एपीआई को पहले बेहतर समझने की जरूरत है, जैसा कि मैंने कहा है, कहां जाना है/कैलिडोस्कोप ट्यूटोरियल को पूरा करने के बाद सीखना जारी रखने के लिए क्या करना है एक मदद भी होगी। – tjm

+0

@tjm: यह सवाल काफी अस्पष्ट है। क्या आपके पास पहले से ही एक विचार है कि आप सामान्य रूप से कक्षाओं को कैसे कार्यान्वित करेंगे और आपको केवल एलएलवीएम के साथ इसे कार्यान्वित करने में मदद की ज़रूरत है? या आप जानना चाहते हैं कि सामान्य रूप से कक्षाओं को कैसे लागू किया जा सकता है? – sepp2k

उत्तर

6

एक बहुत, बहुत अधूरा अवलोकन:

कक्षा एक संरचना है (जैसा कि आप जानते C/C++ तुम नहीं?)

तरीके अन्यथा साधारण कार्यों को छोड़कर वे एक अतिरिक्त अंतर्निहित प्राप्त कर रहे हैं तर्क: वस्तु स्वयं। इस तर्क को आमतौर पर फ़ंक्शन के भीतर 'यह' या 'स्वयं' कहा जाता है। कक्षा-स्कोप प्रतीकों (सी ++, जावास्क्रिप्ट) हो सकता है या नहीं (PHP, पायथन) विधियों के भीतर डिफ़ॉल्ट रूप से सुलभ हो सकता है।

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

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

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

विनाशक सामान्य विधियां हैं जिन्हें आम तौर पर एक वस्तु से गुजरने पर सामान्य रूप से बुलाया जाता है। फिर आपको विनाशकों के लिए आरोही कॉल श्रृंखला की संभावना को ध्यान में रखना होगा।

इंटरफेस तब तक मुश्किल हैं जब तक कि आपकी भाषा पूरी तरह से गतिशील न हो।

+0

+1 अच्छा सारांश, मैं आम तौर पर सहमत हूं। सिवाय इसके कि इंटरफेस सामान्य रूप से विरासत से कहीं अधिक कठिन नहीं हैं। – delnan

+0

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

+0

प्रसिद्ध उद्धरण के अनुसार, "कंप्यूटर विज्ञान में सभी समस्याओं को संकेत के दूसरे स्तर से हल किया जा सकता है";) बेशक यह एक अतिरिक्त कदम उठाता है, लेकिन यह वास्तव में जटिल नहीं है। – delnan

4

आपको सी ++ ऑब्जेक्ट मॉडल के अंदर स्टेन लिपमान, खरीदना चाहिए। आपको जो भी चाहिए वह वहां है।

+0

क्या आपका मतलब है लिपमैन, सी ++ ऑब्जेक्ट मॉडल के अंदर? मुझे एक समान नाम के साथ लिप्सचिट्ज द्वारा कुछ भी नहीं मिला। यदि नहीं, तो मैं अपनी अज्ञानता के लिए क्षमा चाहता हूं। – tjm

+0

यह है, ठीक है, मेरे जवाब में संशोधन किया। – EJP

+0

धन्यवाद, मैं अपने निकट भविष्य में पुस्तकालय की एक यात्रा देखता हूं। – tjm

1

शायद कई रणनीतियों इस साकार करने के लिए कर रहे हैं, यहाँ एक है:

एक vtable (वर्चुअल तालिका) समारोह संकेत के साथ एक संकलन समय-निरंतर struct है। (सभी मूल्यों संकलन समय पर जाना जाता है।)

(आप एक vtable एक "इंटरफेस" करने के लिए सूचक कॉल कर सकते हैं अगर आप चाहते हैं।)

एक OOP स्तरीय भाषा में विरासत में से किसी की क्षमता के बिना एक ऐसी संरचना है जिसमें पहले सदस्य-चर के रूप में अपने vtable में एक कॉन्स पॉइंटर शामिल है। इस पॉइंटर का उपयोग ऑब्जेक्ट के प्रकार की पहचान करने के लिए किया जाता है, और उस ऑब्जेक्ट पर बहु-विरासत पहलू/दृश्य (जैसा कि डाला गया?) के साथ।

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

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

vtable से किसी फ़ंक्शन को प्रत्येक कॉल को ऑब्जेक्ट-पॉइंटर को उस प्रकार के लिए डालने की आवश्यकता होती है, जो फ़ंक्शन के लिए उपयुक्त है। यह कॉलर द्वारा किया जा सकता है, vtable से हस्ताक्षरित ऑफसेट (फ़ंक्शन को correspoinding) पढ़ना, या कैली द्वारा, जो तब मूल फ़ंक्शन का केवल प्रॉक्सी है।

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