क्या रनटाइम कोड संशोधन के कोई स्मार्ट मामले हैं?


119

क्या आप रनटाइम कोड संशोधन के लिए किसी भी वैध (स्मार्ट) उपयोगों के बारे में सोच सकते हैं (प्रोग्राम को संशोधित करते हुए यह रनटाइम में खुद का कोड है)?

आधुनिक ऑपरेटिंग सिस्टम उन कार्यक्रमों पर ध्यान केंद्रित करते हैं जो ऐसा करते हैं क्योंकि इस तकनीक का पता लगाने से बचने के लिए वायरस द्वारा उपयोग किया गया है।

सभी मैं सोच सकता हूँ कि रनटाइम ऑप्टिमाइज़ेशन कुछ ऐसा है जो रनटाइम के दौरान कुछ जानकर कुछ कोड को हटा देगा या जोड़ देगा, जिसे कंप्लीट टाइम पर नहीं जाना जा सकता है।


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

7
@Alexandre: एक बार की मनमानी संख्या को निष्पादित करने के बावजूद संशोधनों को शायद ही कभी (उदाहरण के लिए एक बार, दो बार) भिन्न करने के लिए स्व-संशोधन कोड के लिए यह आम है, इसलिए एक बार की लागत नगण्य हो सकती है।
टोनी डेलरो

7
यह सुनिश्चित नहीं है कि इसे C या C ++ क्यों टैग किया गया है, क्योंकि न तो इसके लिए कोई तंत्र है।
MSalters

4
@Alexandre: Microsoft Office को वास्तव में ऐसा करने के लिए जाना जाता है। परिणाम के रूप में (?) सभी x86 प्रोसेसर को स्व-संशोधित कोड के लिए उत्कृष्ट समर्थन है। अन्य प्रोसेसर पर महंगा तुल्यकालन आवश्यक है जो पूरी चीज को कम आकर्षक बनाता है।
मैकी मेसर

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

जवाबों:


117

कोड संशोधन के लिए कई वैध मामले हैं। रन टाइम पर कोड बनाना निम्न के लिए उपयोगी हो सकता है:

  • कुछ आभासी मशीनें प्रदर्शन को बेहतर बनाने के लिए जेआईटी संकलन का उपयोग करती हैं ।
  • कंप्यूटर ग्राफिक्स में मक्खी पर विशेष कार्य उत्पन्न करना लंबे समय से सामान्य है। उदाहरण के तौर पर देखें कि रॉब पाइक और बार्ट लोकेन्थी और जॉन रेसर हार्डवेयर सॉफ्टवेयर ट्रेडऑफ़्स फॉर द बिटमैप ग्राफिक्स ऑन द ब्लिट (1984) या इस पोस्टिंग (2006) में क्रिस लॅटनर द्वारा Apple के एलएलवीएम के उपयोग के लिए उनके ओपेनलाइन स्टैक में रनटाइम कोड स्पेशलाइजेशन।
  • कुछ मामलों में सॉफ्टवेयर ट्रम्पोलिन नामक एक तकनीक का समर्थन करता है जिसमें स्टैक (या अन्य स्थान) पर कोड की गतिशील रचना शामिल होती है। उदाहरण जीसीसी के नेस्टेड कार्य और कुछ यूनियनों के सिग्नल तंत्र हैं

कभी-कभी कोड को रनटाइम पर कोड में अनुवादित किया जाता है (इसे डायनेमिक बाइनरी ट्रांसलेशन कहा जाता है ):

  • Apple के रोसेटा जैसे इम्यूलेटर इस तकनीक का उपयोग अनुकरण को गति देने के लिए करते हैं। एक अन्य उदाहरण ट्रांसमीटा का कोड मॉर्फिंग सॉफ्टवेयर है
  • Valgrind या Pin जैसे अत्याधुनिक डिबगर्स और प्रोफाइलर इसे अपने कोड को इंस्ट्रूमेंट करने के लिए उपयोग करते हैं जबकि इसे निष्पादित किया जा रहा है।
  • X86 इंस्ट्रक्शन सेट में एक्सटेंशन किए जाने से पहले, VMWare जैसे वर्चुअलाइजेशन सॉफ्टवेयर वर्चुअल मशीनों के अंदर सीधे विशेषाधिकार प्राप्त x86 कोड नहीं चला सकता है। इसके बजाय इसे मक्खी पर किसी भी समस्याग्रस्त निर्देशों का अधिक उपयुक्त कस्टम कोड में अनुवाद करना था ।

निर्देश संशोधन की सीमाओं के आसपास काम करने के लिए कोड संशोधन का उपयोग किया जा सकता है:

  • एक समय था (बहुत पहले, मुझे पता है), जब कंप्यूटर में एक सबरूटीन से लौटने या अप्रत्यक्ष रूप से स्मृति को संबोधित करने के लिए कोई निर्देश नहीं था। सेल्फ मॉडिफाई कोड सबरूटीन्स, पॉइंटर्स और एरेज़ को लागू करने का एकमात्र तरीका था ।

कोड संशोधन के अधिक मामले:

  • कई डीबगर्स ब्रेकप्वाइंट को लागू करने के लिए निर्देशों को प्रतिस्थापित करते हैं ।
  • कुछ डायनामिक लिंकर्स रनटाइम पर कोड को संशोधित करते हैं। यह आलेख Windows DLL के रनटाइम स्थानांतरण पर कुछ पृष्ठभूमि प्रदान करता है, जो प्रभावी रूप से कोड संशोधन का एक रूप है।

10
यह सूची कोड के उदाहरणों को रोकती है, जो स्वयं को संशोधित करता है, और कोड जो लिंकर्स की तरह अन्य कोड को संशोधित करता है।
एशेल्ली

6
@AShelly: यदि आप डायनेमिक लिंकर / लोडर को कोड का हिस्सा मानते हैं, तो यह स्वयं को संशोधित करता है। वे एक ही पते के स्थान पर रहते हैं, इसलिए मुझे लगता है कि यह एक वैध दृष्टिकोण है।
मैके 23

1
ठीक है, सूची अब प्रोग्राम और सिस्टम सॉफ्टवेयर के बीच अंतर करती है। मुझे लगता है कि इसका मतलब बनता है। अंत में कोई भी वर्गीकरण बहस का मुद्दा है। यह सब नीचे आता है जो आप प्रोग्राम (या कोड) की परिभाषा में शामिल करते हैं।
मैकी मेस्टर

35

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


5
एक दिलचस्प रीड माइकल एब्रैश का डीडीजे पर 3-पार्ट पिक्सोमेटिक लेख है: drdobbs.com/ RGBecture-and-design/ 184405765 , drdobbs.com/184405807 , drdobbs -184405848 । दूसरा लिंक (Part2) पिक्सेल पाइपलाइन के लिए Pixomatic कोड वेल्डर के बारे में बात करता है।
typo.pl

1
विषय पर एक बहुत अच्छा लेख। 1984 से, लेकिन अभी भी एक अच्छा पढ़ा: रोब पाइक और बार्ट लोकेन्थी और जॉन रेसर। बिट पर ग्राफिक्स बिटमैप ग्राफिक्स के लिए हार्डवेयर सॉफ्टवेयर ट्रेडऑफ़
मैकी मेसर

5
चार्ल्स पेट्ज़ोल्ड "ब्यूटीफुल कोड" नामक पुस्तक में इस तरह का एक उदाहरण बताते हैं: amazon.com/Beautiful-Code-Leading-Programmers-P Practice
Nawaz

3
यह उत्तर कोड जनरेट करने के बारे में बात करता है , लेकिन सवाल कोड को संशोधित करने के बारे में पूछ रहा है ...
टिमवी

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

23

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


काफी उचित। क्या इस तकनीक का कोई उपयोग है? यह खतरनाक लगता है।
अलेक्जेंड्रे सी।

4
@ अलेक्सांड्रे सी।: अगर मुझे सही कई रनटाइम लाइब्रेरीज़ (C, पास्कल, ...) याद हैं, तो इंटरकॉल कॉल करने के लिए DOS बार एक फंक्शन करना पड़ता था। जैसे कि फ़ंक्शंस में बाधा नंबर मिलता है, पैरामीटर के रूप में आपको ऐसे फ़ंक्शन की आपूर्ति करनी होती है (यदि संख्या स्थिर थी तो आप सही कोड उत्पन्न कर सकते थे, लेकिन इसकी गारंटी नहीं थी)। और सभी पुस्तकालयों ने इसे स्व-कोडिंग कोड के साथ लागू किया।
flolo

आप कोड संशोधन के बिना इसे करने के लिए एक स्विच केस का उपयोग कर सकते हैं। डाउनसाइज़ यह है कि आउटपुट कोड बड़ा होगा
phuclv

17

कुछ संकलक ने इसका उपयोग स्थैतिक चर आरंभीकरण के लिए किया, बाद की पहुँच के लिए एक सशर्त लागत से बचा। दूसरे शब्दों में वे उस कोड को "केवल एक बार क्रियान्वित करते हैं" उस कोड को बिना किसी ऑप्स के ओवरराइट करके लागू करते हैं।


1
बहुत अच्छा है, खासकर अगर यह म्यूटेक्स लॉक / अनलॉक से बच रहा है।
टोनी डेलरॉय

2
वास्तव में? रॉम-आधारित कोड, या राइट-प्रोटेक्टेड कोड सेगमेंट में निष्पादित कोड के लिए यह कैसे होता है?
इरा बैक्सटर

1
@ इरा बैक्सटर: कोई भी कंपाइलर जो रिलोकेबल कोड का उत्सर्जन करता है, वह जानता है कि कोड सेगमेंट राइट करने योग्य है, कम से कम स्टार्टअप के दौरान। तो बयान "कुछ संकलक ने इसका इस्तेमाल किया" अभी भी संभव है।
MSalters

17

कई मामले हैं:

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

कुछ OS 'सुरक्षा मॉडल का मतलब है कि स्व-संशोधित कोड रूट / व्यवस्थापक विशेषाधिकारों के बिना नहीं चल सकता है, जिससे यह सामान्य प्रयोजन के उपयोग के लिए अव्यावहारिक हो जाता है।

विकिपीडिया से:

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

ऐसे OSes पर, यहां तक ​​कि जावा VM जैसे कार्यक्रमों को अपने JIT कोड को निष्पादित करने के लिए रूट / एडमिन विशेषाधिकारों की आवश्यकता होती है। ( अधिक जानकारी के लिए http://en.wikipedia.org/wiki/W%5EX देखें )


2
आपको स्व-संशोधित कोड के लिए रूट विशेषाधिकारों की आवश्यकता नहीं है। न ही जावा वी.एम.
मैके मेस्टर

मुझे नहीं पता था कि कुछ OS इतने सख्त थे। लेकिन यह निश्चित रूप से कुछ अनुप्रयोगों में समझ में आता है। मुझे आश्चर्य है कि अगर जावा को रूट विशेषाधिकारों के साथ निष्पादित करने से वास्तव में सुरक्षा में वृद्धि होती है ...
मैकी मेसर

@ मैके: मुझे लगता है कि इसे कम करना होगा, लेकिन शायद यह कुछ मेमोरी अनुमतियों को सेट कर सकता है और फिर प्रभावी यूआईडी को कुछ उपयोगकर्ता खाते में बदल सकता है ...?
टोनी डेलरॉय

हां, मैं उनसे उम्मीद करूंगा कि सख्त सुरक्षा मॉडल के साथ अनुमति देने के लिए उनके पास एक महीन दाने वाला तंत्र होगा।
मैकी मेसर

15

संश्लेषण ओएस मूल रूप से आंशिक रूप से API कॉल के संबंध में अपने कार्यक्रम का मूल्यांकन किया है, और परिणाम के साथ ओएस कोड बदल दिया। मुख्य लाभ यह है कि बहुत सारी एरर चेकिंग चली गई (क्योंकि अगर आपका प्रोग्राम OS को कुछ बेवकूफ बनाने के लिए नहीं कह रहा है, तो उसे चेक करने की आवश्यकता नहीं है)।

हां, यह रनटाइम अनुकूलन का एक उदाहरण है।


मैं बिंदु को देखने में विफल हूं। अगर कहें कि ओएस द्वारा एक सिस्टम कॉल को मना किया जा रहा है, तो आपको संभवतः एक त्रुटि वापस मिल जाएगी जिसे आपको कोड में जांचना होगा, क्या आप नहीं करेंगे? यह मुझे लगता है कि एक त्रुटि कोड को वापस करने के बजाय निष्पादन योग्य को संशोधित करना एक तरह से अतिरंजना है।
अलेक्जेंड्रे सी।

@Alexandre C.: आप इस तरह अशक्त सूचक जाँच को समाप्त करने में सक्षम हो सकते हैं। कॉल करने वाले के लिए अक्सर यह स्पष्ट रूप से स्पष्ट होता है कि एक तर्क मान्य है।
MSALERS 7

@ अलेक्सांड्रे: आप लिंक पर शोध पढ़ सकते हैं। मुझे लगता है कि उन्हें काफी प्रभावशाली स्पीडअप मिला, और यह बात होगी: -}
इरा बैक्सटर

2
अपेक्षाकृत तुच्छ और गैर I / O- बंधे syscalls के लिए, बचत महत्वपूर्ण है। उदाहरण के लिए, यदि आप यूनिक्स के लिए एक बहरा लिख ​​रहे हैं, तो बॉयलर-प्लेट सिसकोल्स का एक गुच्छा है जो आप stdio को डिस्कनेक्ट करने के लिए करते हैं, विभिन्न सिग्नल हैंडलर सेट करते हैं, आदि। यदि आप जानते हैं कि कॉल के पैरामीटर स्थिरांक हैं, और वह परिणाम हमेशा एक ही होंगे (उदाहरण के लिए समापन स्टड), सामान्य मामले में आपके द्वारा निष्पादित कोड का एक बहुत अनावश्यक है।
मार्क बेस्सी

1
यदि आप थीसिस पढ़ते हैं, तो अध्याय 8 में डेटा अधिग्रहण के लिए गैर-तुच्छ वास्तविक समय I / O के बारे में कुछ बहुत प्रभावशाली संख्याएं हैं। यह याद रखना कि यह 1980 के दशक के मध्य की थीसिस है, और जिस मशीन पर वह चल रहा था वह 10 थी? Mhz 68000, वह सादा पुराने सॉफ्टवेयर के साथ सीडी गुणवत्ता ऑडियो डेटा (44,000 नमूने एक सेकंड) पर कब्जा करने के लिए सॉफ्टवेयर में सक्षम था । उन्होंने दावा किया कि सन वर्कस्टेशंस (क्लासिक यूनिक्स) केवल 1/5 की दर से हिट कर सकता है। मैं उन दिनों की एक पुरानी विधानसभा भाषा कोडर हूं, और यह बहुत शानदार है।
इरा बैक्सटर

9

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

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

(नोट - मैं JIT को स्व-संशोधित कोड की श्रेणी में शामिल नहीं करता। JIT कोड के एक प्रतिनिधित्व से एक वैकल्पिक प्रतिनिधित्व में अनुवाद कर रहा है, यह कोड को संशोधित नहीं कर रहा है)

सब, सब में, यह सिर्फ एक बुरा विचार है - वास्तव में साफ है, वास्तव में अस्पष्ट है, लेकिन वास्तव में बुरा है।

बेशक - यदि आपके पास 8080 और ~ 512 बाइट्स की मेमोरी है, तो आपको ऐसी प्रथाओं का सहारा लेना पड़ सकता है।


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

आधुनिक x86 सीपीयू में कागज पर आवश्यकता से अधिक मजबूत एसएमसी डिटेक्शन होता है: स्व-संशोधित कोड के साथ x86 पर बासी अनुदेश प्राप्त करना । और अधिकांश गैर- x86 सीपीयू (जैसे एआरएम) पर, अनुदेश कैश डेटा कैश के साथ सुसंगत नहीं है इसलिए नव-संग्रहीत बाइट्स को निर्देश के रूप में मज़बूती से निष्पादित किए जाने से पहले मैन्युअल फ्लश / सिंक की आवश्यकता होती है। Community.arm.com/processors/b/blog/posts/…किसी भी तरह से, एसएमसी का प्रदर्शन आधुनिक सीपीयू पर भयानक है , जब तक कि आप एक बार संशोधित नहीं करते हैं और कई बार चलते हैं।
पीटर कॉर्डेस

7

ऑपरेटिंग सिस्टम कर्नेल के दृष्टिकोण से हर जस्ट इन टाइम कंपाइलर और लिंकर रनटाइम प्रोग्राम टेक्स्ट सेल्फ मॉडिफिकेशन करता है। प्रमुख उदाहरण Google का V8 ECMA स्क्रिप्ट इंटरप्रेटर होगा।


5

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


5

आप पुराने चेस्टनट को जानते हैं कि हार्डवेयर और सॉफ़्टवेयर के बीच कोई तार्किक अंतर नहीं है ... कोई यह भी कह सकता है कि कोड और डेटा के बीच कोई तार्किक अंतर नहीं है।

स्व-संशोधित कोड क्या है? कोड जो निष्पादन स्ट्रीम में मान डालता है ताकि इसे डेटा के रूप में नहीं बल्कि एक कमांड के रूप में व्याख्या किया जा सके। यकीन है कि कार्यात्मक भाषाओं में सैद्धांतिक दृष्टिकोण है कि वास्तव में कोई अंतर नहीं है। मैं ई पर कह रहा हूँ यह समान भाषाओं के अनुमान के बिना अनिवार्य भाषाओं और संकलक / व्याख्याकारों में सीधे तरीके से कर सकता है।

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

यहां तक ​​कि सामान्य उदाहरण में भी जहां एक कंपाइलर कोड स्पेस बनाता है और एक पूरी तरह से अलग डेटा स्पेस (ढेर) को संदर्भित करता है, कोई अभी भी निष्पादन पथ को स्पष्ट रूप से बदलने के लिए डेटा को संशोधित कर सकता है।


4
कोई तार्किक अंतर नहीं, सच। हालांकि कई स्व-संशोधित एकीकृत सर्किट नहीं देखे गए हैं।
इरा बैक्सटर

@ मिच, निष्पादन पथ को बदलने वाले IMO का कोड के (स्व-) संशोधन से कोई लेना-देना नहीं है। इसके अलावा, यू जानकारी के साथ डेटा को भ्रमित करें। मैं LSE b / c में अपने उत्तर के लिए yr टिप्पणी का उत्तर नहीं दे सकता / सकती हूं, मैं वहां पर प्रतिबंध लगा दिया गया हूं, जब से फेटडे, 3-वर्ष (1,000 दिन) के लिए मेटा-एलएसई मेरे पोव में व्यक्त करने के लिए कि अमेरिकियों और ब्रिट्स के पास अंग्रेजी नहीं है।
गेन्नेडी वनिन Геннадий Ванин

4

मैंने सर्वश्रेष्ठ एल्गोरिथ्म बनाने के लिए विकासवाद का उपयोग करके एक कार्यक्रम लागू किया है। इसने डीएनए ब्लूप्रिंट को संशोधित करने के लिए स्व-संशोधित कोड का उपयोग किया।


2

एक उपयोग मामला EICAR परीक्षण फ़ाइल है जो एंटीवायरस प्रोग्राम के परीक्षण के लिए एक वैध DOS निष्पादन योग्य COM फ़ाइल है।

X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*

इसमें सेल्फ कोड संशोधन का उपयोग करना है क्योंकि निष्पादन योग्य फ़ाइल में रेंज में केवल मुद्रण योग्य / टाइप करने योग्य ASCII वर्ण [21h-60h, 7Bh-7Dh] होना चाहिए जो कि एन्कोडेबल निर्देशों की संख्या को महत्वपूर्ण रूप से सीमित करता है

विवरण यहाँ समझाया गया है


इसका उपयोग DOS में फ्लोटिंग-पॉइंट ऑपरेशन प्रेषण के लिए भी किया जाता है

कुछ संकलक CD xxx87 फ्लोटिंग-पॉइंट निर्देशों के स्थानों में 0x34-0x3B से लेकर xx के साथ उत्सर्जित करेंगे । चूंकि निर्देश के CDलिए intओपकोड है, यह 34h-3Bh में रुकावट डालेगा और x87 कोप्रोसेसर उपलब्ध नहीं होने पर सॉफ्टवेयर में उस निर्देश का अनुकरण करेगा। अन्यथा रुकावट हैंडलर उन 2 बाइट्स को बदल देगा 9B Dxताकि बाद में निष्पादन को बिना अनुकरण के सीधे x87 द्वारा नियंत्रित किया जाएगा।

MS-DOS में x87 फ्लोटिंग पॉइंट एमुलेशन का प्रोटोकॉल क्या है?


1

लिनक्स कर्नेल लोड करने योग्य कर्नेल मॉड्यूल जो बस यही काम है।

Emacs में भी यह क्षमता है और मैं हर समय इसका उपयोग करता हूं।

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


4
मुश्किल से। डायनेमिक रूप से लोड करने योग्य लाइब्रेरी होना, जो हमेशा निवासी नहीं होता है, में स्वयं-संशोधित कोड के साथ बहुत कम होता है।
Dov

1

मैं लगातार अद्यतन डेटाबेस के खिलाफ सांख्यिकीय विश्लेषण चलाता हूं। मेरे सांख्यिकीय मॉडल को हर बार उपलब्ध होने वाले नए डेटा को समायोजित करने के लिए कोड को निष्पादित और फिर से लिखा जाता है।


0

जिस परिदृश्य में इसका उपयोग किया जा सकता है वह सीखने का कार्यक्रम है। उपयोगकर्ता इनपुट के जवाब में कार्यक्रम एक नया एल्गोरिथ्म सीखता है:

  1. यह एक समान एल्गोरिथ्म के लिए मौजूदा कोड आधार को देखता है
  2. यदि कोई समान एल्गोरिथ्म कोड बेस में नहीं है, तो प्रोग्राम केवल एक नया एल्गोरिथ्म जोड़ता है
  3. यदि एक समान एल्गोरिथ्म मौजूद है, तो प्रोग्राम (शायद उपयोगकर्ता से कुछ मदद के साथ) मौजूदा एल्गोरिदम को संशोधित करता है जो पुराने उद्देश्य और नए उद्देश्य दोनों की सेवा करने में सक्षम हो

एक सवाल है कि जावा में ऐसा कैसे किया जाए: जावा कोड के स्व-संशोधन के लिए क्या संभावनाएं हैं?


-1

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

मैं किसी भी तरह से एक विशेषज्ञ नहीं हूँ, लेकिन इसके बारे में बात कर रहे लिस्प लोगों में से एक मिलता है! एक कारण है कि वे कहते हैं कि लिस्प आसपास की सबसे शक्तिशाली भाषा है और स्मार्ट लोग नहीं हैं कि वे शायद सही हैं।


2
क्या यह वास्तव में आत्म संशोधन कोड बनाता है या यह सिर्फ एक अधिक शक्तिशाली प्रीप्रोसेसर (जो कार्य उत्पन्न करेगा) है?
ब्रेंडन लॉन्ग

@Brendan: वास्तव में, लेकिन यह है preprocessing करने के लिए सही तरीका है। यहां कोई रनटाइम कोड संशोधन नहीं है।
अलेक्जेंड्रे सी।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.