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

कंप्यूटर प्रोग्रामिंग में, दो चर की परस्पर परिवर्तन का कार्य चर के मूल्यों के परस्पर आदान-प्रदान को संदर्भित करता है। सामान्यतः, यह कंप्यूटर भंडारण में डेटा के साथ किया जाता है। उदाहरण के लिए, एक कंप्यूटर प्रोग्राम में, दो चर राशि को इस प्रकार परिभाषित किया जा सकता है:

data_item x := 1 data_item y := 0

swap (x, y);

स्वैप निष्पादित होने के बाद, x में मान 0 होगा और y में 1 होगा; तथा उनके मूल्यों का आदान-प्रदान किया जा सकता है। इस ऑपरेशन को अन्य प्रकार के मानों के लिए सामान्यीकृत किया जा सकता है, जैसे कि स्ट्रिंग और समेकित डेटा प्रकार। तुलनात्मक डेटा की स्थिति को परिवर्तित करने के लिए स्वैप का उपयोग करते हैं।

कई प्रोग्रामिंग भाषाओं में स्वैप अंतर्निर्मित होता है। सी ++ में, फंक्शन अधिभार प्रदान की जाती है जिससे o (1) समय में कुछ बड़ी संरचनाओं का आदान-प्रदान करने के लिए स्वैप की अनुमति मिलती है।

एक टेम्प का उपयोग करना
दो चर राशि को स्वैप करने के लिए सबसे सरल और सबसे व्यापक रूप से प्रयोग की जाने वाली विधि तीसरे अस्थायी चर राशि का उपयोग करता है स्वैप परिभाषित करें                                                                                                  (x, y) define swap (x, y)    temp := x    x := y    y := temp जबकि यह वैचारिक रूप से सरल है और कई विषयो में दो चर स्वैप करने का एकमात्र सुविधाजनक विधि है, यह अतिरिक्त मेमोरी का उपयोग करता है। यद्यपि यह अधिकांश अनुप्रयोगों में एक समस्या नहीं होता है, परस्परित परिवर्तन किए जाने वाले मानों का आकार बहुत बड़ा होता है, जिसका अर्थ है कि अस्थायी चर बहुत अधिक मेमोरी भी ले सकते हैं, या स्वैप ऑपरेशन को कई बार करने की आवश्यकता हो सकती है, जैसा कि वर्गीकरण कलन विधि में।

इसके अतिरिक्त, C++ जैसी ऑब्जेक्ट-ओरिएंटेड भाषाओं में दो चरों को प्रतिस्थापित करने पर अस्थायी चरों के लिए क्लास कंस्ट्रक्टर और डिस्ट्रक्टर को एक कॉल और कॉपी कंस्ट्रक्टर के लिए तीन कॉल सम्मिलित हो सकते हैं। कुछ वर्ग कंस्ट्रक्टर में मेमोरी आवंटित नहीं किया जा सकता हैं और इसे डिस्ट्रक्टर से हटाया जा सकता हैं, इस प्रकार प्रणाली में महंगा कॉल निर्मित किया जाता हैं।

एक्सओआर स्वैप


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

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

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

समानांतर असाइनमेंट
रूबी या पायथन जैसी कुछ भाषाएँ समानांतर असाइनमेंट का समर्थन करती हैं, जो दो चरों की परस्पर परिवर्तन के लिए संकेतन को सरल बनाती हैं:

a, b = b, a

यह एक मध्यवर्ती डेटा संरचना से जुड़े ऑपरेशन के लिए आशुलिपि है: पायथन में, एक टपल रुबी में, एक सरणी जावास्क्रिप्ट 6+ विनाशकारी ऑपरेटरों का समर्थन करता है जो एक ही काम करते हैं:

[a, b] = [b, a];

फंक्शन स्वैप
यहां, दो विश्व स्तर पर स्कोप्ड चर एक फ़ंक्शन के माध्यम से मूल्य द्वारा पारित किए जाते हैं, अस्थायी भंडारण चर की आवश्यकता को समाप्त करते हैं।

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

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

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

Step 1 Processor 1: temp_1 := X Processor 2: temp_2 := Y Step 2 Processor 1: X := temp_2 Processor 2: Y := temp_1

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