রানটাইম কোড সংশোধনের কোনও স্মার্ট কেস আছে?


119

রানটাইম কোড সংশোধনের জন্য কোনও বৈধ (স্মার্ট) ব্যবহারের কথা ভাবতে পারেন (রানটাইমটিতে নিজের কোডটি সংশোধন করার প্রোগ্রাম)?

আধুনিক অপারেটিং সিস্টেমগুলি এমন প্রোগ্রামগুলিতে ভ্রান্ত মনে হচ্ছে যেহেতু সনাক্তকরণ এড়ানোর জন্য এই কৌশলটি ভাইরাস দ্বারা ব্যবহৃত হয়েছে।

আমি যা ভাবতে পারি তা হ'ল এক প্রকার রানটাইম অপ্টিমাইজেশন যা রানটাইম সময়ে কিছু জেনে কিছু কোড মুছে ফেলবে বা সংযোজন করবে যা সংকলনের সময় জানা যায় না।


8
আধুনিক স্থাপত্যগুলিতে এটি ক্যাচিং এবং নির্দেশের পাইপলাইনে খারাপভাবে হস্তক্ষেপ করে: স্ব-সংশোধনকারী কোডটি ক্যাশে সংশোধন না করে শেষ করবে, সুতরাং আপনার বাধাগুলির প্রয়োজন হবে এবং এটি সম্ভবত আপনার কোডকে ধীর করে দেবে। এবং আপনি ইতিমধ্যে নির্দেশ পাইপলাইনে থাকা কোডটি সংশোধন করতে পারবেন না। সুতরাং কোডটি চালানোর আগে স্ব-পরিমার্জনকারী কোডের উপর ভিত্তি করে যে কোনও অপ্টিমাইজেশানটি পারফরম্যান্স প্রভাবের চেয়ে আরও ভালভাবে চালানো উচিত, বলুন, একটি রানটাইম চেক।
আলেকজান্দ্রি সি

7
@ আলেকজান্দ্রে: স্ব-সংশোধনকারী কোডগুলির পক্ষে সাধারণভাবে নির্ধারিত সংখ্যকবার মৃত্যুদণ্ড কার্যকর হওয়া সত্ত্বেও (যেমন একবার, দুবার) খুব কম পরিবর্তিত হওয়া সাধারণ, তাই এক-ব্যয় ব্যয় তুচ্ছ হতে পারে।
টনি ডেলরয়

7
কেন এটি সি বা সি ++ ট্যাগ করা হয়েছে তা নিশ্চিত নন, কারণ এর জন্য উভয়েরই কোনও ব্যবস্থা নেই।
এমসাল্টারস

4
@ আলেকজান্দ্রে: মাইক্রোসফ্ট অফিস ঠিক এটি করতে পারে বলে জানা গেছে। ফলস্বরূপ (?) সমস্ত এক্স 86 প্রসেসরের স্ব-সংশোধনকারী কোডের জন্য দুর্দান্ত সমর্থন রয়েছে। অন্যান্য প্রসেসরগুলিতে ব্যয়বহুল সিঙ্ক্রোনাইজেশন প্রয়োজনীয় যা পুরো জিনিসটিকে কম আকর্ষণীয় করে তোলে।
ম্যাকি মেসার

3
@ কাওস: সাধারণত অটো আপডেট করার সফ্টওয়্যারটি নতুন অ্যাসেমব্লিগুলি এবং / অথবা এক্সিকিউটেবলগুলি ডাউনলোড করে এবং বিদ্যমানগুলি ওভাররাইট করে। তারপরে এটি সফ্টওয়্যারটি পুনরায় চালু করবে। এটি ফায়ারফক্স, অ্যাডোব ইত্যাদি করে। স্ব-সংশোধন করার অর্থ সাধারণত রানটাইম কোড চলাকালীন কিছু প্যারামিটারের কারণে অ্যাপ্লিকেশন দ্বারা মেমরিতে পুনরায় লেখা হয় এবং অগত্যা ডিস্কে অবিচল থাকে না। উদাহরণস্বরূপ, এটি পুরো কোড পাথগুলিকে অপ্টিমাইজ করতে পারে যদি এটি বুদ্ধিমানের সাথে সনাক্ত করতে পারে যে সেই পাথগুলি কার্যকর করার গতি অর্জনের জন্য এই বিশেষ রান চলাকালীন কার্যকর করা হত না।
নোটমে

উত্তর:


117

কোড পরিবর্তন করার জন্য অনেকগুলি বৈধ মামলা রয়েছে। রান সময় কোড উত্পন্ন করার জন্য দরকারী হতে পারে:

কখনও কখনও কোড রান সময় সময়ে কোড অনুবাদ করা হয় (এটি ডায়নামিক বাইনারি অনুবাদ বলা হয় ):

  • অ্যাপলের রোসটার মতো ইমুলেটররা এই কৌশলটি এমুলেশন গতি বাড়ানোর জন্য ব্যবহার করেন। আরেকটি উদাহরণ হ'ল ট্রান্সমেটার কোড মরফিং সফ্টওয়্যার
  • অবিশুদ্ধ debuggers এবং profilers মত Valgrind- র বা পিন আপনার কোড উপকরণ করার জন্য এটি ব্যবহার যখন এটি মৃত্যুদন্ড কার্যকর করা হচ্ছে।
  • X86 নির্দেশিকাতে এক্সটেনশানগুলি তৈরি করার আগে, ভিএমওয়্যারের মতো ভার্চুয়ালাইজেশন সফ্টওয়্যারটি ভার্চুয়াল মেশিনগুলির মধ্যে সুবিধাযুক্ত x86 কোডটি সরাসরি চালাতে পারে না। পরিবর্তে এটি ফ্লাইয়ের যে কোনও সমস্যাযুক্ত নির্দেশকে আরও উপযুক্ত কাস্টম কোডে অনুবাদ করতে হয়েছিল।

কোড সংশোধন নির্দেশাবলী সীমাবদ্ধতা প্রায় কাজ করতে ব্যবহার করা যেতে পারে:

  • একটি সময় ছিল (বহু আগে, আমি জানি), যখন কম্পিউটারগুলিকে সাবরোটাইন থেকে ফিরে আসার বা পরোক্ষভাবে মেমোরি সম্বোধনের কোনও নির্দেশনা ছিল না। সাবরোটাইনস, পয়েন্টার এবং অ্যারেগুলি প্রয়োগ করার একমাত্র উপায় ছিল স্ব-পরিবর্তনকারী কোড ।

কোড পরিবর্তনের আরও কেস:

  • অনেক ডিবাগার ব্রেকপয়েন্টগুলি প্রয়োগের নির্দেশাবলী প্রতিস্থাপন করে ।
  • কিছু গতিশীল লিঙ্কার রানটাইমে কোড পরিবর্তন করে। এই নিবন্ধটি উইন্ডোজ ডিএলএলগুলির রানটাইম স্থানান্তরের কিছু পটভূমি সরবরাহ করে, যা কার্যকরভাবে কোড পরিবর্তনের একটি রূপ।

10
এই তালিকাটি কোডের উদাহরণগুলি অন্তর্নিহিত বলে মনে হচ্ছে যা নিজেই পরিবর্তিত হয় এবং কোড যা লিঙ্কারগুলির মতো অন্যান্য কোডও সংশোধন করে।
আশেল্লি

6
@ শ্যাশলি: আচ্ছা, আপনি যদি গতিশীল লিঙ্কার / লোডারটিকে কোডের একটি অংশ হিসাবে বিবেচনা করেন তবে এটি নিজেই পরিবর্তন করে। তারা একই ঠিকানার জায়গায় বাস করে, তাই আমি মনে করি এটি একটি কার্যকর দৃষ্টিভঙ্গি।
ম্যাকি মেসার

1
ঠিক আছে, তালিকাটি এখন প্রোগ্রাম এবং সিস্টেম সফ্টওয়্যার মধ্যে পার্থক্য করে। আশা করি এটা বোধ গম্য। শেষ পর্যন্ত কোনও শ্রেণিবিন্যাস বিতর্কযোগ্য। প্রোগ্রামের সংজ্ঞা (বা কোড) এর মধ্যে আপনি ঠিক কী অন্তর্ভুক্ত করেছেন এটি সমস্ত কিছু নেমে আসে।
ম্যাকি মেসার

35

এটি কম্পিউটার গ্রাফিকগুলিতে করা হয়েছে, বিশেষত অপ্টিমাইজেশনের উদ্দেশ্যে সফ্টওয়্যার সরবরাহকারী। রানটাইম সময়ে অনেকগুলি পরামিতিগুলির স্থিতি পরীক্ষা করা হয় এবং রাস্টারাইজার কোডের একটি অনুকূলিত সংস্করণ উত্পন্ন হয় (সম্ভাব্যত অনেক শর্তসাপেক্ষে মুছে ফেলা হয়) যা গ্রাফিক্সের আদিমগুলি যেমন ত্রিভুজগুলি আরও দ্রুত সরবরাহ করতে দেয়।


5
একটি আকর্ষণীয় পাঠ্য হ'ল মাইকেল আবরাশের 3 ডি পারজ পিক্সোমেটিক নিবন্ধগুলি ডিডিজে : drdobbs.com/architecture- এবং- ডিজাইন / 184405765 , drdobbs.com/184405807 , drdobbs.com/184405848 । দ্বিতীয় লিঙ্ক (পার্ট 2) পিক্সেল পাইপলাইনের জন্য পিক্সোমেটিক কোড ওয়েল্ডার সম্পর্কে কথা বলে।
typo.pl

1
বিষয়টিতে একটি খুব সুন্দর নিবন্ধ। 1984 থেকে, তবে এখনও একটি ভাল পঠন: রব পাইক এবং বার্ট লোকানথি এবং জন রিজার। ব্লিটতে বিটম্যাপ গ্রাফিক্সের জন্য হার্ডওয়্যার সফ্টওয়্যার ট্রেড অফস
ম্যাকি মেসার

5
চার্লস পেটজল্ড "বিউটিফুল কোড" শিরোনামের একটি বইতে এই ধরণের একটি উদাহরণ ব্যাখ্যা করেছেন: অ্যামাজন
নওয়াজ

3
এই উত্তরটি কোড উত্পন্ন করার বিষয়ে কথা বলে , তবে প্রশ্ন কোড পরিবর্তন করার বিষয়ে জিজ্ঞাসা করছে ...
টিমভি

3
@ টিমউই - এটি কোড পরিবর্তন করেছে। এর যদি একটি বড় শৃঙ্খলা পরিচালনা করা না থাকে তবে এটি একবারের আকারটি পার্স করে এবং রেন্ডারকে পুনরায় লিখেছিল তাই এটি প্রতিবার পরীক্ষা না করে সঠিক ধরণের আকারের জন্য সেটআপ করা হয়েছিল। মজার বিষয় হল এটি এখন ওপেনক্লোল কোডের সাথে প্রচলিত - যেহেতু এটি ফ্লাইয়ে সংকলিত হয়েছে আপনি রানটাইমের সময় নির্দিষ্ট ক্ষেত্রে এটি পুনরায় লিখতে পারবেন
মার্টিন বেকেট

23

একটি বৈধ কারণ হ'ল asm নির্দেশ সেটটিতে কিছু প্রয়োজনীয় নির্দেশের অভাব রয়েছে, যা আপনি নিজেরাই তৈরি করতে পারেন । উদাহরণ: x86-তে কোনও রেজিস্টারে ভেরিয়েবলের জন্য বাধা সৃষ্টি করার কোনও উপায় নেই (উদাহরণস্বরূপ কুঠারটিতে বিঘ্নিত সংখ্যার সাথে বাধা সৃষ্টি করুন)। কেবলমাত্র অপকোডে কোড করা কনস্ট সংখ্যার অনুমতি ছিল। স্ব-সংশোধন কোডের সাহায্যে কেউ এই আচরণটি অনুকরণ করতে পারে।


যথেষ্ট ফর্সা। এই কৌশলটির কোনও ব্যবহার আছে? এটি বিপজ্জনক বলে মনে হচ্ছে।
আলেকজান্দ্রি সি

4
@ আলেকজান্দ্রি সি: আমি যদি ঠিক মনে করি অনেক রানটাইম লাইব্রেরি (সি, পাস্কাল, ...) ইন্টারপট কল করার জন্য একটি ফাংশন ডস করতে হয়েছিল। যেমন একটি ফাংশন প্যারামিটার হিসাবে অন্তরায় নম্বর পেয়েছে আপনাকে এই জাতীয় একটি ক্রিয়াকলাপ সরবরাহ করতে হয়েছিল (অবশ্যই যদি সংখ্যাটি স্থির থাকে তবে আপনি সঠিক কোড তৈরি করতে পারতেন, তবে এটির নিশ্চয়তা ছিল না)। এবং সমস্ত গ্রন্থাগার এটি স্ব-সংশোধন কোড সহ প্রয়োগ করে।
ফ্লোলো

কোড পরিবর্তন ছাড়াই এটি করতে আপনি একটি স্যুইচ কেস ব্যবহার করতে পারেন। ডাউনসাইজটি হ'ল আউটপুট কোডটি আরও বড় হবে
ফুক্লাভি

17

কিছু সংকলক স্থিতিশীল পরিবর্তনশীল আরম্ভের জন্য এটি ব্যবহার করতেন, পরবর্তী অ্যাকসেসের জন্য শর্তাধীন ব্যয় এড়িয়ে যান। অন্য কথায় তারা এই কোডটি প্রথমবার কার্যকর করা হলে নো-ওপস দিয়ে ওভাররাইট করে "এই কোডটি কেবলমাত্র একবার প্রয়োগ করুন" প্রয়োগ করে।


1
খুব সুন্দর, বিশেষত যদি এটি মুটেক্স লক্স / আনলকগুলি এড়ানো হয়।
টনি ডেলরয়

2
সত্যি? কীভাবে এটি রম-ভিত্তিক কোড, বা লিখন-সুরক্ষিত কোড বিভাগে সম্পাদিত কোডের জন্য?
ইরা বাক্সটার

1
@ ইরা বাক্সটার: যে কোনও সংকলক পুনঃস্থানযোগ্য কোডটি নির্গত করে তা কমপক্ষে স্টার্টআপের সময় কোড বিভাগটি রচনামূলক। সুতরাং "কিছু সংকলক এটি ব্যবহার করেছেন" বিবৃতিটি এখনও সম্ভব।
এমসাল্টারস

17

অনেকগুলি মামলা রয়েছে:

  • ভাইরাসগুলি সাধারণত মৃত্যুদন্ড কার্যকর করার আগে তাদের কোড "ডিওবফাসকেট" করতে স্ব-সংশোধনকারী কোড ব্যবহার করে তবে এই কৌশলটি হতাশার বিপরীত প্রকৌশল, ক্র্যাকিং এবং অযাচিত হ্যাকারিতেও কার্যকর হতে পারে
  • কিছু ক্ষেত্রে রানটাইমের সময় একটি নির্দিষ্ট পয়েন্ট থাকতে পারে (উদাহরণস্বরূপ কনফিগার ফাইলটি পড়ার সাথে সাথে) যখন জানা যায় যে - প্রক্রিয়াটির সারা জীবন ধরে - একটি নির্দিষ্ট শাখা সর্বদা বা কখনই নেওয়া হবে না: বরং অকারণে কোন শাখাটি নির্ধারণ করতে কিছু পরিবর্তনশীল পরীক্ষা করে, শাখা নির্দেশ নিজেই সেই অনুযায়ী সংশোধন করা যেতে পারে
    • উদাহরণস্বরূপ এটি পরিচিত হতে পারে যে সম্ভাব্য উত্পন্ন ধরণের শুধুমাত্র একটি হ্যান্ডেল করা হবে, যেমন ভার্চুয়াল প্রেরণকে একটি নির্দিষ্ট কল দিয়ে প্রতিস্থাপন করা যেতে পারে
    • কোন হার্ডওয়্যার উপলভ্য তা সনাক্ত করে, একটি ম্যাচিং কোড ব্যবহার করা হার্ডকোড হতে পারে
  • অপ্রয়োজনীয় কোডটি কোনও অপ-নির্দেশিক নির্দেশাবলী বা এটির উপরে লাফিয়ে প্রতিস্থাপন করা যেতে পারে, বা পরবর্তী বিট কোডটি সরাসরি জায়গায় স্থানান্তরিত করতে পারে (অবস্থান-স্বাধীন অপকডগুলি ব্যবহার করা সহজ হলে)
  • নিজস্ব ডিবাগিংয়ের সুবিধার্থে লিখিত কোড কোনও কৌশলগত অবস্থানে ডিবাগার দ্বারা প্রত্যাশিত একটি ফাঁদ / সিগন্যাল / বাধাদান নির্দেশকে ইনজেক্ট করতে পারে।
  • ব্যবহারকারী ইনপুট উপর ভিত্তি করে কিছু ভবিষ্যদ্বাণীপূর্ণ এক্সপ্রেশন একটি গ্রন্থাগার দ্বারা নেটিভ কোড মধ্যে সংকলন করা যেতে পারে
  • কিছু সাধারণ অপারেশন ইনলাইন করা যা রানটাইম অবধি দৃশ্যমান নয় (যেমন ডায়নামিকভাবে লোড করা লাইব্রেরি থেকে) ...
  • শর্তাধীন স্ব-উপকরণ / প্রোফাইলিং পদক্ষেপ যুক্ত করা adding
  • ক্র্যাকগুলি এমন লাইব্রেরি হিসাবে প্রয়োগ করা যেতে পারে যা কোডগুলি সংশোধন করে যা তাদের বোঝায় ("স্ব" রূপান্তরিত করে না ঠিক, তবে একই কৌশল এবং অনুমতি প্রয়োজন)।
  • ...

কিছু ওএস-এর সুরক্ষা মডেলগুলির অর্থ স্ব-সংশোধনকারী কোডটি রুট / অ্যাডমিন সুবিধাগুলি ছাড়াই চলতে পারে না, এটি সাধারণ-উদ্দেশ্যে ব্যবহারের জন্য ব্যবহারিক ব্যবহারকে অযৌক্তিক করে তোলে।

উইকিপিডিয়া থেকে:

কঠোর ডাব্লু এক্স সিকিউরিটি সহ একটি অপারেটিং সিস্টেমের অধীনে চলমান অ্যাপ্লিকেশন সফ্টওয়্যার যে পৃষ্ঠাগুলিতে লিখতে অনুমোদিত তা কেবলমাত্র অপারেটিং সিস্টেমকে মেমরির নির্দেশিকা লেখার অনুমতি দেয় এবং পরে সেই নির্দেশাবলী কার্যকর করতে পারে both

যেমন ওএসগুলিতে, এমনকি জাভা ভিএম এর মতো প্রোগ্রামগুলিতেও তাদের জেআইটি কোড কার্যকর করতে রুট / অ্যাডমিন সুবিধার দরকার হয়। ( আরও তথ্যের জন্য http://en.wikedia.org/wiki/W%5EX দেখুন )


2
স্ব পরিবর্তনকারী কোডের জন্য আপনার রুট সুবিধার দরকার নেই। উভয়ই জাভা ভিএম করে না।
ম্যাকি মেসার

আমি জানতাম না কিছু ওএস এত কঠোর ছিল। তবে এটি অবশ্যই কিছু অ্যাপ্লিকেশনগুলিতে অর্থবোধ করে। তবে বিস্মিত হব যে জাটকে মূল সুবিধাগুলি দিয়ে চালানো আসলে সুরক্ষা বাড়ায় ...
ম্যাকি মেসার

@ ম্যাকি: আমি মনে করি এটি অবশ্যই এটি হ্রাস করতে হবে, তবে এটি কিছু মেমরি অনুমতি নির্ধারণ করতে পারে তবে কার্যকর ইউডিটিকে কিছু ব্যবহারকারীর অ্যাকাউন্টে ফিরিয়ে দিতে পারে ...?
টনি ডেলরয়

হ্যাঁ, আমি তাদের কাছে কঠোর সুরক্ষা মডেলটির সাথে অনুমতি দেওয়ার জন্য একটি সূক্ষ্ম শস্যযুক্ত প্রক্রিয়া আশা করব।
ম্যাকি মেসার

15

সংশ্লেষণ ওএস মূলত আংশিকভাবে API কল থেকে সম্মান সঙ্গে আপনার প্রোগ্রাম মূল্যায়ন, এবং ফলাফল সঙ্গে ওএস কোড প্রতিস্থাপন করা হয়। মূল সুবিধাটি হ'ল প্রচুর ত্রুটি যাচাই বন্ধ হয়ে গেছে (কারণ যদি আপনার প্রোগ্রামটি ওএসকে বোকা কিছু করতে বলছে না, তবে এটি পরীক্ষা করার প্রয়োজন নেই)।

হ্যাঁ, এটি রানটাইম অপ্টিমাইজেশনের একটি উদাহরণ।


আমি বিন্দু দেখতে ব্যর্থ। যদি বলে যে কোনও সিস্টেম কল ওএস দ্বারা নিষিদ্ধ হতে চলেছে, আপনি সম্ভবত একটি ত্রুটি ফিরে পেয়েছেন যে আপনাকে কোডটি পরীক্ষা করতে হবে, তাই না? আমার কাছে মনে হয় ত্রুটি কোডটি ফিরিয়ে দেওয়ার পরিবর্তে এক্সিকিউটেবলকে সংশোধন করা ওভাররিঞ্জাইনিংয়ের মতো।
আলেকজান্দ্রি সি

@ আলেকজান্দ্রে সি: আপনি সেইভাবে নাল পয়েন্টার চেকগুলি অপসারণ করতে সক্ষম হতে পারেন। প্রায়শই এটি কলকারীর পক্ষে তুচ্ছভাবে স্পষ্ট যে যুক্তিটি বৈধ।
এমসাল্টারস 4:51

@ আলেকজান্দ্রে: আপনি লিঙ্কটিতে গবেষণাটি পড়তে পারেন। আমি মনে করি তারা মোটামুটি চিত্তাকর্ষক গতিবেগ পেয়েছে এবং এটি হ'ল:
Ira

2
অপেক্ষাকৃত তুচ্ছ এবং নন I / O- বাউন্ড সিস্টেলগুলির জন্য, সঞ্চয়টি উল্লেখযোগ্য। উদাহরণস্বরূপ, আপনি যদি ইউনিক্সের জন্য একটি ডিমন লিখছেন, আপনি স্টডিও সংযোগ বিচ্ছিন্ন করতে, বিভিন্ন সিগন্যাল হ্যান্ডলার ইত্যাদি সেট আপ করার জন্য বয়লার-প্লেট সিস্কেলগুলির একটি গুচ্ছ রয়েছে etc. যদি আপনি জানেন যে কোনও কলের প্যারামিটারগুলি স্থির হয় এবং ফলাফল সর্বদা এক রকম হয় (উদাহরণস্বরূপ, ক্লিনিং স্টিডিন), সাধারণ ক্ষেত্রে আপনি কার্যকর করেন এমন প্রচুর কোড অপ্রয়োজনীয়।
মার্ক বেসে

1
আপনি যদি থিসিসটি পড়ে থাকেন তবে অধ্যায় 8-এ ডেটা অর্জনের জন্য অ-তুচ্ছ রিয়েল টাইম I / O সম্পর্কে কিছু সত্যই চিত্তাকর্ষক সংখ্যা রয়েছে। মনে রাখবেন যে এটি ১৯৮০ এর দশকের মাঝামাঝি থিসিস, এবং তিনি যে মেশিনটি চালাচ্ছিলেন তা 10? মেগাহার্টজ 68000, তিনি সাফ পুরাতন সফ্টওয়্যার সহ সিডি মানের অডিও ডেটা (সেকেন্ডে 44,000 নমুনা) ক্যাপচার করতে সক্ষম হন capture তিনি দাবি করেছেন যে সান ওয়ার্কস্টেশনগুলি (ক্লাসিক ইউনিক্স) কেবল এই হারের প্রায় 1/5 ভাগকে আঘাত করতে পারে। আমি সেই দিনগুলি থেকে একটি পুরনো সংসদীয় ভাষার কোডার এবং এটি দর্শনীয়।
ইরা বাক্সার

9

বহু বছর আগে আমি কিছুটা স্ব-সংশোধনকারী কোডটি ডিবাগ করার চেষ্টা করে একটি সকালে কাটিয়েছি, একটি নির্দেশ নীচের নির্দেশের লক্ষ্য ঠিকানা পরিবর্তন করেছে, অর্থাত্ আমি একটি শাখার ঠিকানা গণনা করছি। এটি অ্যাসেম্বলি ভাষায় লেখা ছিল এবং আমি একবারে একবারে নির্দেশের মাধ্যমে প্রোগ্রামটি চালিত হয়ে নিখুঁতভাবে কাজ করি। তবে আমি যখন প্রোগ্রামটি চালিয়েছি তা ব্যর্থ হয়েছিল। অবশেষে, আমি বুঝতে পারি যে মেশিনটি মেমোরি থেকে 2 টি নির্দেশনা আনছে এবং (যেভাবে নির্দেশাবলী মেমোরিতে রেখেছিল) আমি যে নির্দেশটি পরিবর্তন করছি তা ইতিমধ্যে এনেছে এবং এইভাবে মেশিনটি সেই নির্দেশের অপরিবর্তিত (ভুল) সংস্করণ সম্পাদন করছে। অবশ্যই, যখন আমি ডিবাগিং করছিলাম, এটি একবারে কেবল একটি নির্দেশনা করছিল।

আমার বক্তব্য, স্ব-সংশোধনকারী কোড পরীক্ষা / ডিবাগ করতে অত্যন্ত বাজে হতে পারে এবং প্রায়শই মেশিনের আচরণের বিষয়ে লুকানো অনুমানগুলি থাকে (এটি হার্ডওয়্যার বা ভার্চুয়াল হোক)। তদ্ব্যতীত, সিস্টেমটি (এখন) মাল্টি-কোর মেশিনে চালিত বিভিন্ন থ্রেড / প্রক্রিয়াগুলির মধ্যে কোড পৃষ্ঠা কখনও ভাগ করতে পারে না। এটি ভার্চুয়াল মেমরি ইত্যাদির অনেক উপকারকে পরাভূত করে এটি হার্ডওয়্যার স্তরে করা শাখা অপ্টিমাইজেশানকেও বাতিল করে দেবে।

(দ্রষ্টব্য - আমি জেআইটিকে স্ব-সংশোধনকারী কোডের বিভাগে অন্তর্ভুক্ত করি না J জেআইটি কোডের একটি উপস্থাপনা থেকে বিকল্প উপস্থাপনায় অনুবাদ করছে, এটি কোডটি পরিবর্তন করছে না)

সব মিলিয়ে, এটি কেবল একটি খারাপ ধারণা - সত্যই ঝরঝরে, সত্যই অস্পষ্ট, তবে সত্যই খারাপ।

অবশ্যই - আপনার সমস্ত কিছু যদি 8080 এবং 512 ডলার মেমরির হয় তবে আপনাকে এ জাতীয় অনুশীলনগুলি অবলম্বন করতে হতে পারে।


1
আমি জানি না, ভাল এবং খারাপ এই সম্পর্কে ভাবার জন্য সঠিক বিভাগ বলে মনে হচ্ছে না। আপনি আসলে কী করছেন এবং কেন আপনি এটি করছেন তা আপনার অবশ্যই জেনে রাখা উচিত। কিন্তু প্রোগ্রামার যিনি এই কোডটি লিখেছেন সম্ভবত আপনি চান না যে প্রোগ্রামটি কী করছে। অবশ্যই আপনাকে যদি এটির মতো কোডটি ডিবাগ করতে হয় তবে এটি বাজে। তবে সেই কোডটি সম্ভবত এমনভাবে বোঝানো হয়েছিল।
ম্যাকি মেসার

আধুনিক x86 সিপিইউগুলিতে কাগজের প্রয়োজনের তুলনায় আরও শক্তিশালী এসএমসি সনাক্তকরণ রয়েছে: স্ব-সংশোধনকারী কোডের সাথে x86 এ বাসি নির্দেশনা আনার পর্যবেক্ষণ । এবং বেশিরভাগ নন- x86 সিপিইউগুলিতে (এআরএমের মতো), নির্দেশের ক্যাশে ডেটা ক্যাশের সাথে সুসংগত নয় সুতরাং সুনির্দিষ্টভাবে সঞ্চিত বাইটগুলি নির্ভরযোগ্যতার সাথে নির্দেশাবলী হিসাবে কার্যকর করার আগে ম্যানুয়াল ফ্লাশ / সিঙ্ক প্রয়োজন। সম্প্রদায়.আরএম . com/ প্রসেসরস / বি / ব্লগ / পোস্ট /যে কোনও উপায়ে, এসএমসির পারফরম্যান্স আধুনিক সিপিইউগুলিতে ভয়ঙ্কর , যদি আপনি একবারে পরিবর্তন না করে এবং বহুবার চালনা করেন।
পিটার কর্ডেস

7

অপারেটিং সিস্টেমের কার্নেলের দর্শন থেকে প্রতিটি ঠিক ইন টাইম সংকলক এবং লিংকার রানটাইম প্রোগ্রামের পাঠ্য স্ব-পরিবর্তন করে। বিশিষ্ট উদাহরণটি হ'ল গুগলের ভি 8 ইসিএমএ স্ক্রিপ্ট ইন্টারপ্রেটার।


5

স্ব-সংশোধনকারী কোডের আরেকটি কারণ (আসলে একটি "স্ব-উত্পাদক" কোড) হ'ল পারফরম্যান্সের জন্য একটি জাস্ট-ইন-টাইম সংকলন প্রক্রিয়া প্রয়োগ করা। উদাহরণস্বরূপ এমন একটি প্রোগ্রাম যা একটি বীজগণিতের ভাবটি পড়ে এবং বিভিন্ন ইনপুট পরামিতিগুলিতে এটি গণনা করে গণনা উল্লেখ করার আগে মেশিন কোডে অভিব্যক্তি রূপান্তর করতে পারে।


5

আপনি পুরাতন চেস্টনট জানেন যে হার্ডওয়্যার এবং সফ্টওয়্যারগুলির মধ্যে কোনও যৌক্তিক পার্থক্য নেই ... কেউ এটিও বলতে পারেন যে কোড এবং ডেটার মধ্যে কোনও যৌক্তিক পার্থক্য নেই।

স্ব-সংশোধনকারী কোড কী? কোড যা নির্বাহের স্ট্রিমে মান রাখে যাতে এটি ডেটা হিসাবে নয় বরং একটি কমান্ড হিসাবে ব্যাখ্যা করা যায়। অবশ্যই কার্যকরী ভাষায় তাত্ত্বিক দৃষ্টিভঙ্গি রয়েছে যে সত্যই কোনও পার্থক্য নেই। আমি বলছি এবং ই সমান পদমর্যাদা না নিয়ে অপরিহার্য ভাষাগুলি এবং সংকলক / দোভাষীদের মধ্যে সরল পদ্ধতিতে এটি করতে পারে।

আমি যে বিষয়টি উল্লেখ করছি তা ব্যবহারিক অর্থে যা তথ্য প্রোগ্রামের প্রয়োগের রাস্তাগুলি পরিবর্তন করতে পারে (কোনও অর্থে এটি অত্যন্ত সুস্পষ্ট)। আমি একটি সংকলক-সংকলক এর মতো কিছু নিয়ে ভাবছি যা একটি টেবিল তৈরি করে (ডেটার অ্যারে) যা একটি পার্সিংয়ের মধ্য দিয়ে যায় যা একটি রাষ্ট্র থেকে রাজ্যে চলে যায় (এবং অন্যান্য ভেরিয়েবলগুলিও সংশোধন করে) ঠিক যেমন একটি প্রোগ্রাম কীভাবে কমান্ড থেকে কমান্ডে চলে যায় like প্রক্রিয়াতে পরিবর্তনশীল পরিবর্তন করা।

সুতরাং এমনকি সাধারণ উদাহরণে যেখানে একটি সংকলক কোড স্পেস তৈরি করে এবং সম্পূর্ণ পৃথক ডেটা স্পেস (হিপ) বোঝায় সেখানে এক্সিকিউটরের পথটি স্পষ্টভাবে পরিবর্তনের জন্য ডেটা পরিবর্তন করতে পারে।


4
কোন যৌক্তিক পার্থক্য নেই, সত্য। যদিও খুব বেশি স্ব-সংশোধনকারী সংহত সার্কিট দেখা যায় নি।
ইরা বাক্সটার

@ মিচ, আইএমও সম্পাদকের পথ পরিবর্তন করে কোড (স্ব-) সংশোধন করার সাথে কিছুই করার নেই। এছাড়াও আপনি তথ্যের সাথে ডেটা গুলিয়ে ফেলেন। আমি এলএসইতে আমার জবাবটির উত্তর দিতে পারছি না / সি সি আমি সেখানে নিষিদ্ধ হয়েছি, ফেব্রুয়ারি থেকে, মেটা-এলএসইতে আমার পোভ যে আমেরিকান এবং ব্রিটিশদের ইংরেজির মালিকানা নেই তার প্রকাশের জন্য 3 বছরের (1,000 দিন) জন্য।
গেনাডি ভ্যানিন Геннадий Ванин

4

আমি সেরা অ্যালগরিদম তৈরি করতে বিবর্তন ব্যবহার করে একটি প্রোগ্রাম বাস্তবায়ন করেছি। এটি ডিএনএ ব্লুপ্রিন্টটি সংশোধন করতে স্ব-সংশোধনকারী কোড ব্যবহার করে।


2

একটি ব্যবহারের ক্ষেত্রে হ'ল EICAR টেস্ট ফাইল যা অ্যান্টিভাইরাস প্রোগ্রামগুলি পরীক্ষা করার জন্য একটি বৈধ ডস এক্সিকিউটেবল সিওএম ফাইল।

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

এটি স্ব-কোড পরিবর্তন করতে হবে কারণ এক্সিকিউটেবল ফাইলটিতে অবশ্যই [21h-60h, 7Bh-7Dh] ব্যাপ্তির মধ্যে প্রিন্টযোগ্য / টাইপযোগ্য ASCII অক্ষর থাকতে হবে যা এনকোডেবল নির্দেশের সংখ্যা উল্লেখযোগ্যভাবে সীমাবদ্ধ করে

বিশদ এখানে ব্যাখ্যা করা হয়


এটি ডস-এ ফ্ল্যাটিং-পয়েন্ট অপারেশন প্রেরণের জন্যও ব্যবহৃত হয়

কিছু সংকলক CD xxএক্স xx সহ 0 x34-0x3B থেকে x87 এর ভাসমান-বিন্দু নির্দেশের জায়গায় নির্গমন করবে । যেহেতু নির্দেশের CDজন্য intঅপকোড, তাই এটি এক্সট্রাক্ট 34h-3Bh এ ঝাঁপিয়ে পড়বে এবং x87 কোপ্রোসেসর উপলভ্য না থাকলে সফ্টওয়্যারটিতে সেই নির্দেশটি অনুকরণ করবে। অন্যথায় বিঘ্নিত হ্যান্ডলার সেই 2 বাইটগুলি প্রতিস্থাপন করবে 9B Dxযাতে পরবর্তীতে মৃত্যুদন্ড কার্যকর করা যাবে x87 দ্বারা সরাসরি অনুকরণ ছাড়াই।

এমএস-ডস-এ এক্স ৮ flo০ ফ্লোটিং পয়েন্ট এমুলেশনটির প্রোটোকল কী?


1

লিনাক্স কার্নেল লোড করার যোগ্য কার্নেল মডিউল যা শুধু যে কি হয়েছে।

ইমাকসেরও এই ক্ষমতা রয়েছে এবং আমি এটি সর্বদা ব্যবহার করি।

একটি ডায়নামিক প্লাগইন আর্কিটেকচার সমর্থন করে যে কোনও কিছুই মূলত রানটাইম এ কোড কোডটি সংশোধন করে।


4
কষ্টসহকারে। একটি গতিশীল লোডযোগ্য লাইব্রেরি যা সর্বদা বাসিন্দা না থাকে স্ব-সংশোধনকারী কোডের সাথে খুব কমই কাজ করে।
ডভ

1

আমি ক্রমাগত আপডেট হওয়া ডাটাবেসের বিরুদ্ধে পরিসংখ্যান বিশ্লেষণ চালাই। আমার পরিসংখ্যানের মডেলটি নতুন ডেটা উপলব্ধ হয়ে ওঠার জন্য কোড প্রয়োগ করা হয় এবং প্রতিবার কোডটি পুনরায় লিখিত হয়।


0

যে দৃশ্যে এটি ব্যবহার করা যায় তা হ'ল একটি শেখার প্রোগ্রাম। ব্যবহারকারী ইনপুট প্রতিক্রিয়া হিসাবে প্রোগ্রাম একটি নতুন অ্যালগরিদম শিখেছে:

  1. এটি একই জাতীয় অ্যালগরিদমের জন্য বিদ্যমান কোড বেসটি সন্ধান করে
  2. কোড বেসে যদি কোনও অনুরূপ অ্যালগরিদম না থাকে তবে প্রোগ্রামটি কেবল একটি নতুন অ্যালগরিদম যুক্ত করে
  3. যদি একই ধরণের অ্যালগরিদম বিদ্যমান থাকে তবে প্রোগ্রামটি (সম্ভবত ব্যবহারকারীর কিছু সহায়তায়) পুরানো উদ্দেশ্য এবং নতুন উদ্দেশ্য উভয়ই পরিবেশন করতে সক্ষম হতে বিদ্যমান অ্যালগরিদমকে সংশোধন করে

জাভাতে এটি কীভাবে করবেন তা একটি প্রশ্ন রয়েছে: জাভা কোডের স্ব-সংশোধন করার সম্ভাবনাগুলি কী কী?


-1

এর সেরা সংস্করণটি হতে পারে লিসপ ম্যাক্রোস। সি ম্যাক্রোগুলির বিপরীতে যা কেবলমাত্র একটি প্রিপ্রোসেসর লিস্প আপনাকে সর্বদা পুরো প্রোগ্রামিং ভাষার অ্যাক্সেস করতে দেয়। এটি লিস্পের সবচেয়ে শক্তিশালী বৈশিষ্ট্য এবং এটি অন্য কোনও ভাষায় নেই।

আমি কোনও উপায়েই কোনও বিশেষজ্ঞ নই তবে লিস্পের একজনকে এটির বিষয়ে কথা বলুন! তাদের একটি কারণ আছে যে তারা বলে যে লিস্প চারপাশের সবচেয়ে শক্তিশালী ভাষা এবং স্মার্ট লোকেরা সম্ভবত তারা ঠিক বলেছে না।


2
এটি কি স্ব-সংশোধনকারী কোড তৈরি করে নাকি এটি কেবল আরও শক্তিশালী প্রিপ্রোসেসর (একটি যা কার্যগুলি উত্পন্ন করবে)?
ব্রেন্ডন লং

@Brendan: প্রকৃতপক্ষে, কিন্তু এটা হয় preprocessing করার অধিকার উপায়। এখানে কোনও রানটাইম কোড পরিবর্তন নেই।
আলেকজান্দ্রি সি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.