← नवीनतम पेपर
💻 computer science

A Concern-Centric Empirical Evaluation of Multi-Language Code Smells: An LLM-Assisted Study of JNI Software Evolution

यह शोध पत्र 15 ओपन-सोर्स प्रोजेक्ट्स के 8,207 कमिट्स के LLM-सहायता प्राप्त विश्लेषण का उपयोग करके JNI कोड स्मेल्स (code smells) का एक चिंता-केंद्रित अनुभवजन्य मूल्यांकन प्रस्तुत करता है, जो यह प्रकट करता है कि मौजूदा स्मेल परिभाषाएं डेवलपर्स की रखरखाव संबंधी चिंताओं के केवल 36.5% को कवर करती हैं और पहचाने गए अंतराल को संबोधित करने के लिए तीन नई स्मेल परिभाषाएं प्रस्तावित करता है।

मूल लेखक: Md Shahrukh Ansari, Salman Abdul Moiz

प्रकाशित 2026-09-07
📖 6 मिनट में पढ़ें🧠 गहराई से पढ़ें

मूल लेखक: Md Shahrukh Ansari, Salman Abdul Moiz

मूल पेपर CC BY 4.0 (https://creativecommons.org/licenses/by/4.0/) के तहत लाइसेंस किया गया है। नीचे दिए गए पेपर की यह व्याख्या AI से तैयार की गई है। इसे लेखकों ने न तो लिखा है, न इसका समर्थन किया है। तकनीकी सटीकता के लिए मूल पेपर देखें। पूरा डिस्क्लेमर पढ़ें

आधुनिक सॉफ़्टवेयर अक्सर एक सुव्यवस्थित मशीन की तरह महसूस होता है, लेकिन इसके चिकने इंटरफ़ेस के नीचे, यह अक्सर अलग-अलग भाषाओं में बात करने वाले कई विभिन्न हिस्सों से बना होता है। किसी प्रोग्राम को तेज़, कुशल या विशेष हार्डवेयर से बात करने में सक्षम बनाने के लिए, डेवलपर्स अक्सर एक भाषा में लिखे गए कोड को दूसरी भाषा में लिखे गए कोड के साथ मिलाते हैं। इसे करने का एक सामान्य तरीका 'जावा नेटिव इंटरफेस' (Java Native Interface) नामक एक सेतु (ब्रिज) है, जो एक प्रोग्राम को जावा में लिखे जाने के बावजूद शक्तिशाली उपकरणों का उपयोग करने के लिए C या C++ तक पहुँच प्रदान करता है। हालाँकि भाषाओं का यह मिश्रण सॉफ़्टवेयर को बहुत शक्ति देता है, लेकिन यह एक अनूठे प्रकार का बिखराव भी पैदा करता है। जिस तरह एक अनुवादक दो अलग-अलग बोलियों को सुसंगत बनाए रखने के लिए संघर्ष कर सकता है, उसी तरह सॉफ़्टवेयर में ऐसे छिपे हुए दोष विकसित हो सकते हैं जहाँ दोनों भाषाएँ डेटा साझा करने, मेमोरी प्रबंधित करने या त्रुटियों को संभालने के तरीके पर सहमत होने में विफल रहती हैं। उद्योग में इन दोषों को "कोड स्मेल्स" (code smells) के रूप में जाना जाता है, जो ऐसे बग नहीं हैं जो प्रोग्राम को तुरंत क्रैश कर दें, बल्कि वे डिज़ाइन संबंधी विकल्प हैं जो सॉफ़्टवेयर को समय के साथ ठीक करना, अपडेट करना या समझना कठिन बना देते हैं। वर्षों से, विशेषज्ञों ने इन्हें सूचीबद्ध करने का प्रयास किया है, और यह बताने के लिए सूचियाँ बनाई हैं कि खराब क्रॉस-लैंग्वेज डिज़ाइन कैसा दिखता है। लेकिन एक महत्वपूर्ण प्रश्न अनुत्तरित रह गया था: क्या ये सूचियाँ वास्तव में उन वास्तविक समस्याओं से मेल खाती हैं जिनका सामना डेवलपर्स को इन जटिल प्रणालियों को चलाने के लिए हर दिन करना पड़ता है?

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

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

शोधकर्ताओं ने महसूस किया कि गायब समस्याएँ यादृच्छिक त्रुटियाँ नहीं थीं, बल्कि आवर्ती पैटर्न थे जिन्हें अपने नाम देने की आवश्यकता थी। उन्होंने पाया कि जब भी कोई एक विवरण बदलता था, तो डेवलपर्स को अक्सर जावा कोड और सी कोड दोनों में समन्वित परिवर्तन करने पड़ते थे, एक ऐसी स्थिति जिसने अपडेट को धीमा और त्रुटिपूर्ण बना दिया। उन्होंने ऐसे मामले भी देखे जहाँ सॉफ़्टवेयर भाषा की बाधा के पार छिपे हुए आंतरिक विवरणों को उजागर कर रहा था, जिससे सिस्टम की सुरक्षा और संगठन कमजोर हो रहा था। अंत में, उन्होंने देखा कि जिम्मेदारियाँ अक्सर गलत भाषा में रखी जाती थीं, जिससे एक पक्ष को दूसरे पक्ष से अपना काम करने के लिए लगातार पूछना पड़ता था, जिससे अनावश्यक जटिलता पैदा होती थी। इन बार-बार होने वाले अवलोकनों के आधार पर, टीम ने कोड स्मेल्स की तीन नई परिभाषाएँ प्रस्तावित कीं जो विशेष रूप से इन क्रॉस-लैंग्वेज मुद्दों को संबोधित करती हैं। उन्होंने उन्हें 'क्रॉस-लैंग्वेज शॉटगन सर्जरी' (Cross-Language Shotgun Surgery) नाम दिया, जो एक साथ कई फ़ाइलों को बदलने की आवश्यकता का वर्णन करता है; 'क्रॉस-लैंग्वेज एब्स्ट्रैक्शन लीकेज' (Cross-Language Abstraction Leakage), जहाँ छिपे हुए विवरण अनजाने में उजागर हो जाते हैं; और 'रॉन्ग रिस्पॉन्सिबिलिटी एलोकेशन' (Wrong Responsibility Allocation), जहाँ कार्यों को गलत भाषा स्तर पर सौंपा जाता है।

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

अपने क्षेत्र के पेपरों की भीड़ में उलझे हुए हैं?

आपके रिसर्च कीवर्ड से मेल खाने वाले सबसे नए और अलग सोच वाले पेपरों का रोज़ाना Digest पाएँ—तकनीकी सारांश के साथ, आपकी भाषा में।

Digest आज़माएँ →