নেটিভ কোড, মেশিন কোড এবং সমাবেশ কোডের মধ্যে পার্থক্য কী?


106

নেট নেটওয়ার্কের প্রসঙ্গে মেশিন কোড এবং নেটিভ কোড সম্পর্কে আমি বিভ্রান্ত।

তাদের মধ্যে পার্থক্য কী? তারা কি একই?


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

আরও দেখুন: stackoverflow.com/questions/334326/...
T.Todua

উত্তর:


150

পদগুলি প্রকৃতপক্ষে কিছুটা বিভ্রান্তিকর, কারণ এগুলি কখনও কখনও অসম্পূর্ণভাবে ব্যবহৃত হয়।

মেশিন কোড: এটি সর্বাধিক সংজ্ঞায়িত একটি। এটি এমন কোড যা বাইট-কোড নির্দেশাবলী ব্যবহার করে যা আপনার প্রসেসর (ধাতুর প্রকৃত অংশ যা প্রকৃত কাজ করে) সরাসরি বোঝে এবং কার্যকর করে। আপনার মেশিনটি কার্যকর করার আগে অন্য সমস্ত কোড অবশ্যই মেশিন কোডে অনুবাদ বা রূপান্তরিত হতে হবে।

নেটিভ কোড: এই শব্দটি কখনও কখনও এমন জায়গায় ব্যবহৃত হয় যেখানে মেশিন কোড (উপরে দেখুন) বোঝানো হয়। তবে এটি কখনও কখনও অব্যবহৃত কোড বোঝাতেও ব্যবহৃত হয় (নীচে দেখুন)।

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

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

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


সি ++ মেশিন কোডে সংকলন করতে পারে তবে এটি প্রায়শই অন্যান্য অপরূপের মতো ইমেজের মতো সংকলিত হয় যা অপারেটিং সিস্টেমের সাথে চলবে।
গর্ডন গুস্তাফসন

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

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

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

এটি নাইটপিকিংয়ের মতো অনুভূত হয় তবে সমস্ত এসেমব্লাররা 1-1 টি অপকডগুলিতে অনুবাদ করে না। প্রকৃতপক্ষে, অনেক আধুনিক একত্রিতকারী ক্লাসগুলির মতো বিমূর্ত নির্মাণকে সমর্থন করে। উদাহরণ: টিএএসএম, বোরল্যান্ডের সমাবেশকারী r en.wikedia.org/wiki/TASM
প্রধানমন্ত্রী

45

আপনি যখন সি # প্রোগ্রাম ডিবাগ করার সময় ডিবাগ + উইন্ডোজ + বিযুক্তকরণ ব্যবহার করেন তখন আপনি যা দেখেন তা এই শর্তগুলির জন্য একটি ভাল গাইড। আমি যখন জেআইটি অপ্টিমাইজেশান সক্ষম করে রিলিজ কনফিগারেশনে সি # তে লেখা একটি 'হ্যালো ওয়ার্ল্ড' প্রোগ্রামটি সংকলন করি তখন এর একটি বর্ণিত সংস্করণ এখানে রয়েছে:

        static void Main(string[] args) {
            Console.WriteLine("Hello world");
00000000 55                push        ebp                           ; save stack frame pointer
00000001 8B EC             mov         ebp,esp                       ; setup current frame
00000003 E8 30 BE 03 6F    call        6F03BE38                      ; Console.Out property getter
00000008 8B C8             mov         ecx,eax                       ; setup "this"
0000000a 8B 15 88 20 BD 02 mov         edx,dword ptr ds:[02BD2088h]  ; arg = "Hello world"
00000010 8B 01             mov         eax,dword ptr [ecx]           ; TextWriter reference
00000012 FF 90 D8 00 00 00 call        dword ptr [eax+000000D8h]     ; TextWriter.WriteLine()
00000018 5D                pop         ebp                           ; restore stack frame pointer
        }
00000019 C3                ret                                       ; done, return

অনুরূপ প্রদর্শন পেতে উইন্ডোতে ডান ক্লিক করুন এবং "কোড বাইটস দেখান" টিক দিন।

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

দ্বিতীয় কলামটি মেশিন কোড । আসল 1s এবং 0s যা সিপিইউ চালায়। এখানে যেমন মেশিন কোডটি সাধারণত হেক্সে প্রদর্শিত হয়। উদাহরণস্বরূপ সম্ভবত 0x8B এমওভি নির্দেশাবলী বাছাই করে, অতিরিক্ত বাইটগুলি সিপিইউকে ঠিক কী স্থানান্তরিত করা প্রয়োজন তা বলার জন্য রয়েছে। এছাড়াও সিএলএল নির্দেশের দুটি স্বাদ নোট করুন, 0xE8 হ'ল ডাইরেক্ট কল, 0xFF হ'ল পরোক্ষ কল নির্দেশ।

তৃতীয় কলামটি সমাবেশ কোড । সমাবেশটি একটি সহজ ভাষা যা মেশিনের কোড লিখতে আরও সহজ করার জন্য ডিজাইন করা হয়েছে। এটি সি # এর সাথে আইএল সংকলিত হওয়ার সাথে তুলনা করে। অ্যাসেম্বলি কোড অনুবাদ করতে ব্যবহৃত সংকলকটিকে "এসেম্বলার" বলা হয়। আপনার মেশিনে সম্ভবত মাইক্রোসফ্ট এসেম্বলার রয়েছে, এর এক্সিকিউটেবল নাম name৪-বিট ভার্সনের জন্য ml.exe, ml64.exe। দুটি ভাষা ব্যবহারের জন্য সাধারণ ভাষা সংস্করণ রয়েছে languages আপনি যেটি দেখছেন সেটি হ'ল ইন্টেল এবং এএমডি ব্যবহার করে। ওপেন সোর্স বিশ্বে, এটি অ্যান্ড টি স্বরলিপিতে সমাবেশ সাধারণ। ভাষার বাক্য গঠনটি যে ধরনের সিপিইউয়ের জন্য লেখা হয়েছিল তার উপর নির্ভরশীল, পাওয়ারপিসির জন্য সমাবেশের ভাষাটি একেবারেই আলাদা।

ঠিক আছে, এটি আপনার প্রশ্নের দুটি শর্তাদি সামঞ্জস্য করে। "নেটিভ কোড" একটি অস্পষ্ট শব্দ, এটি নিয়ন্ত্রণহীন ভাষায় কোড বর্ণনা করতে অস্বাভাবিকভাবে ব্যবহৃত হয় না। কোনও নির্দেশকটি হ'ল সি সংকলক দ্বারা কী ধরণের মেশিন কোড উত্পন্ন হয় তা দেখার জন্য। এটি সি'র 'হ্যালো ওয়ার্ল্ড' সংস্করণ:

int _tmain(int argc, _TCHAR* argv[])
{
00401010 55               push        ebp  
00401011 8B EC            mov         ebp,esp 
    printf("Hello world");
00401013 68 6C 6C 45 00   push        offset ___xt_z+128h (456C6Ch) 
00401018 E8 13 00 00 00   call        printf (401030h) 
0040101D 83 C4 04         add         esp,4 
    return 0;
00401020 33 C0            xor         eax,eax 
}
00401022 5D               pop         ebp  
00401023 C3               ret   

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

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


6

নেটিভ কোড এবং মেশিন কোড একই জিনিস - সিপিইউ বাস্তবায়ন করে এমন আসল বাইট।

অ্যাসেম্বলি কোডটির দুটি অর্থ রয়েছে: একটি মেশিন কোড হ'ল মানব-পঠনযোগ্য আকারে অনুবাদ করা ("জেএমপি" এর মতো সংক্ষিপ্ত শব্দের মতো স্মৃতিবিদ্যায় অনুবাদিত নির্দেশাবলীর বাইটগুলি (যা কোডের অন্য স্থানে "লাফ দেয়") অন্যটি other আইএল বাইটকোড (সি # বা ভিবি এর মতো সংকলক যে নির্দেশনা বাইট তৈরি করে, তা শেষ পর্যন্ত মেশিন কোডে অনুবাদিত হবে, তবে এখনও তা নয়) যা কোনও ডিএলএল বা এক্সই-তে থাকে।


2

.NET- এ, সমাবেশগুলি এমএস ইন্টারমিডিয়েট ল্যাঙ্গুয়েজ কোড (এমএসআইএল, কখনও কখনও সিআইএল) ধারণ করে ।
এটি একটি 'উচ্চ স্তরের' মেশিন কোডের মতো।

লোড হওয়ার পরে, এমএসআইএল জেআইটি সংকলক দ্বারা দেশীয় কোডে (ইনটেল x86 বা x64 মেশিন কোড) সংকলন করে ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.