बॉक्सिंग (कंप्यूटर विज्ञान)
कंप्यूटर विज्ञान में, बॉक्सिंग (a.k.a. रैपिंग) किसी ऑब्जेक्ट के भीतर एक प्रिमिटिव प्रकार के ऑब्जेक्ट को रखने में परिवर्तन है, जिससे कि मूल्य को संदर्भ प्रकार के रूप में उपयोग किया जा सके और इस प्रकार अनबॉक्सिंग अपने रैपर ऑब्जेक्ट से प्रिमिटिव मूल्य निकालने का रिवर्स ट्रांसफॉर्मेशन है। ऑटोबॉक्सिंग प्रक्रिया स्वचालित रूप से बॉक्सिंग या अनबॉक्सिंग रूपांतरणों को आवश्यकतानुसार प्रयुक्त करने के लिए है।
बॉक्सिंग
बॉक्सिंग का सबसे प्रमुख उपयोग जावा (प्रोग्रामिंग लैंग्वेज) में होता है, जहां रनटाइम दक्षता सिंटेक्स और सिमेंटिक विषयो जैसे कारणों से संदर्भ प्रकार और मूल्य प्रकारों के बीच अंतर होता है। जावा में, LinkedList
केवल Object
प्रकार के मानों को स्टोर कर सकती है।. किसी को int
की LinkedList
को फाइंड करने की इच्छा हो सकती है, लेकिन यह प्रत्यक्ष रूप से संभव नहीं होता है. इसके अतिरिक्त जावा प्रत्येक प्रिमिटिव डेटा प्रकार के अनुरूप प्रिमिटिव रैपर वर्गों को परिभाषित करता है, जैस, Integer
और int
, Character
और char
, Float
और float
, आदि। इसके बाद कोई बॉक्स किए गए इंटीजर का उपयोग करकेLinkedList
को परिभाषित कर सकता है और इस प्रकार Integer
और int
के रूप में बॉक्सिंग करके सूची में पूर्णांक मान सम्मिलित कर सकता है। जावा प्लेटफ़ॉर्म, मानक संस्करण 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
स्वयं, अब संकलित करते है। a और b को अनबॉक्स किया गया है पूर्णांक मानों को सारांशित किया जाता है और परिणाम एक नए पूर्णांक में ऑटोबॉक्स किया गया है 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# कंपाइलर द्वारा प्रिमिटिव (मूल्य) प्रकार या ऑब्जेक्ट (संदर्भ) प्रकार के रूप में कार्यान्वित किए जाते हैं।
दोनों लैंग्वेजो में, स्वचालित बॉक्सिंग स्वचालित रूप से डाउनकास्ट नहीं होती है अर्थात निम्नलिखित कोड संकलित नहीं होता है,
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.
संदर्भ
- ↑ "7.2. Unboxed types and primitive operations". downloads.haskell.org. Retrieved 10 August 2022.
- ↑ oracle.com Java language guide entry on autoboxing