নেট নেটওয়ার্কের প্রসঙ্গে মেশিন কোড এবং নেটিভ কোড সম্পর্কে আমি বিভ্রান্ত।
তাদের মধ্যে পার্থক্য কী? তারা কি একই?
নেট নেটওয়ার্কের প্রসঙ্গে মেশিন কোড এবং নেটিভ কোড সম্পর্কে আমি বিভ্রান্ত।
তাদের মধ্যে পার্থক্য কী? তারা কি একই?
উত্তর:
পদগুলি প্রকৃতপক্ষে কিছুটা বিভ্রান্তিকর, কারণ এগুলি কখনও কখনও অসম্পূর্ণভাবে ব্যবহৃত হয়।
মেশিন কোড: এটি সর্বাধিক সংজ্ঞায়িত একটি। এটি এমন কোড যা বাইট-কোড নির্দেশাবলী ব্যবহার করে যা আপনার প্রসেসর (ধাতুর প্রকৃত অংশ যা প্রকৃত কাজ করে) সরাসরি বোঝে এবং কার্যকর করে। আপনার মেশিনটি কার্যকর করার আগে অন্য সমস্ত কোড অবশ্যই মেশিন কোডে অনুবাদ বা রূপান্তরিত হতে হবে।
নেটিভ কোড: এই শব্দটি কখনও কখনও এমন জায়গায় ব্যবহৃত হয় যেখানে মেশিন কোড (উপরে দেখুন) বোঝানো হয়। তবে এটি কখনও কখনও অব্যবহৃত কোড বোঝাতেও ব্যবহৃত হয় (নীচে দেখুন)।
অপরিচালিত কোড এবং পরিচালিত কোড: অপরিচালিত কোড যেমন C অথবা C ++ যা সরাসরি মধ্যে কম্পাইল করা হয় একটি প্রোগ্রামিং ভাষায় লেখা কোড বোঝায় মেশিন কোড । এটি পরিচালিত কোডের সাথে বিপরীত হয় , যা সি #, ভিবি.এনইটি, জাভা বা অনুরূপ লিখিত হয় এবং ভার্চুয়াল পরিবেশে (যেমন। নেট বা জাভাভিএম) চালিত হয় যা সফ্টওয়্যারটিতে একটি প্রসেসরের "অনুকরণ" করে। মূল পার্থক্য হ'ল ম্যানেজড কোডগুলি ময়লা ফেলা সংগ্রহের নিয়োগ দিয়ে এবং বস্তুর বিবরণ অস্বচ্ছ রাখার মাধ্যমে আপনার জন্য সংস্থানগুলি (বেশিরভাগ মেমরি বরাদ্দ) পরিচালনা করে। নিয়ন্ত্রণহীন কোডএমন এক ধরণের কোড যার জন্য আপনাকে ম্যানুয়ালি ম্যানুয়ালি বরাদ্দ করতে এবং ডি-বরাদ্দ করা দরকার, কখনও কখনও মেমরি ফাঁস হয় (যখন আপনি ডি-বরাদ্দ করতে ভুলে যান) এবং কখনও কখনও বিভাগীয় ত্রুটি (যখন আপনি খুব শীঘ্রই ডি-বরাদ্দ করেন)। নিয়ন্ত্রিত এছাড়াও সাধারণত বোঝায় যে নাল-পয়েন্টার ডেরেফারেন্সিং বা অ্যারে সীমা ওভারফ্লো হিসাবে সাধারণ ত্রুটিগুলির জন্য রান-টাইম চেক নেই।
কড়া কথায় বলতে গেলে, বেশিরভাগ গতিশীল টাইপযুক্ত ভাষা যেমন পার্ল, পাইথন, পিএইচপি এবং রুবি - এছাড়াও পরিচালিত কোড । তবে এগুলি সাধারণত এ জাতীয় হিসাবে বর্ণনা করা হয় না, যা দেখায় যে পরিচালিত কোডটি সত্যই বড়, গুরুতর, বাণিজ্যিক প্রোগ্রামিং পরিবেশের (। নেট এবং জাভা) জন্য কিছুটা বিপণনের শব্দ।
অ্যাসেম্বলি কোড: এই শব্দটি সাধারণত বাইট-কোড লিখতে চাইলে লোকেরা যে ধরণের উত্স কোড লিখেন তা বোঝায়। একটি এসেম্ব্লার এমন একটি প্রোগ্রাম যা এই উত্স কোডটিকে রিয়েল বাইট-কোডে রূপান্তর করে। রূপান্তরটি 1-থেকে -1 হওয়ায় এটি সংকলক নয় । যাইহোক, শব্দটি কী ধরণের বাইট কোড ব্যবহার করা হয়েছে তা সম্পর্কে অস্পষ্ট: এটি পরিচালনা বা পরিচালনা করা যায় না। যদি এটি পরিচালনা না করা হয়, ফলাফল বাইট-কোডটি মেশিন কোড । যদি এটি পরিচালনা করা হয়, তবে এটি নেটের মতো ভার্চুয়াল পরিবেশের দ্বারা পর্দার পিছনে ব্যবহৃত বাইট কোডের ফলাফল হয়। পরিচালিত কোড (যেমন সি #, জাভা) এই বিশেষ বাইট-কোড ভাষায় সংকলিত হয়,। নেট এর ক্ষেত্রে সাধারণ ইন্টারমিডিয়েট ল্যাঙ্গুয়েজ (সিআইএল) এবং জাভাতে জাভা বাইট-কোড বলা হয় । সাধারণত সরাসরি এই ভাষায় এই কোড বা লিখতে অ্যাক্সেস করতে সাধারণ প্রোগ্রামার সামান্য প্রয়োজন হয় না, কিন্তু যখন মানুষ, তারা প্রায়ই এটা হিসাবে পড়ুন সমাবেশ কোড কারণ তারা একটি ব্যবহার প্রতীকী ভাষান্তর এটা বাইট-কোড পরিণত।
আপনি যখন সি # প্রোগ্রাম ডিবাগ করার সময় ডিবাগ + উইন্ডোজ + বিযুক্তকরণ ব্যবহার করেন তখন আপনি যা দেখেন তা এই শর্তগুলির জন্য একটি ভাল গাইড। আমি যখন জেআইটি অপ্টিমাইজেশান সক্ষম করে রিলিজ কনফিগারেশনে সি # তে লেখা একটি 'হ্যালো ওয়ার্ল্ড' প্রোগ্রামটি সংকলন করি তখন এর একটি বর্ণিত সংস্করণ এখানে রয়েছে:
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 আমার আরও উল্লেখ করা উচিত যে আমি মেশিনের কোডটি দেখতে দেখতে কিছু মেশিন কোড অপ্টিমাইজেশন বিকল্পগুলি বন্ধ করে দিয়েছি। সি / সি ++ সংকলকগুলির কোডটি অনুকূলিত করার জন্য আরও অনেক বেশি সময় পাওয়া যায়, ফলাফলটি প্রায়শই ব্যাখ্যা করা শক্ত। এবং ডিবাগ করা খুব কঠিন।
এখানে মূল বিষয়টি হ'ল জেআইটি সংকলক দ্বারা পরিচালিত ভাষা থেকে উত্পাদিত মেশিন কোড এবং নেটিভ কোড সংকলক দ্বারা উত্পাদিত মেশিন কোডের মধ্যে খুব কম পার্থক্য রয়েছে। সি # ভাষা একটি স্থানীয় কোড সংকলকটির সাথে প্রতিযোগিতামূলক হতে পারে বলে প্রাথমিক কারণ। তাদের মধ্যে একমাত্র আসল পার্থক্য হ'ল সমর্থন ফাংশন কল। যার অনেকগুলি সিএলআর প্রয়োগ করা হয়। এবং এটি আবর্জনা সংগ্রাহকের আশেপাশে প্রাথমিক ঘোরে।
নেটিভ কোড এবং মেশিন কোড একই জিনিস - সিপিইউ বাস্তবায়ন করে এমন আসল বাইট।
অ্যাসেম্বলি কোডটির দুটি অর্থ রয়েছে: একটি মেশিন কোড হ'ল মানব-পঠনযোগ্য আকারে অনুবাদ করা ("জেএমপি" এর মতো সংক্ষিপ্ত শব্দের মতো স্মৃতিবিদ্যায় অনুবাদিত নির্দেশাবলীর বাইটগুলি (যা কোডের অন্য স্থানে "লাফ দেয়") অন্যটি other আইএল বাইটকোড (সি # বা ভিবি এর মতো সংকলক যে নির্দেশনা বাইট তৈরি করে, তা শেষ পর্যন্ত মেশিন কোডে অনুবাদিত হবে, তবে এখনও তা নয়) যা কোনও ডিএলএল বা এক্সই-তে থাকে।
.NET- এ, সমাবেশগুলি এমএস ইন্টারমিডিয়েট ল্যাঙ্গুয়েজ কোড (এমএসআইএল, কখনও কখনও সিআইএল) ধারণ করে ।
এটি একটি 'উচ্চ স্তরের' মেশিন কোডের মতো।
লোড হওয়ার পরে, এমএসআইএল জেআইটি সংকলক দ্বারা দেশীয় কোডে (ইনটেল x86 বা x64 মেশিন কোড) সংকলন করে ।