डुप्लीकेट कोड

From Vigyanwiki

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

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

उदय

डुप्लीकेट कोड बनाने के कुछ विधि इस प्रकार हैं:

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

यह भी हो सकता है कि कार्यक्षमता की आवश्यकता होती है जो प्रोग्राम के दूसरे भाग में बहुत समान होती है और डेवलपर स्वतंत्र रूप से कोड लिखता है जो कि कहीं और उपस्थित है। अध्ययनों से पता चलता है कि इस तरह के स्वतंत्र रूप से पुनर्लेखित कोड सामान्यतः वाक्यगत रूप से समान नहीं होते हैं।[2]

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

फिक्सिंग

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

व्यय और लाभ

कोड जिसमें डुप्लिकेट कार्यक्षमता सम्मिलित है, समर्थन करना अधिक कठिन है क्योंकि,

  • यह केवल लंबा है, और
  • यदि इसे अद्यतन करने की आवश्यकता है, तो खतरा है कि कोड की प्रति उसी कोड के अन्य उदाहरणों की उपस्थिति की जांच किए बिना अद्यतन की जाएगी।

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

स्रोत कोड में कार्यक्षमता की केवल प्रति होने पर ये विचार स्वचालित रूप से जेनरेट किए गए कोड के लिए प्रासंगिक नहीं हैं।

अतीत में, जब मेमोरी स्थान अधिक सीमित था, डुप्लिकेट कोड में अधिक स्थान लेने का अतिरिक्त हानि थी, किंतु आजकल यह कोई समस्या होने की संभावना नहीं है।

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

डुप्लिकेट कोड का पता लगाना

डुप्लिकेट कोड का पता लगाने के लिए कई अलग-अलग एल्गोरिदम प्रस्तावित किए गए हैं। उदाहरण के लिए:

कार्यात्मक रूप से डुप्लिकेट कोड का उदाहरण

पूर्णांक की सरणी डेटा संरचना के औसत की गणना के लिए निम्नलिखित स्निपेट (प्रोग्रामिंग) पर विचार करें

extern int array_a[];
extern int array_b[];
 
int sum_a = 0;

for (int i = 0; i < 4; i++)
   sum_a += array_a[i];

int average_a = sum_a / 4;
 
int sum_b = 0;

for (int i = 0; i < 4; i++)
   sum_b += array_b[i];

int average_b = sum_b / 4;

दो छोरों को एकल कार्य के रूप में फिर से लिखा जा सकता है:

int calc_average_of_four(int* array) {
   int sum = 0;
   for (int i = 0; i < 4; i++)
       sum += array[i];

   return sum / 4;
}


या, सामान्यतः सरणी में तत्वों की संख्या को पैरामीटराइज़ करके अधिमानतः।

उपरोक्त फ़ंक्शन का उपयोग करने से स्रोत कोड मिलेगा जिसमें कोई लूप दोहराव नहीं है:

extern int array1[];
extern int array2[];

int average1 = calc_average_of_four(array1);
int average2 = calc_average_of_four(array2);

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

विधि द्वारा प्रतिस्थापित कोड के माध्यम से डुप्लिकेट कोड फिक्स का उदाहरण

यह भी देखें

संदर्भ

  1. Spinellis, Diomidis. "बैड कोड स्पॉटर्स गाइड". InformIT.com. Retrieved 2008-06-06.
  2. Code similarities beyond copy & paste by Elmar Juergens, Florian Deissenboeck, Benjamin Hummel.
  3. Li, Hongzhe; Kwon, Hyuckmin; Kwon, Jonghoon; Lee, Heejo (25 April 2016). "CLORIFI: software vulnerability discovery using code clone verification". Concurrency and Computation: Practice and Experience. 28 (6): 1900–1917. doi:10.1002/cpe.3532. S2CID 17363758.
  4. Arcelli Fontana, Francesca; Zanoni, Marco; Ranchetti, Andrea; Ranchetti, Davide (2013). "सॉफ्टवेयर क्लोन डिटेक्शन और रीफैक्टरिंग" (PDF). ISRN Software Engineering. 2013: 1–8. doi:10.1155/2013/129437.
  5. Kapser, C.; Godfrey, M.W., ""Cloning Considered Harmful" Considered Harmful," 13th Working Conference on Reverse Engineering (WCRE), pp. 19-28, Oct. 2006
  6. Wagner, Stefan; Abdulkhaleq, Asim; Kaya, Kamer; Paar, Alexander (2016). "On the relationship of inconsistent software clones and faults: an empirical study". Proc. 23rd IEEE International Conference on Software Analysis, Evolution, and Reengineering (SANER 2016): 79–89. arXiv:1611.08005. doi:10.1109/SANER.2016.94. ISBN 978-1-5090-1855-0. S2CID 3154845.
  7. Brenda S. Baker. A Program for Identifying Duplicated Code. Computing Science and Statistics, 24:49–57, 1992.
  8. Ira D. Baxter, et al. Clone Detection Using Abstract Syntax Trees
  9. Visual Detection of Duplicated Code Archived 2006-06-29 at the Wayback Machine by Matthias Rieger, Stephane Ducasse.
  10. Yuan, Y. and Guo, Y. CMCD: Count Matrix Based Code Clone Detection, in 2011 18th Asia-Pacific Software Engineering Conference. IEEE, Dec. 2011, pp. 250–257.
  11. Chen, X., Wang, A. Y., & Tempero, E. D. (2014). A Replication and Reproduction of Code Clone Detection Studies. In ACSC (pp. 105-114).
  12. Bulychev, Peter, and Marius Minea. "Duplicate code detection using anti-unification." Proceedings of the Spring/Summer Young Researchers’ Colloquium on Software Engineering. No. 2. Федеральное государственное бюджетное учреждение науки Институт системного программирования Российской академии наук, 2008.


बाहरी संबंध