स्व-संशोधित कोड

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

स्व-संशोधित कोड में मौजूदा निर्देशों को ओवरराइट करना या रन टाइम पर नया कोड बनाना और उस कोड पर नियंत्रण स्थानांतरित करना शामिल हो सकता है।

स्व-संशोधन का उपयोग फ़्लैग सेटिंग और सशर्त प्रोग्राम ब्रांचिंग की विधि के विकल्प के रूप में किया जा सकता है, जिसका उपयोग मुख्य रूप से किसी स्थिति की जांच की जाने वाली संख्या को कम करने के लिए किया जाता है।

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

संशोधन किए जा सकते हैं:
 * केवल इनिशियलाइज़ेशन के दौरान - इनपुट पैरामीटर जम्पर (कम्प्यूटिंग) पर आधारित (जब प्रक्रिया को आमतौर पर सॉफ़्टवेयर 'कंप्यूटर विन्यास' के रूप में वर्णित किया जाता है और हार्डवेयर शब्दों में, मुद्रित सर्किट बोर्डों के लिए जम्पर (कंप्यूटिंग) सेट करने के लिए कुछ हद तक अनुरूप होता है)। प्रोग्राम एंट्री पॉइंटर (कंप्यूटर प्रोग्रामिंग) का परिवर्तन स्व-संशोधन का एक समान अप्रत्यक्ष तरीका है, लेकिन एक या अधिक वैकल्पिक निर्देश पथों के सह-अस्तित्व की आवश्यकता होती है, जिससे बाइनरी फ़ाइल बढ़ जाती है।
 * निष्पादन के दौरान (चलते-फिरते) - निष्पादन के दौरान हासिल किए गए विशेष कार्यक्रम राज्यों के आधार पर

किसी भी मामले में, संशोधन सीधे मशीन कोड निर्देशों में किया जा सकता है, मौजूदा निर्देशों पर नए निर्देशों को ओवरलैप करके (उदाहरण के लिए: तुलना और शाखा को बिना शर्त शाखा में बदलना या वैकल्पिक रूप से 'एनओपी (कोड)')।

IBM सिस्टम/360 आर्किटेक्चर में, और इसके उत्तराधिकारी z/आर्किटेक्चर तक, एक EXECUTE (EX) निर्देश तार्किक रूप से अपने लक्षित निर्देश के दूसरे बाइट को सामान्य उद्देश्य रजिस्टर 1 के लो-ऑर्डर 8 बिट्स के साथ ओवरले करता है। यह स्व-संशोधन का प्रभाव प्रदान करता है, हालांकि भंडारण में वास्तविक निर्देश परिवर्तित नहीं होता है।

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

विधानसभा भाषा
असेंबली भाषा का उपयोग करते समय लागू करने के लिए स्व-संशोधित कोड काफी सरल है। निर्देशों को स्मृति में गतिशील रूप से बनाया जा सकता है (या फिर गैर-संरक्षित प्रोग्राम स्टोरेज में मौजूदा कोड पर ओवरलेड किया जा सकता है), अनुक्रम में एक मानक कंपाइलर वस्तु कोड के रूप में उत्पन्न हो सकता है। आधुनिक प्रोसेसर के साथ, सीपीयू कैश पर अनपेक्षित दुष्प्रभाव (कंप्यूटर विज्ञान) हो सकते हैं जिन पर विचार किया जाना चाहिए। इस विधि का प्रयोग अक्सर 'पहली बार' स्थितियों के परीक्षण के लिए किया जाता था, जैसा कि आईबीएम/360 असेंबलर (कंप्यूटर प्रोग्रामिंग) उदाहरण में उपयुक्त रूप से टिप्पणी की गई है। यह (N×1)-1 द्वारा निर्देश पथ की लंबाई को कम करने के लिए निर्देश ओवरले का उपयोग करता है जहां N फ़ाइल पर रिकॉर्ड्स की संख्या है (-1 ओवरले करने के लिए कम्प्यूटेशनल ओवरहेड है)।

SUBRTN NOP यहाँ पहली बार खुला? * NOP x'4700' है OI SUBRTN+1,X'F0' हाँ, NOP को सशर्त शाखा में बदलें (47F0...) इनपुट खोलें और इनपुट फ़ाइल खोलें क्योंकि यह पहली बार है खुला इनपुट प्राप्त करें सामान्य प्रसंस्करण यहां शुरू होता है ...

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

नीचे Zilog Z80 सभा की भाषा का एक उदाहरण दिया गया है। कोड वृद्धि बी को सीमा [0,5] में दर्ज करती है। सीपी तुलना निर्देश प्रत्येक लूप पर संशोधित किया गया है। <वाक्यविन्यास प्रकाश लैंग = nasm>

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

व्याख्या की गई भाषाओं के साथ, मशीन कोड स्रोत पाठ है और ऑन-द-फ्लाई संपादित करने के लिए अतिसंवेदनशील हो सकता है: SNOBOL में निष्पादित किए जा रहे स्रोत कथन पाठ सरणी के तत्व हैं। अन्य भाषाएँ, जैसे कि पर्ल और पायथन (प्रोग्रामिंग भाषा), प्रोग्राम को रन-टाइम पर नया कोड बनाने और एक eval फ़ंक्शन का उपयोग करके इसे निष्पादित करने की अनुमति देती हैं, लेकिन मौजूदा कोड को उत्परिवर्तित होने की अनुमति नहीं देती हैं। संशोधन का भ्रम (भले ही कोई मशीन कोड वास्तव में अधिलेखित नहीं किया जा रहा है) फ़ंक्शन पॉइंटर्स को संशोधित करके प्राप्त किया जाता है, जैसा कि इस जावास्क्रिप्ट उदाहरण में है: <वाक्यविन्यास प्रकाश लैंग = जावास्क्रिप्ट> var f = फ़ंक्शन (x) {वापसी x + 1};

// f को एक नई परिभाषा दें: f = नया फंक्शन ('x', 'वापसी x + 2');  लिस्प मैक्रोज़ प्रोग्राम कोड वाले स्ट्रिंग को पार्स किए बिना रनटाइम कोड जनरेशन की भी अनुमति देते हैं।

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

यौगिक संशोधन
कई विंडोज़ के आगमन से पहले, कमांड-लाइन सिस्टम एक रनिंग कमांड स्क्रिप्ट के संशोधन से जुड़े मेनू सिस्टम की पेशकश कर सकता है। मान लीजिए एक DOS स्क्रिप्ट (या बैच) फ़ाइल MENU.BAT में निम्नलिखित शामिल हैं:
 * प्रारंभ

शोमेनू.EXE कमांड लाइन से MENU.BAT की शुरूआत पर, SHOWMENU एक ऑन-स्क्रीन मेनू प्रस्तुत करता है, जिसमें संभावित मदद की जानकारी, उदाहरण के उपयोग आदि शामिल हैं। आखिरकार उपयोगकर्ता एक चयन करता है जिसके लिए SOMENAME कमांड की आवश्यकता होती है: SHOWMENU फ़ाइल को फिर से लिखने के बाद बाहर निकलता है MENU.BAT को शामिल करने के लिए :प्रारंभ शोमेनू.EXE कॉल समनाम.बैट जाओ शुरू करो क्योंकि DOS कमांड दुभाषिया एक स्क्रिप्ट फ़ाइल को संकलित नहीं करता है और फिर इसे निष्पादित करता है, न ही यह निष्पादन शुरू करने से पहले पूरी फ़ाइल को मेमोरी में पढ़ता है, और न ही रिकॉर्ड बफर की सामग्री पर भरोसा करता है, जब SHOWMENU बाहर निकलता है, कमांड दुभाषिया एक नया खोजता है निष्पादित करने के लिए आदेश (यह स्क्रिप्ट फ़ाइल SOMENAME को एक निर्देशिका स्थान में और SHOWMENU के लिए ज्ञात प्रोटोकॉल के माध्यम से शुरू करना है), और उस आदेश के पूरा होने के बाद, यह स्क्रिप्ट फ़ाइल की शुरुआत में वापस जाता है और अगले चयन के लिए तैयार SHOWMENU को पुनः सक्रिय करता है. क्या मेनू विकल्प को छोड़ना चाहिए, फ़ाइल को उसकी मूल स्थिति में फिर से लिखा जाएगा। हालांकि इस प्रारंभिक स्थिति का लेबल के लिए कोई उपयोग नहीं है, यह, या टेक्स्ट की समतुल्य मात्रा की आवश्यकता है, क्योंकि डॉस कमांड दुभाषिया अगले कमांड की बाइट स्थिति को याद करता है जब इसे अगले कमांड को शुरू करना होता है, इस प्रकार फिर से लिखी गई फ़ाइल वास्तव में अगली कमांड की शुरुआत होने के लिए अगले कमांड स्टार्ट पॉइंट के लिए संरेखण बनाए रखना चाहिए।

एक मेनू सिस्टम (और संभावित सहायक सुविधाओं) की सुविधा के अलावा, इस योजना का अर्थ है कि SHOWMENU.EXE सिस्टम स्मृति में नहीं है जब चयनित आदेश सक्रिय होता है, स्मृति सीमित होने पर एक महत्वपूर्ण लाभ होता है।

नियंत्रण तालिका
नियंत्रण तालिका दुभाषिया (कंप्यूटिंग) को, एक अर्थ में, तालिका प्रविष्टियों से निकाले गए डेटा मानों द्वारा 'स्व-संशोधित' माना जा सकता है (बजाय फॉर्म के सशर्त (प्रोग्रामिंग) एस में विशेष रूप से हाथ कोडिंग के बजाय IF inputx = 'yyy ')।

चैनल कार्यक्रम
कुछ IBM पहुँच विधियाँ परंपरागत रूप से स्व-संशोधित चैनल I/O#चैनल प्रोग्राम का उपयोग करती हैं, जहाँ एक मान, जैसे डिस्क पता, एक चैनल प्रोग्राम द्वारा संदर्भित क्षेत्र में पढ़ा जाता है, जहाँ इसका उपयोग बाद के चैनल कमांड द्वारा एक्सेस करने के लिए किया जाता है। डिस्क।

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

उपयोग
स्व-संशोधित कोड का उपयोग विभिन्न उद्देश्यों के लिए किया जा सकता है:


 * राज्य-निर्भर लूप का अर्ध-स्वचालित अनुकूलन (कंप्यूटर विज्ञान)।
 * लोड वातावरण के आधार पर गति के लिए गतिशील इन-प्लेस कोड अनुकूलन।  * रन टाइम (प्रोग्राम जीवनचक्र चरण) | रन-टाइम कोड जनरेशन, या रनटाइम या लोडटाइम में एल्गोरिदम की विशेषज्ञता (जो लोकप्रिय है, उदाहरण के लिए, रीयल-टाइम ग्राफ़िक्स के डोमेन में) जैसे सामान्य सॉर्ट यूटिलिटी - कोड तैयार करना एक विशिष्ट मंगलाचरण में वर्णित प्रमुख तुलना करने के लिए।
 * किसी वस्तु (कंप्यूटर विज्ञान) की इनलाइन फ़ंक्शन स्थिति को बदलना, या क्लोजर (कंप्यूटर विज्ञान) के उच्च-स्तरीय निर्माण का अनुकरण करना।
 * सबरूटीन (पॉइंटर (कंप्यूटर प्रोग्रामिंग)) एड्रेस कॉलिंग की पैचिंग, आमतौर पर गतिशील पुस्तकालय के लोड / इनिशियलाइज़ेशन समय पर की जाती है, या फिर प्रत्येक मंगलाचरण पर, सबरूटीन के आंतरिक संदर्भों को इसके मापदंडों पर पैच करना ताकि उनके वास्तविक पते (यानी अप्रत्यक्ष) का उपयोग किया जा सके स्व-संशोधन)।
 * विकासवादी कंप्यूटिंग सिस्टम जैसे तंत्रिका विकास, जेनेटिक प्रोग्रामिंग और अन्य विकासवादी एल्गोरिदम।
 * रिवर्स इंजीनियरिंग को रोकने के लिए कोड को छिपाना (एक disassembler या डिबगर के उपयोग से) या वायरस/स्पाइवेयर स्कैनिंग सॉफ्टवेयर और इसी तरह की पहचान से बचने के लिए।
 * सभी कार्यक्रमों और डेटा को मिटाने, या जलाकर निशाल बनाना हार्डवेयर या रैम परीक्षण करने के लिए, दोहराए जाने वाले ऑपकोड के रोलिंग पैटर्न के साथ 100% मेमोरी (कुछ आर्किटेक्चर में) भरना। * निष्पादन योग्य संपीड़न कोड को डिकम्प्रेस किया जाना चाहिए और रनटाइम पर निष्पादित किया जाना चाहिए, उदाहरण के लिए, जब मेमोरी या डिस्क स्थान सीमित हो।
 * कुछ बहुत सीमित निर्देश सेट कुछ कार्यों को करने के लिए स्व-संशोधित कोड का उपयोग करने के अलावा कोई विकल्प नहीं छोड़ते हैं। उदाहरण के लिए, एक निर्देश सेट कंप्यूटर (OISC) मशीन जो केवल घटाव-और-शाखा-अगर-नकारात्मक निर्देश का उपयोग करती है, एक अप्रत्यक्ष प्रतिलिपि नहीं कर सकती है (सी (प्रोग्रामिंग भाषा) में *a = **b के समतुल्य जैसा कुछ) ) स्व-संशोधित कोड का उपयोग किए बिना।
 * बूटिंग। प्रारंभिक माइक्रो कंप्यूटर अक्सर अपने बूटलोडर में स्व-संशोधित कोड का उपयोग करते थे। चूंकि बूटलोडर को प्रत्येक पावर-ऑन पर फ्रंट पैनल के माध्यम से कुंजीबद्ध किया गया था, इससे कोई फर्क नहीं पड़ता कि बूटलोडर ने खुद को संशोधित किया है या नहीं। हालाँकि, आज भी कई बूटस्ट्रैप लोडर स्व-स्थानांतरित हैं, और कुछ स्व-संशोधित भी हैं। * दोष-सहिष्णुता के लिए निर्देश बदलना।

राज्य-निर्भर लूप का अनुकूलन
स्यूडोकोड उदाहरण:

एन बार दोहराएं { यदि राज्य 1 है ए को एक करके बढ़ाएं वरना A को एक करके घटाएं ए के साथ कुछ करो }

स्व-संशोधित कोड, इस मामले में, केवल इस तरह से लूप को फिर से लिखने का मामला होगा:

एन बार दोहराएं { ए को एक करके बढ़ाएं ए के साथ कुछ करो जब STATE को स्विच करना होगा { उपरोक्त ओपकोड वृद्धि को कम करने के लिए ओपकोड से बदलें, या इसके विपरीत } }

ध्यान दें कि ओपकोड के दो-राज्य प्रतिस्थापन को 'xor var at address with value opcodeOf(Inc) xor opcodeOf(dec)' के रूप में आसानी से लिखा जा सकता है।

इस समाधान को चुनना के मूल्य पर निर्भर होना चाहिए N और राज्य बदलने की आवृत्ति।

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

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

स्व-संशोधित कोड का उपयोग कभी-कभी उन प्रोग्रामों द्वारा भी किया जाता है जो अपनी उपस्थिति प्रकट नहीं करना चाहते हैं, जैसे कि कंप्यूटर वायरस और कुछ app। स्व-संशोधित कोड का उपयोग करने वाले वायरस और शेलकोड ज्यादातर बहुरूपी कोड के संयोजन में ऐसा करते हैं। बफर ओवरफ्लो जैसे कुछ हमलों में रनिंग कोड के एक टुकड़े को संशोधित करना भी उपयोग किया जाता है।

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

ऑपरेटिंग सिस्टम
लिनक्स कर्नेल विशेष रूप से स्व-संशोधित कोड का व्यापक उपयोग करता है; यह प्रत्येक प्रमुख आर्किटेक्चर (जैसे IA-32, x86-64, 32-बिट ARM आर्किटेक्चर परिवार, ARM64 ...) के लिए एक सिंगल बाइनरी इमेज वितरित करने में सक्षम होने के लिए बूट के दौरान मेमोरी में कर्नेल कोड को एडाप्ट करते समय ऐसा करता है। विशिष्ट CPU मॉडल का पता चला, उदा। नए CPU निर्देशों का लाभ उठाने या हार्डवेयर बग के आसपास काम करने में सक्षम होने के लिए।

भले ही, मेटा-स्तर पर, प्रोग्राम अभी भी कहीं और संग्रहीत डेटा को बदलकर अपने स्वयं के व्यवहार को संशोधित कर सकते हैं (मेटाप्रोग्रामिंग देखें) या बहुरूपता प्रकार के उपयोग के माध्यम से।

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

पॉल हैबरली और ब्रूस कर्ष ने कम विकास लागत के पक्ष में स्व-संशोधित कोड के हाशिए पर और सामान्य रूप से अनुकूलन पर आपत्ति जताई है।

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

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

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

सुरक्षा मुद्दे
स्व-संशोधित कोड के सुरक्षा निहितार्थों के कारण, सभी प्रमुख ऑपरेटिंग सिस्टम ऐसी कमजोरियों को दूर करने के लिए सावधान हैं, क्योंकि वे ज्ञात हो जाते हैं। चिंता आमतौर पर यह नहीं है कि कार्यक्रम जानबूझकर खुद को संशोधित करेंगे, लेकिन यह कि वे एक शोषण (कंप्यूटर सुरक्षा) द्वारा दुर्भावनापूर्ण रूप से बदल सकते हैं।

दुर्भावनापूर्ण कोड संशोधन को रोकने के लिए एक तंत्र एक ऑपरेटिंग सिस्टम सुविधा है जिसे W^X (लिखने के लिए xor निष्पादित करने के लिए) कहा जाता है। यह तंत्र किसी प्रोग्राम को स्मृति के किसी भी पृष्ठ को लिखने योग्य और निष्पादन योग्य बनाने से रोकता है। कुछ प्रणालियाँ लिखने योग्य पृष्ठ को कभी भी निष्पादन योग्य बनने से रोकती हैं, भले ही लिखने की अनुमति हटा दी जाए। अन्य प्रणालियाँ एक प्रकार का 'पिछले दरवाजे (कंप्यूटिंग)' प्रदान करती हैं, जिससे मेमोरी के एक पृष्ठ के कई मैपिंग को अलग-अलग अनुमतियाँ मिलती हैं। W^X को बायपास करने का एक अपेक्षाकृत पोर्टेबल तरीका सभी अनुमतियों के साथ एक फ़ाइल बनाना है, फिर फ़ाइल को मेमोरी में दो बार मैप करना है। लिनक्स पर, फ़ाइल बनाने की आवश्यकता के बिना निष्पादन योग्य साझा मेमोरी प्राप्त करने के लिए एक गैर-दस्तावेजी SysV साझा मेमोरी फ़्लैग का उपयोग कर सकता है।

लाभ

 * प्रोग्राम के निष्पादन के लिए तेज़ पथ स्थापित किए जा सकते हैं, कुछ अन्यथा दोहराई जाने वाली सशर्त शाखाओं को कम किया जा सकता है।
 * स्व-संशोधित कोड एल्गोरिथम दक्षता में सुधार कर सकता है।

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

स्व-संशोधित कोड को कोड के रूप में फिर से लिखा जा सकता है जो परीक्षण के परिणाम के आधार पर एक ध्वज (कंप्यूटिंग) और वैकल्पिक अनुक्रमों की शाखाओं का परीक्षण करता है, लेकिन स्व-संशोधित कोड आमतौर पर तेजी से चलता है।

स्व-संशोधित कोड कोड के प्रमाणीकरण के साथ संघर्ष करता है और नीतियों के अपवादों की आवश्यकता हो सकती है कि सिस्टम पर चल रहे सभी कोड पर हस्ताक्षर किए जाएं।

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

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

स्व-संशोधित कोड का उपयोग कुछ वातावरणों में बिल्कुल नहीं किया जा सकता है, जैसे कि निम्नलिखित:
 * सख्त W^X सुरक्षा वाले ऑपरेटिंग सिस्टम के तहत चलने वाले एप्लिकेशन सॉफ़्टवेयर उन पृष्ठों में निर्देशों को निष्पादित नहीं कर सकते हैं जिन्हें लिखने की अनुमति है - केवल ऑपरेटिंग सिस्टम को मेमोरी में निर्देश लिखने और बाद में उन निर्देशों को निष्पादित करने की अनुमति है।
 * कई हार्वर्ड वास्तुकला microcontroller पढ़ने-लिखने की स्मृति में निर्देशों को निष्पादित नहीं कर सकते हैं, लेकिन स्मृति में केवल निर्देश हैं कि यह रोम या गैर-स्वयं-प्रोग्राम करने योग्य फ्लैश मेमोरी को नहीं लिख सकता है।
 * एक मल्टीथ्रेडेड एप्लिकेशन में स्व-संशोधित कोड के एक ही खंड को निष्पादित करने वाले कई थ्रेड हो सकते हैं, जिसके परिणामस्वरूप गणना त्रुटियां और एप्लिकेशन विफलताएं हो सकती हैं।

यह भी देखें

 * ओवरलैपिंग कोड
 * बहुरूपी कोड
 * बहुरूपी इंजन
 * लगातार डेटा संरचना
 * एएआरडी कोड
 * एल्गोरिथम दक्षता
 * निष्कलंक कथन
 * आईबीएम 1130#कोड संशोधन (उदाहरण)
 * बस-इन-टाइम संकलन: यह तकनीक अक्सर उपयोगकर्ताओं को बिना किसी नुकसान के स्व-संशोधित कोड (स्मृति आकार को छोड़कर) के कई लाभ दे सकती है।
 * गतिशील मृत कोड उन्मूलन
 * समजातीयता
 * पीसीएएसटीएल
 * क्विन (कंप्यूटिंग)
 * स्व-प्रतिकृति
 * प्रतिबिंब (कंप्यूटर विज्ञान)
 * बंदर का पैच: रनटाइम कोड में एक संशोधन जो प्रोग्राम के मूल स्रोत कोड को प्रभावित नहीं करता है
 * एक्स्टेंसिबल प्रोग्रामिंग: एक प्रोग्रामिंग प्रतिमान जिसमें एक प्रोग्रामिंग भाषा अपने सिंटैक्स को संशोधित कर सकती है
 * स्व-संशोधित कंप्यूटर वायरस
 * स्व-होस्टिंग (संकलक)संकलक)|सेल्फ-होस्टिंग
 * कंपाइलर बूटस्ट्रैपिंग
 * पैच करने योग्य माइक्रोकोड

बाहरी संबंध

 * Using self-modifying code under Linux
 * Self-modifying C code
 * Certified Self-Modifying Code