बॉक्सिंग (कंप्यूटर विज्ञान): Difference between revisions

From Vigyanwiki
(Created page with "{{Short description|Programming language concept}} {{More citations needed|date=August 2009}} कंप्यूटर विज्ञान में, बॉक्सि...")
 
No edit summary
Line 1: Line 1:
{{Short description|Programming language concept}}
{{Short description|Programming language concept}}
{{More citations needed|date=August 2009}}
{{More citations needed|date=August 2009}}
[[कंप्यूटर विज्ञान]] में, बॉक्सिंग (a.k.a. रैपिंग) किसी वस्तु के भीतर एक आदिम प्रकार रखने का परिवर्तन है ताकि मूल्य को [[संदर्भ प्रकार]] के रूप में उपयोग किया जा सके। अनबॉक्सिंग अपने रैपर ऑब्जेक्ट से आदिम मूल्य निकालने का रिवर्स ट्रांसफॉर्मेशन है। ऑटोबॉक्सिंग आवश्यकतानुसार बॉक्सिंग और/या अनबॉक्सिंग परिवर्तनों को स्वचालित रूप से लागू करने का शब्द है।
[[कंप्यूटर विज्ञान]] में, बॉक्सिंग (a.k.a. रैपिंग) किसी ऑब्जेक्ट के भीतर एक प्राचीन प्रकार के ऑब्जेक्ट को रखने में परिवर्तन है, जिससे कि मूल्य को [[संदर्भ प्रकार]] के रूप में उपयोग किया जा सके और इस प्रकार अनबॉक्सिंग अपने रैपर ऑब्जेक्ट से प्राचीन मूल्य निकालने का रिवर्स ट्रांसफॉर्मेशन है। ऑटोबॉक्सिंग प्रक्रिया स्वचालित रूप से बॉक्सिंग या अनबॉक्सिंग रूपांतरणों को आवश्यकतानुसार प्रयुक्त करने के लिए है।


==मुक्केबाजी==
==मुक्केबाजी==


बॉक्सिंग का सबसे प्रमुख उपयोग [[जावा (प्रोग्रामिंग भाषा)]] में होता है जहां रनटाइम दक्षता और वाक्यविन्यास और अर्थ संबंधी मुद्दों जैसे कारणों से संदर्भ प्रकार और मूल्य प्रकारों के बीच अंतर होता है। जावा में, ए {{Java|LinkedList}} केवल प्रकार के मान संग्रहीत कर सकता है {{Java|Object}}. किसी को पाने की इच्छा हो सकती है {{Java|LinkedList}} का {{Java|int}}, लेकिन यह सीधे तौर पर संभव नहीं है. इसके बजाय जावा प्रत्येक [[आदिम डेटा प्रकार]] के अनुरूप आदिम रैपर वर्गों को परिभाषित करता है: {{Java|Integer}} और {{Java|int}}, {{Java|Character}} और {{Java|char}}, {{Java|Float}} और {{Java|float}}, आदि। फिर कोई परिभाषित कर सकता है {{Java|LinkedList}} बॉक्स्ड प्रकार का उपयोग करना {{Java|Integer}} और डालें {{Java|int}} मानों को इस रूप में बॉक्सिंग करके सूची में डालें {{Java|Integer}} वस्तुएं। (जावा प्लेटफ़ॉर्म, मानक संस्करण 5.0 में पेश किए गए [[सामान्य प्रोग्रामिंग]] पैरामीटरयुक्त प्रकारों का उपयोग करके, इस प्रकार को इस प्रकार दर्शाया गया है {{Java|LinkedList<Integer>}}.)
बॉक्सिंग का सबसे प्रमुख उपयोग [[जावा (प्रोग्रामिंग भाषा)]] में होता है जहां रनटाइम दक्षता और वाक्यविन्यास और अर्थ संबंधी मुद्दों जैसे कारणों से संदर्भ प्रकार और मूल्य प्रकारों के बीच अंतर होता है। जावा में, ए {{Java|LinkedList}} केवल प्रकार के मान संग्रहीत कर सकता है {{Java|Object}}. किसी को पाने की इच्छा हो सकती है {{Java|LinkedList}} का {{Java|int}}, लेकिन यह सीधे तौर पर संभव नहीं है. इसके बजाय जावा प्रत्येक [[आदिम डेटा प्रकार|प्राचीन डेटा प्रकार]] के अनुरूप प्राचीन रैपर वर्गों को परिभाषित करता है: {{Java|Integer}} और {{Java|int}}, {{Java|Character}} और {{Java|char}}, {{Java|Float}} और {{Java|float}}, आदि। फिर कोई परिभाषित कर सकता है {{Java|LinkedList}} बॉक्स्ड प्रकार का उपयोग करना {{Java|Integer}} और डालें {{Java|int}} मानों को इस रूप में बॉक्सिंग करके सूची में डालें {{Java|Integer}} वस्तुएं। (जावा प्लेटफ़ॉर्म, मानक संस्करण 5.0 में पेश किए गए [[सामान्य प्रोग्रामिंग]] पैरामीटरयुक्त प्रकारों का उपयोग करके, इस प्रकार को इस प्रकार दर्शाया गया है {{Java|LinkedList<Integer>}}.)


दूसरी ओर, सी शार्प (प्रोग्रामिंग भाषा)|सी# में कोई आदिम रैपर वर्ग नहीं है, लेकिन किसी भी मूल्य प्रकार की बॉक्सिंग की अनुमति देता है, एक सामान्य लौटाता है {{C sharp|Object}} संदर्भ। [[ उद्देश्य सी ]] में, किसी भी आदिम मूल्य को ए द्वारा उपसर्ग किया जा सकता है {{ObjC|@}} एक बनाने के लिए {{ObjC|NSNumber}} इसमें से (उदा. {{ObjC|@123}} या {{ObjC|@(123)}}). यह उन्हें किसी भी मानक संग्रह में जोड़ने की अनुमति देता है, जैसे कि {{ObjC|NSArray}}.
दूसरी ओर, सी शार्प (प्रोग्रामिंग भाषा)|सी# में कोई प्राचीन रैपर वर्ग नहीं है, लेकिन किसी भी मूल्य प्रकार की बॉक्सिंग की अनुमति देता है, एक सामान्य लौटाता है {{C sharp|Object}} संदर्भ। [[ उद्देश्य सी ]] में, किसी भी प्राचीन मूल्य को ए द्वारा उपसर्ग किया जा सकता है {{ObjC|@}} एक बनाने के लिए {{ObjC|NSNumber}} इसमें से (उदा. {{ObjC|@123}} या {{ObjC|@(123)}}). यह उन्हें किसी भी मानक संग्रह में जोड़ने की अनुमति देता है, जैसे कि {{ObjC|NSArray}}.


[[हास्केल]] के पास संदर्भ प्रकार की बहुत कम या कोई धारणा नहीं है, लेकिन फिर भी रनटाइम सिस्टम के समान पॉइंटर-टू-टैग यूनियन प्रतिनिधित्व के लिए बॉक्स्ड शब्द का उपयोग करता है।<ref>{{cite web |title=7.2. Unboxed types and primitive operations |url=https://downloads.haskell.org/~ghc/6.12.1/docs/html/users_guide/primitives.html |website=downloads.haskell.org |access-date=10 August 2022}}</ref>
[[हास्केल]] के पास संदर्भ प्रकार की बहुत कम या कोई धारणा नहीं है, लेकिन फिर भी रनटाइम सिस्टम के समान पॉइंटर-टू-टैग यूनियन प्रतिनिधित्व के लिए बॉक्स्ड शब्द का उपयोग करता है।<ref>{{cite web |title=7.2. Unboxed types and primitive operations |url=https://downloads.haskell.org/~ghc/6.12.1/docs/html/users_guide/primitives.html |website=downloads.haskell.org |access-date=10 August 2022}}</ref>
बॉक्स्ड ऑब्जेक्ट हमेशा वैल्यू ऑब्जेक्ट की एक प्रति होती है, और आमतौर पर अपरिवर्तनीय ऑब्जेक्ट होती है। ऑब्जेक्ट को अनबॉक्स करने से संग्रहीत मूल्य की एक प्रति भी वापस आ जाती है। वस्तुओं की बार-बार बॉक्सिंग और अनबॉक्सिंग से प्रदर्शन पर गंभीर प्रभाव पड़ सकता है, क्योंकि नई वस्तुओं को बॉक्सिंग डायनेमिक मेमोरी आवंटन और अनबॉक्सिंग (यदि बॉक्सिंग मान का अब उपयोग नहीं किया जाता है) तो उन्हें [[कचरा संग्रहण (कंप्यूटर विज्ञान)]] के लिए योग्य बनाता है। हालाँकि, आधुनिक कचरा संग्राहक जैसे कि डिफ़ॉल्ट जावा हॉटस्पॉट कचरा संग्राहक अधिक कुशलता से अल्पकालिक वस्तुओं को एकत्र कर सकते हैं, इसलिए यदि बॉक्स की गई वस्तुएं अल्पकालिक हैं, तो प्रदर्शन प्रभाव गंभीर नहीं हो सकता है।
बॉक्स्ड ऑब्जेक्ट हमेशा वैल्यू ऑब्जेक्ट की एक प्रति होती है, और आमतौर पर अपरिवर्तनीय ऑब्जेक्ट होती है। ऑब्जेक्ट को अनबॉक्स करने से संग्रहीत मूल्य की एक प्रति भी वापस आ जाती है। वस्तुओं की बार-बार बॉक्सिंग और अनबॉक्सिंग से प्रदर्शन पर गंभीर प्रभाव पड़ सकता है, क्योंकि नई वस्तुओं को बॉक्सिंग डायनेमिक मेमोरी आवंटन और अनबॉक्सिंग (यदि बॉक्सिंग मान का अब उपयोग नहीं किया जाता है) तो उन्हें [[कचरा संग्रहण (कंप्यूटर विज्ञान)]] के लिए योग्य बनाता है। हालाँकि, आधुनिक कचरा संग्राहक जैसे कि डिफ़ॉल्ट जावा हॉटस्पॉट कचरा संग्राहक अधिक कुशलता से अल्पकालिक वस्तुओं को एकत्र कर सकते हैं, इसलिए यदि बॉक्स की गई वस्तुएं अल्पकालिक हैं, तो प्रदर्शन प्रभाव गंभीर नहीं हो सकता है।


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


==ऑटोबॉक्सिंग==
==ऑटोबॉक्सिंग==
Line 23: Line 23:
Integer i = 9; // error in versions prior to 5.0!
Integer i = 9; // error in versions prior to 5.0!
</syntaxhighlight>
</syntaxhighlight>
5.0 से पहले के कंपाइलर अंतिम पंक्ति को स्वीकार नहीं करेंगे। {{Java|Integer}} संदर्भ वस्तुएं हैं, सतह पर इससे भिन्न नहीं हैं {{Java|List}}, {{Java|Object}}, इत्यादि। एक से परिवर्तित करने के लिए {{Java|int}} अगर {{Java|Integer}}, किसी को इंटीजर ऑब्जेक्ट को मैन्युअल रूप से इंस्टेंट करना पड़ता था। J2SE 5.0 के अनुसार, कंपाइलर अंतिम पंक्ति को स्वीकार करेगा, और स्वचालित रूप से इसे बदल देगा ताकि मूल्य को संग्रहीत करने के लिए एक इंटीजर ऑब्जेक्ट बनाया जा सके {{Java|9}}.<ref>[https://docs.oracle.com/javase/1.5.0/docs/guide/language/autoboxing.html oracle.com Java language guide entry on autoboxing]</ref> इसका मतलब है कि, J2SE 5.0 से, कुछ इस तरह {{Java|1=Integer c = a + b}}, कहाँ {{Java|a}} और {{Java|b}} हैं {{Java|Integer}} स्वयं, अब संकलित करेंगे - ए और बी अनबॉक्स किए गए हैं, पूर्णांक मान संक्षेपित हैं, और परिणाम एक नए में ऑटोबॉक्स किया गया है {{Java|Integer}}, जो अंततः वेरिएबल के अंदर संग्रहीत होता है {{Java|c}}. समानता ऑपरेटरों का उपयोग इस तरह से नहीं किया जा सकता है, क्योंकि संदर्भ प्रकारों के लिए, संदर्भों की समानता के लिए समानता ऑपरेटर पहले से ही परिभाषित हैं; बॉक्स्ड प्रकार में मान की समानता का परीक्षण करने के लिए, किसी को अभी भी मैन्युअल रूप से उन्हें अनबॉक्स करना होगा और प्राइमेटिव्स की तुलना करनी होगी, या इसका उपयोग करना होगा {{Java|Objects.equals}} तरीका।
5.0 से पहले के कंपाइलर अंतिम पंक्ति को स्वीकार नहीं करेंगे। {{Java|Integer}} संदर्भ वस्तुएं हैं, सतह पर इससे भिन्न नहीं हैं {{Java|List}}, {{Java|Object}}, इत्यादि। एक से परिवर्तित करने के लिए {{Java|int}} अगर {{Java|Integer}}, किसी को इंटीजर ऑब्जेक्ट को मैन्युअल रूप से इंस्टेंट करना पड़ता था। J2SE 5.0 के अनुसार, कंपाइलर अंतिम पंक्ति को स्वीकार करेगा, और स्वचालित रूप से इसे बदल देगा जिससे कि मूल्य को संग्रहीत करने के लिए एक इंटीजर ऑब्जेक्ट बनाया जा सके {{Java|9}}.<ref>[https://docs.oracle.com/javase/1.5.0/docs/guide/language/autoboxing.html oracle.com Java language guide entry on autoboxing]</ref> इसका मतलब है कि, J2SE 5.0 से, कुछ इस तरह {{Java|1=Integer c = a + b}}, कहाँ {{Java|a}} और {{Java|b}} हैं {{Java|Integer}} स्वयं, अब संकलित करेंगे - ए और बी अनबॉक्स किए गए हैं, पूर्णांक मान संक्षेपित हैं, और परिणाम एक नए में ऑटोबॉक्स किया गया है {{Java|Integer}}, जो अंततः वेरिएबल के अंदर संग्रहीत होता है {{Java|c}}. समानता ऑपरेटरों का उपयोग इस तरह से नहीं किया जा सकता है, क्योंकि संदर्भ प्रकारों के लिए, संदर्भों की समानता के लिए समानता ऑपरेटर पहले से ही परिभाषित हैं; बॉक्स्ड प्रकार में मान की समानता का परीक्षण करने के लिए, किसी को अभी भी मैन्युअल रूप से उन्हें अनबॉक्स करना होगा और प्राइमेटिव्स की तुलना करनी होगी, या इसका उपयोग करना होगा {{Java|Objects.equals}} तरीका।


एक अन्य उदाहरण: J2SE 5.0 प्रोग्रामर को एक संग्रह (जैसे कि) का इलाज करने की अनुमति देता है {{Java|LinkedList}}) मानो इसमें समाहित हो {{Java|int}} के बजाय मान {{Java|Integer}} वस्तुएं। यह ऊपर कही गई बातों का खंडन नहीं करता है: संग्रह में अभी भी केवल गतिशील वस्तुओं के संदर्भ हैं, और यह आदिम प्रकारों को सूचीबद्ध नहीं कर सकता है। यह नहीं हो सकता {{Java|LinkedList<int>}}, लेकिन यह एक होना चाहिए {{Java|LinkedList<Integer>}} बजाय। हालाँकि, कंपाइलर स्वचालित रूप से कोड को बदल देता है ताकि सूची चुपचाप ऑब्जेक्ट प्राप्त कर ले, जबकि स्रोत कोड केवल आदिम मूल्यों का उल्लेख करता है। उदाहरण के लिए, प्रोग्रामर अब लिख सकता है {{Java|list.add(3)}} और ऐसे सोचें जैसे कि {{Java|int}} {{Java|3}} को सूची में जोड़ा गया; लेकिन, कंपाइलर ने वास्तव में लाइन को रूपांतरित कर दिया होगा {{Java|list.add(new Integer(3))}}.
एक अन्य उदाहरण: J2SE 5.0 प्रोग्रामर को एक संग्रह (जैसे कि) का इलाज करने की अनुमति देता है {{Java|LinkedList}}) मानो इसमें समाहित हो {{Java|int}} के बजाय मान {{Java|Integer}} वस्तुएं। यह ऊपर कही गई बातों का खंडन नहीं करता है: संग्रह में अभी भी केवल गतिशील वस्तुओं के संदर्भ हैं, और यह प्राचीन प्रकारों को सूचीबद्ध नहीं कर सकता है। यह नहीं हो सकता {{Java|LinkedList<int>}}, लेकिन यह एक होना चाहिए {{Java|LinkedList<Integer>}} बजाय। हालाँकि, कंपाइलर स्वचालित रूप से कोड को बदल देता है जिससे कि सूची चुपचाप ऑब्जेक्ट प्राप्त कर ले, जबकि स्रोत कोड केवल प्राचीन मूल्यों का उल्लेख करता है। उदाहरण के लिए, प्रोग्रामर अब लिख सकता है {{Java|list.add(3)}} और ऐसे सोचें जैसे कि {{Java|int}} {{Java|3}} को सूची में जोड़ा गया; लेकिन, कंपाइलर ने वास्तव में लाइन को रूपांतरित कर दिया होगा {{Java|list.add(new Integer(3))}}.


===स्वचालित अनबॉक्सिंग===
===स्वचालित अनबॉक्सिंग===
स्वचालित अनबॉक्सिंग के साथ कंपाइलर स्वचालित रूप से अतिरिक्त स्रोत कोड की आपूर्ति करता है जो उस ऑब्जेक्ट से मूल्य को पुनर्प्राप्त करता है, या तो उस ऑब्जेक्ट पर कुछ विधि लागू करके, या अन्य माध्यमों से।
स्वचालित अनबॉक्सिंग के साथ कंपाइलर स्वचालित रूप से अतिरिक्त स्रोत कोड की आपूर्ति करता है जो उस ऑब्जेक्ट से मूल्य को पुनर्प्राप्त करता है, या तो उस ऑब्जेक्ट पर कुछ विधि प्रयुक्त करके, या अन्य माध्यमों से।


उदाहरण के लिए, J2SE 5.0 से पहले जावा के संस्करणों में, निम्नलिखित कोड संकलित नहीं हुआ था:
उदाहरण के लिए, J2SE 5.0 से पहले जावा के संस्करणों में, निम्नलिखित कोड संकलित नहीं हुआ था:
Line 37: Line 37:
int m = k;            // would have been an error, but okay now
int m = k;            // would have been an error, but okay now
</syntaxhighlight>
</syntaxhighlight>
C# जावा के समान अर्थ में स्वचालित अनबॉक्सिंग का समर्थन नहीं करता है, क्योंकि इसमें आदिम प्रकार और ऑब्जेक्ट प्रकारों का एक अलग सेट नहीं है। जावा में सभी प्रकार जिनके आदिम और ऑब्जेक्ट दोनों संस्करण हैं, स्वचालित रूप से C# कंपाइलर द्वारा आदिम (मूल्य) प्रकार या ऑब्जेक्ट (संदर्भ) प्रकार के रूप में कार्यान्वित किए जाते हैं।
C# जावा के समान अर्थ में स्वचालित अनबॉक्सिंग का समर्थन नहीं करता है, क्योंकि इसमें प्राचीन प्रकार और ऑब्जेक्ट प्रकारों का एक अलग सेट नहीं है। जावा में सभी प्रकार जिनके प्राचीन और ऑब्जेक्ट दोनों संस्करण हैं, स्वचालित रूप से C# कंपाइलर द्वारा प्राचीन (मूल्य) प्रकार या ऑब्जेक्ट (संदर्भ) प्रकार के रूप में कार्यान्वित किए जाते हैं।


दोनों भाषाओं में, स्वचालित बॉक्सिंग स्वचालित रूप से डाउनकास्ट नहीं होती है, यानी निम्नलिखित कोड संकलित नहीं होगा:
दोनों भाषाओं में, स्वचालित बॉक्सिंग स्वचालित रूप से डाउनकास्ट नहीं होती है, यानी निम्नलिखित कोड संकलित नहीं होगा:
Line 59: Line 59:
==सहायक टाइप करें==
==सहायक टाइप करें==
आधुनिक [[ऑब्जेक्ट पास्कल]] के पास सरल प्रकारों पर ऑपरेशन करने का एक और तरीका है, जो बॉक्सिंग के करीब है, जिसे [[फ्रीपास्कल]] में टाइप हेल्पर्स कहा जाता है या डेल्फी (प्रोग्रामिंग भाषा) में रिकॉर्ड हेल्पर्स और डेल्फी मोड में फ्रीपास्कल कहा जाता है।<br>
आधुनिक [[ऑब्जेक्ट पास्कल]] के पास सरल प्रकारों पर ऑपरेशन करने का एक और तरीका है, जो बॉक्सिंग के करीब है, जिसे [[फ्रीपास्कल]] में टाइप हेल्पर्स कहा जाता है या डेल्फी (प्रोग्रामिंग भाषा) में रिकॉर्ड हेल्पर्स और डेल्फी मोड में फ्रीपास्कल कहा जाता है।<br>
उल्लिखित बोलियाँ ऑब्जेक्ट पास्कल कंपाइल-टू-नेटिव भाषाएँ हैं, और इसलिए कुछ सुविधाएँ छूट जाती हैं जिन्हें C# और Java लागू कर सकते हैं। दृढ़ता से टाइप किए गए वेरिएबल्स पर विशेष रूप से रन-टाइम प्रकार का अनुमान।<br>
उल्लिखित बोलियाँ ऑब्जेक्ट पास्कल कंपाइल-टू-नेटिव भाषाएँ हैं, और इसलिए कुछ सुविधाएँ छूट जाती हैं जिन्हें C# और Java प्रयुक्त कर सकते हैं। दृढ़ता से टाइप किए गए वेरिएबल्स पर विशेष रूप से रन-टाइम प्रकार का अनुमान।<br>
लेकिन यह फीचर बॉक्सिंग से जुड़ा है।<br>
लेकिन यह फीचर बॉक्सिंग से जुड़ा है।<br>
यह प्रोग्रामर को जैसे निर्माणों का उपयोग करने की अनुमति देता है
यह प्रोग्रामर को जैसे निर्माणों का उपयोग करने की अनुमति देता है

Revision as of 06:48, 18 July 2023

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

मुक्केबाजी

बॉक्सिंग का सबसे प्रमुख उपयोग जावा (प्रोग्रामिंग भाषा) में होता है जहां रनटाइम दक्षता और वाक्यविन्यास और अर्थ संबंधी मुद्दों जैसे कारणों से संदर्भ प्रकार और मूल्य प्रकारों के बीच अंतर होता है। जावा में, ए LinkedList केवल प्रकार के मान संग्रहीत कर सकता है Object. किसी को पाने की इच्छा हो सकती है LinkedList का int, लेकिन यह सीधे तौर पर संभव नहीं है. इसके बजाय जावा प्रत्येक प्राचीन डेटा प्रकार के अनुरूप प्राचीन रैपर वर्गों को परिभाषित करता है: Integer और int, Character और char, Float और float, आदि। फिर कोई परिभाषित कर सकता है LinkedList बॉक्स्ड प्रकार का उपयोग करना Integer और डालें int मानों को इस रूप में बॉक्सिंग करके सूची में डालें Integer वस्तुएं। (जावा प्लेटफ़ॉर्म, मानक संस्करण 5.0 में पेश किए गए सामान्य प्रोग्रामिंग पैरामीटरयुक्त प्रकारों का उपयोग करके, इस प्रकार को इस प्रकार दर्शाया गया है LinkedList<Integer>.)

दूसरी ओर, सी शार्प (प्रोग्रामिंग भाषा)|सी# में कोई प्राचीन रैपर वर्ग नहीं है, लेकिन किसी भी मूल्य प्रकार की बॉक्सिंग की अनुमति देता है, एक सामान्य लौटाता है Object संदर्भ। उद्देश्य सी में, किसी भी प्राचीन मूल्य को ए द्वारा उपसर्ग किया जा सकता है @ एक बनाने के लिए NSNumber इसमें से (उदा. @123 या @(123)). यह उन्हें किसी भी मानक संग्रह में जोड़ने की अनुमति देता है, जैसे कि NSArray.

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

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

ऑटोबॉक्सिंग

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

उदाहरण के लिए, J2SE 5.0 से पहले जावा के संस्करणों में, निम्नलिखित कोड संकलित नहीं हुआ था:

Integer i = new Integer(9);
Integer i = 9; // error in versions prior to 5.0!

5.0 से पहले के कंपाइलर अंतिम पंक्ति को स्वीकार नहीं करेंगे। Integer संदर्भ वस्तुएं हैं, सतह पर इससे भिन्न नहीं हैं List, Object, इत्यादि। एक से परिवर्तित करने के लिए int अगर Integer, किसी को इंटीजर ऑब्जेक्ट को मैन्युअल रूप से इंस्टेंट करना पड़ता था। J2SE 5.0 के अनुसार, कंपाइलर अंतिम पंक्ति को स्वीकार करेगा, और स्वचालित रूप से इसे बदल देगा जिससे कि मूल्य को संग्रहीत करने के लिए एक इंटीजर ऑब्जेक्ट बनाया जा सके 9.[2] इसका मतलब है कि, J2SE 5.0 से, कुछ इस तरह Integer c = a + b, कहाँ a और b हैं Integer स्वयं, अब संकलित करेंगे - ए और बी अनबॉक्स किए गए हैं, पूर्णांक मान संक्षेपित हैं, और परिणाम एक नए में ऑटोबॉक्स किया गया है Integer, जो अंततः वेरिएबल के अंदर संग्रहीत होता है c. समानता ऑपरेटरों का उपयोग इस तरह से नहीं किया जा सकता है, क्योंकि संदर्भ प्रकारों के लिए, संदर्भों की समानता के लिए समानता ऑपरेटर पहले से ही परिभाषित हैं; बॉक्स्ड प्रकार में मान की समानता का परीक्षण करने के लिए, किसी को अभी भी मैन्युअल रूप से उन्हें अनबॉक्स करना होगा और प्राइमेटिव्स की तुलना करनी होगी, या इसका उपयोग करना होगा Objects.equals तरीका।

एक अन्य उदाहरण: J2SE 5.0 प्रोग्रामर को एक संग्रह (जैसे कि) का इलाज करने की अनुमति देता है LinkedList) मानो इसमें समाहित हो int के बजाय मान Integer वस्तुएं। यह ऊपर कही गई बातों का खंडन नहीं करता है: संग्रह में अभी भी केवल गतिशील वस्तुओं के संदर्भ हैं, और यह प्राचीन प्रकारों को सूचीबद्ध नहीं कर सकता है। यह नहीं हो सकता LinkedList<int>, लेकिन यह एक होना चाहिए LinkedList<Integer> बजाय। हालाँकि, कंपाइलर स्वचालित रूप से कोड को बदल देता है जिससे कि सूची चुपचाप ऑब्जेक्ट प्राप्त कर ले, जबकि स्रोत कोड केवल प्राचीन मूल्यों का उल्लेख करता है। उदाहरण के लिए, प्रोग्रामर अब लिख सकता है list.add(3) और ऐसे सोचें जैसे कि int 3 को सूची में जोड़ा गया; लेकिन, कंपाइलर ने वास्तव में लाइन को रूपांतरित कर दिया होगा list.add(new Integer(3)).

स्वचालित अनबॉक्सिंग

स्वचालित अनबॉक्सिंग के साथ कंपाइलर स्वचालित रूप से अतिरिक्त स्रोत कोड की आपूर्ति करता है जो उस ऑब्जेक्ट से मूल्य को पुनर्प्राप्त करता है, या तो उस ऑब्जेक्ट पर कुछ विधि प्रयुक्त करके, या अन्य माध्यमों से।

उदाहरण के लिए, J2SE 5.0 से पहले जावा के संस्करणों में, निम्नलिखित कोड संकलित नहीं हुआ था:

Integer k = new Integer(4);
int l = k.intValue(); // always okay
int m = k;            // would have been an error, but okay now

C# जावा के समान अर्थ में स्वचालित अनबॉक्सिंग का समर्थन नहीं करता है, क्योंकि इसमें प्राचीन प्रकार और ऑब्जेक्ट प्रकारों का एक अलग सेट नहीं है। जावा में सभी प्रकार जिनके प्राचीन और ऑब्जेक्ट दोनों संस्करण हैं, स्वचालित रूप से C# कंपाइलर द्वारा प्राचीन (मूल्य) प्रकार या ऑब्जेक्ट (संदर्भ) प्रकार के रूप में कार्यान्वित किए जाते हैं।

दोनों भाषाओं में, स्वचालित बॉक्सिंग स्वचालित रूप से डाउनकास्ट नहीं होती है, यानी निम्नलिखित कोड संकलित नहीं होगा:

सी#:

int i = 42;
object o = i;         // box
int j = o;            // unbox (error)
Console.WriteLine(j); // unreachable line, author might have expected output "42"

जावा:

int i = 42;
Object o = i;          // box
int j = o;             // unbox (error)
System.out.println(j); // unreachable line, author might have expected output "42"


सहायक टाइप करें

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

{$ifdef fpc}{$mode delphi}{$endif}
uses sysutils;  // this unit contains wraps for the simple types
var
  x:integer=100;
  s:string;
begin
  s:= x.ToString;
  writeln(s);
end.


संदर्भ

  1. "7.2. Unboxed types and primitive operations". downloads.haskell.org. Retrieved 10 August 2022.
  2. oracle.com Java language guide entry on autoboxing