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

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

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

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

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

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

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

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

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

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

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

वैकल्पिक कोड में हर बार निशान का परीक्षण करना सम्मिलित हो सकता है। बिना शर्त शाखा तुलना निर्देश की तुलना में थोड़ी तेज है, साथ ही समग्र पथ की लंबाई को कम करती है। स्मृति सुरक्षा में रहने वाले क्रमानुदेशों के लिए बाद के संचालन प्रणाली में इस तकनीक का उपयोग नहीं किया जा सकता था और इसके स्थान पर संकेतक को उपनित्यक्रम में बदलने का उपयोग किया जाएगा। संकेतक गतिशील भंडारण में रहता है और ओपेन को उपमार्ग करने के लिए पहली स्वीकृति के बाद इच्छानुसार बदला जा सकता है।

नीचे ज़ाइलॉग Z80 समुच्चय भाषा का एक उदाहरण दिया गया है। कोड वृद्धि B को सीमा [0,5] में दर्ज करती है। CP तुलना निर्देश प्रत्येक परिपथ पर संशोधित किया गया है।

<वाक्यविन्यास प्रकाश लैंग = nasm>

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

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

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

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

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

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

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

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

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

इतिहास
जनवरी 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