दिस (THIS कंप्यूटर प्रोग्रामिंग)

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

ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग
अनेक ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग लैंग्वेज में, जिसे  या   भी कहा जाता है) एक वेरिएबल है जिसका उपयोग उदाहरण विधियों में उस ऑब्जेक्ट को संदर्भित करने के लिए किया जाता है जिस पर वह काम कर रहे हैं। पहली OO भाषा, SIMULA 67, ने स्थानीय ऑब्जेक्ट को स्पष्ट रूप से संदर्भित करने के लिए  उपयोग किया। C++ और इससे शैली प्राप्त करने वाली भाषाएं (जैसे Java, C#, D, और PHP) भी सामान्यतः इसका उपयोग करती हैं। स्मॉलटॉक और अन्य, जैसे ऑब्जेक्ट पास्कल, पर्ल, पायथन, रूबी, रस्ट, ऑब्जेक्टिव-सी, डेटाफ्लेक्स और स्विफ्ट,   का उपयोग करते हैं। माइक्रोसॉफ्ट का विज़ुअल बेसिक   उपयोग करता है।

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

कुछ लैंग्वेज में, उदाहरण के लिए C++, Java, और Raku या   एक कीवर्ड है, और वेरिएबल स्वचालित रूप से इंस्टेंस विधियों में उपस्तिथ होता है। दूसरों में, उदाहरण के लिए पायथन, रस्ट और पर्ल 5 में, इंस्टेंस विधि का पहला पैरामीटर एक ऐसा संदर्भ है। इसे स्पष्ट रूप से निर्दिष्ट करने की आवश्यकता है। पायथन और पर्ल में, पैरामीटर को आवश्यक रूप से  या  नाम देने की आवश्यकता नहीं है; इसे किसी अन्य पैरामीटर की तरह प्रोग्रामर द्वारा स्वतंत्र रूप से नामित किया जा सकता है। चूँकि, अनौपचारिक परंपरा के अनुसार, पर्ल या पायथन में इंस्टेंस विधि के पहले पैरामीटर को  नाम दिया गया है। जंग के लिए आवश्यक है कि सेल्फ ऑब्जेक्ट को   या  कहा जाए, यह इस बात पर निर्भर करता है कि क्या इनवोक किया गया वेरिएबल इनवोकेंट को उधार लेता है, या इसे क्रमशः अंदर ले जाता है।

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

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

कुछ कंपाइलरों (उदाहरण के लिए जीसीसी) में, सी++ इंस्टेंस विधियों के पॉइंटर्स को स्पष्ट रूप से इस पॉइंटर पैरामीटर के साथ सीधे किसी अन्य प्रकार के पॉइंटर पर डाला जा सकता है।

खुला प्रत्यावर्तन

इसका प्रेषण शब्दार्थ, अर्थात् इस पर विधि कॉल गतिशील रूप से प्रेषित की जाती है, इसे ओपन रिकर्सन के रूप में जाना जाता है, और इसका कारण है कि इन विधियों को व्युत्पन्न वर्गों या वस्तुओं द्वारा ओवरराइड किया जा सकता है। इसके विपरीत, किसी वेरिएबल का प्रत्यक्ष नामित रिकर्सन या अज्ञात रिकर्सन प्रारंभिक बाइंडिंग के साथ बंद रिकर्सन का उपयोग करता है। उदाहरण के लिए, फैक्टोरियल के लिए निम्नलिखित पर्ल कोड में, टोकन __SUB__ वर्तमान वेरिएबल का संदर्भ है: use feature ":5.16";                                                                                                                           sub { my $x = shift; $x == 0 ? 1 : $x * __SUB__->( $x - 1 ); } इसके विपरीत, C++ में (स्पष्टता के लिए एक स्पष्ट this का उपयोग करना, चूंकि आवश्यक नहीं है) this ऑब्जेक्ट से ही जुड़ता है, किन्तु यदि क्लास विधि को "आभासी" अर्थात आधार में बहुरूपी घोषित किया गया था, तब इसे गतिशील प्रेषण (देर से बाइंडिंग) के माध्यम से हल किया जाता है। जिससे कि व्युत्पन्न कक्षाएं इसे ओवरराइड कर सकें। unsigned int factorial(unsigned int n)                                                 { if (n == 0) return 1; else return n * this->factorial(n - 1); } यह उदाहरण कृत्रिम है, क्योंकि यह प्रत्यक्ष पुनरावर्तन है, इसलिए फैक्टोरियल विधि को ओवरराइड करना इस वेरिएबल को ओवरराइड कर देगा; अधिक प्राकृतिक उदाहरण तब होते हैं जब व्युत्पन्न वर्ग में एक विधि बेस क्लास में या पारस्परिक पुनरावृत्ति के स्थितियों में उसी विधि को कॉल करती है। [4] [5]

नाजुक बेस क्लास समस्या को खुले रिकर्सन पर दोषी ठहराया गया है, इस सुझाव के साथ कि खुले रिकर्सन (गतिशील प्रेषण, देर से बाइंडिंग) के अतिरिक्त बंद रिकर्सन (स्थैतिक प्रेषण, प्रारंभिक बाइंडिंग) के लिए इस डिफ़ॉल्ट पर विधियों को प्रयुक्त करना, केवल खुले रिकर्सन का उपयोग करना जब यह हो विशेष रूप से अनुरोध किया गया; बाहरी कॉल (इसका उपयोग नहीं करते हुए) सदैव की तरह गतिशील रूप से भेजी जाएंगी। [6] [7] जिस तरह से इसे जेडीके में व्यवहार में हल किया जाता है वह एक निश्चित प्रोग्रामर अनुशासन के माध्यम से होता है; इस अनुशासन को सी. रूबी और जी. टी. लीवेन्स द्वारा औपचारिक रूप दिया गया है; इसमें मूल रूप से निम्नलिखित नियम सम्मिलित हैं:[8]

इस पर कोई भी कोड सार्वजनिक तरीकों का आह्वान नहीं करता है।

कोड जिसे आंतरिक रूप से पुन: उपयोग किया जा सकता है (उसी वर्ग के अन्य तरीकों से आह्वान करके) एक संरक्षित या निजी विधि में समाहित किया गया है; यदि इसे सीधे उपयोगकर्ताओं के सामने उजागर करने की आवश्यकता है, तब एक रैपर सार्वजनिक विधि आंतरिक विधि को कॉल करती है।

शुद्ध तरीकों के लिए पिछली अनुशंसा में ढील दी जा सकती है।

कार्यान्वयन
सी++

अधिक जानकारी: C++ कक्षाएं

C++ के प्रारंभिक संस्करण इस सूचक को बदलने देंगे; ऐसा करने से एक प्रोग्रामर यह बदल सकता है कि कोई विधि किस ऑब्जेक्ट पर काम कर रही है। अंततः इस सुविधा को हटा दिया गया, और अब C++ में यह एक r-मान है।[9]

C++ के प्रारंभिक संस्करणों में संदर्भ सम्मिलित नहीं थे और यह सुझाव दिया गया है कि यदि शुरुआत से ही C++ में ऐसा होता, तब यह एक संदर्भ होता, सूचक नहीं।[10]

C++ ऑब्जेक्ट को सोर्स कोड स्टेटमेंट के साथ स्वयं को नष्ट करने देता है: इसे हटाएं।

सी#

अधिक जानकारी: सी शार्प (प्रोग्रामिंग भाषा)

C# में यह कीवर्ड संदर्भ प्रकारों के लिए जावा की तरह ही काम करता है। चूँकि, C# मान प्रकारों के अंदर, इसमें अधिक भिन्न शब्दार्थ हैं, जो एक सामान्य परिवर्तनशील चर संदर्भ के समान है, और यहां तक कि किसी असाइनमेंट के बाईं ओर भी हो सकता है।

C# में इसका एक उपयोग एक विधि के अंदर एक बाहरी फ़ील्ड चर के संदर्भ की अनुमति देना है जिसमें एक स्थानीय चर होता है जिसका नाम समान होता है। ऐसी स्थिति में, उदाहरण के लिए, कथन var n = localAndFieldname; विधि के अंदर स्थानीय चर localAndFieldname का प्रकार और मान n को निर्दिष्ट किया जाएगा, जबकि कथन var n = this.localAndFieldname; बाहरी फ़ील्ड चर का प्रकार और मान n को निर्दिष्ट करेगा।

डी

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

डायलन

प्रोग्रामिंग भाषा डायलन में, जो एक ऑब्जेक्ट-ओरिएंटेड भाषा है जो मल्टीमेथड्स का समर्थन करती है और इसकी कोई अवधारणा नहीं है, किसी ऑब्जेक्ट को संदेश भेजना अभी भी सिंटैक्स में रखा जाता है। नीचे दिए गए दोनों फॉर्म एक ही तरह से काम करते हैं; अंतर केवल वाक्यात्मक शर्करा है। object.method(param1, param2) और method (object, param1, param2)

एफिल
एक वर्ग पाठ के अंदर, वर्तमान प्रकार वर्तमान वर्ग से प्राप्त प्रकार है। किसी क्लास की सुविधाओं (रूटीन, कमांड और क्वेरीज़) के अंदर, कोई व्यक्ति वर्तमान क्लास और उसकी विशेषताओं को संदर्भित करने के लिए करंट कीवर्ड का उपयोग कर सकता है। कीवर्ड करंट का उपयोग वैकल्पिक है क्योंकि करंट कीवर्ड का तात्पर्य केवल वर्तमान वर्ग सुविधा के नाम को खुले तौर पर संदर्भित करना है। उदाहरण के लिए: किसी के पास क्लास MY_CLASS में `फू' सुविधा हो सकती है और इसे इसके द्वारा संदर्भित किया जा सकता है: class MY_CLASS feature -- Access foo: INTEGER my_function: INTEGER do          Result := foo end end [12]

पंक्ति #10 (ऊपर) में सरल `फू' कॉल द्वारा करंट का निहित संदर्भ है।

पंक्ति #10 (नीचे) में 'Current.foo' पर कॉल द्वारा करंट का स्पष्ट संदर्भ है। class                                                                             MY_CLASS feature -- Access foo: INTEGER my_function: INTEGER do           Result := Current.foo end end कंपाइलर को कोई भी दृष्टिकोण स्वीकार्य है, किन्तु निहित संस्करण (जैसे x := foo) को प्राथमिकता दी जाती है क्योंकि यह कम क्रियात्मक है।

अन्य लैंग्वेज की तरह, अनेक बार करंट कीवर्ड का उपयोग अनिवार्य होता है, जैसे: class                                                                                                                                 MY_CLASS feature -- Access my_command -- Create MY_OTHER_CLASS with `Current' local x: MY_OTHER_CLASS do          create x.make_with_something (Current) end end उपरोक्त कोड के स्थितियों में, लाइन #11 पर मेक_विथ_समथिंग पर कॉल स्पष्ट रूप से कीवर्ड को पास करके वर्तमान क्लास को पास कर रही है.

जावा
कीवर्ड  जावा (प्रोग्रामिंग भाषा) भाषा कीवर्ड है जो उस वर्ग के वर्तमान उदाहरण का प्रतिनिधित्व करता है जिसमें यह दिखाई देता है। इसका उपयोग क्लास वेरिएबल्स और विधियों तक पहुंचने के लिए किया जाता है।

चूँकि जावा में सभी इंस्टेंस विधियाँ आभासी हैं,  कभी भी शून्य नहीं हो सकता.

जावास्क्रिप्ट
जावास्क्रिप्ट में, जो प्रोग्रामिंग या स्क्रिप्टिंग भाषा है जिसका उपयोग वेब ब्राउज़र में बड़े पैमाने पर किया जाता है,  महत्वपूर्ण कीवर्ड है, चूँकि इसका मूल्यांकन किस प्रकार किया जाता है यह इस बात पर निर्भर करता है कि इसका उपयोग कहाँ किया जाता है।


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

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

उदाहरण के लिए:

विशेष रूप से, जावास्क्रिप्ट दोनों का उपयोग करता है  और संबंधित कीवर्ड  (अधिकांश अन्य लैंग्वेज के विपरीत जो या दूसरे को नियोजित करती हैं), साथ   विशेष रूप से वेब कर्मियों तक ही सीमित रखा जा रहा है।

अंत में, वैश्विक (विंडो या समतुल्य) ऑब्जेक्ट को विशेष रूप से संदर्भित करने के विश्वसनीय तरीके के रूप में, जावास्क्रिप्ट की सुविधा है  कीवर्ड.

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

उदाहरण के लिए, निम्नलिखित दो कार्य समतुल्य होते हैं।

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

पावरशेल
पॉवरशैल में विशेष स्वचालित चर  पाइपलाइन ऑब्जेक्ट में वर्तमान ऑब्जेक्ट सम्मिलित है। आप इस वेरिएबल का उपयोग उन कमांड्स में कर सकते हैं जो प्रत्येक ऑब्जेक्ट पर या पाइपलाइन में चयनित ऑब्जेक्ट पर कार्रवाई करते हैं। एक, दो , तीन | % { $_ लिखें } पॉवरशेल 5.0 से भी प्रारंभ होता है, जो कक्षाओं और अन्य उपयोगकर्ता-परिभाषित प्रकारों को परिभाषित करने के लिए औपचारिक वाक्यविन्यास जोड़ता है,  वेरिएबल ऑब्जेक्ट के वर्तमान उदाहरण का वर्णन करता है।

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

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

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

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

स्वयं
सेल्फ (प्रोग्रामिंग भाषा) भाषा का नाम सेल्फ के इसी प्रयोग के आधार पर रखा गया है।

एक्सबेस++
किसी वर्ग के तरीकों के अंदर सख्ती से उपयोग किया जाता है।

संदर्भित करने का दूसरा प्रणाली  उपयोग करना है.

अग्रिम पठन

 * मेयर्स, स्कॉट, 1995। अधिक प्रभावी सी++: आपके प्रोग्राम और डिज़ाइन को उत्तम बनाने के 35 नए तरीके। ISBN 0-201-63371-X स्कॉट मेयर्स
 * स्ट्रॉस्ट्रुप, बर्जने, 1994। सी++ का डिज़ाइन और विकास। एडिसन-वेस्ले पब। कं ISBN 0-201-54330-3 बज़्ने स्ट्रॉस्ट्रुप