2010-11-07 16 views
6

मेरे पास बहुत आसान सवाल है कि मैं इंटरनेट पर कहीं भी जवाब नहीं ढूंढ सकता।रन-टाइम में ओओपी बनाम प्रक्रियात्मक

तो, मेरा प्रश्न है, प्रक्रियात्मक प्रोग्रामिंग में, कोड कोड अनुभाग में है, जो केवल पढ़ने के मेमोरी क्षेत्र में जाता है। चर या तो ढेर या ढेर पर हैं।

लेकिन ओओपी का कहना है कि वस्तु स्मृति में बनाई गई है। तो, क्या इसका मतलब यह भी है कि आर/डब्ल्यू मेमोरी एरिया में भी फ़ंक्शन लिखे गए हैं?

और, क्या ओएस को कुछ अंतर्निहित ओओपी कार्यक्रमों का समर्थन करना है? उदाहरण के लिए यदि ओएस ने निर्देश को पढ़ने के लिए अनुमति दी है तो केवल कोड अनुभाग पढ़ें। धन्यवाद।

+0

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

उत्तर

6

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

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

+0

ठीक है, लेकिन, उदाहरण के लिए एमएस विंडोज आपको फ़ंक्शन पर कूदने की अनुमति देता है जो उदाहरण के लिए .data क्षेत्र में संग्रहीत किया जाएगा? सभी प्रणालियों के बाद कोई सुराग नहीं है यह कुछ डेटा या निर्देश है। और, क्या दिलचस्प भी है, प्रोग्राम कोड भी केवल खंड में पढ़ता है? –

+0

@ B.Gen.Jack.O.Neill, यह वास्तुकला पर निर्भर करता है। कोड सेगमेंट के अलावा कहीं और संग्रहीत कोड निष्पादित करने की क्षमता ऐतिहासिक रूप से हैकर्स द्वारा शोषित की गई है। उदाहरण के लिए, अधिकांश स्टैक-बफर ओवरफ़्लो हमले मूल रूप से स्टैक बफर में रखे गए शेल कोड को निष्पादित करने का प्रयास होते हैं। इस कारण से, कुछ हार्डवेयर आर्किटेक्चर एक गलती ट्रिगर करेंगे यदि निर्देश सूचक एक प्रक्रिया के कोड सेगमेंट के बाहर किसी पते पर समाप्त होता है। –

+0

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

1

ओओपी यह नहीं कहता है। मुझे पता नहीं है कि आप इसे कहां पढ़ते हैं, अगर आप एक उद्धरण जोड़ते हैं जो मदद करेगा।

ऑब्जेक्ट्स चर हैं, इसलिए आप चर के बारे में क्या जानते हैं वस्तुओं के लिए सही है। सी # (नेट फ्रेमवर्क वास्तव में) जैसी भाषाओं में केवल ढेर में ही संग्रहीत किया जा सकता है, क्योंकि उन्हें संदर्भ प्रकार कहा जाता है। सी ++ में वे कहीं भी रह सकते हैं।

लेकिन ओओपी का कहना है कि वस्तु स्मृति में बनाई गई है। तो, क्या इसका मतलब यह भी है कि आर/डब्ल्यू मेमोरी एरिया में भी फ़ंक्शन लिखे गए हैं?

इससे मैंने निष्कर्ष निकाला कि आपको लगता है कि कार्य वस्तुएं हैं। यह अब तक हर ओओपी भाषा में सच नहीं है। यह कार्यात्मक भाषाओं से है जहां कार्य प्रथम श्रेणी की वस्तुएं हैं। अधिकांश मामलों में कार्य अपरिवर्तनीय हैं और केवल पढ़ने वाले वर्गों में ही रखा जाता है।

विंडोज, लिनक्स और मैकॉक्स जैसे सामान्य ओएस ऑब्जेक्ट्स से अनजान हैं। यह पूरी तरह से कार्यक्रम अवधारणा है। नेट फ्रेमवर्क और जावा वीएम अमूर्तता की परत प्रदान करते हैं। वे निष्पादन वातावरण हैं जो वस्तु समर्थन में निर्मित हैं।

3

यह एक अच्छा सवाल है।

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

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

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

उन मूलभूत बातें के साथ, अधिकांश कार्यान्वयन उस भाग से बचने के लिए चाल बनाते हैं जहां कॉल करने के लिए फ़ंक्शन को ढूंढने के लिए पॉइंटर का पालन किया जाता है। वे एक ही समारोह में संभावित कॉल को समझने और संकुचित करने का प्रयास करते हैं। फिर वे लुकअप को सही फ़ंक्शन पर सीधे कॉल के साथ प्रतिस्थापित कर सकते हैं, एक तेज़ समाधान।

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

संबंधित मुद्दे