আপনি বেশ কয়েকটি মন্তব্যে পোস্ট করেছেন এমন প্রশ্নের সমাধানের জন্য (যা আমি মনে করি আপনার নিজের পোস্টে সম্পাদনা করা উচিত):
আমি যা বুঝতে পারি না তা হ'ল কম্পিউটার কীভাবে জানতে পারে যখন এটি কোনও ভেরিয়েবলের মান এবং ঠিকানা যেমন 10001 পড়বে যখন কোনও আন্ত বা চর হয়। কল্পনা করুন যে আমি যেকোন প্রোগ্রামে ক্লিক করেছি e তত্ক্ষণাত্ কোডটি কার্যকর করা শুরু করে। এই এক্সিপ ফাইলটিতে ভেরিয়েবলগুলি হিসাবে বা চরের মতো সংরক্ষণ করা হয় সে সম্পর্কে তথ্য অন্তর্ভুক্ত থাকে?
সুতরাং এটিতে কিছু কোড দেওয়া যাক। আপনি লিখুন বলে দিন:
int x = 4;
এবং ধরে নেওয়া যাক এটি র্যামে সঞ্চিত হয়:
0x00010004: 0x00000004
প্রথম অংশটি ঠিকানা, দ্বিতীয় অংশটি মান। আপনার প্রোগ্রামটি (যা মেশিন কোড হিসাবে চালিত হয়) চলতে থাকে, এটির যা দেখায় 0x00010004তার মান 0x000000004। এটি এই ডেটার ধরণটি 'জানে না' এবং এটি কীভাবে ব্যবহার করা উচিত বলে মনে হয় তা জানে না।
সুতরাং, কীভাবে আপনার প্রোগ্রামটি সঠিক কাজটি করতে পারে? এই কোডটি বিবেচনা করুন:
int x = 4;
x = x + 5;
আমরা এখানে একটি পড়তে এবং একটি লেখার আছে। যখন আপনার প্রোগ্রামটি xমেমরি থেকে পড়ে , এটি 0x00000004সেখানে খুঁজে পায় । এবং আপনার প্রোগ্রাম 0x00000005এটি যোগ করতে জানে । এবং আপনার প্রোগ্রামটি 'জানার' কারণটি এটি একটি বৈধ অপারেশন, কারণ সংকলকটি টাইপ-সুরক্ষার মাধ্যমে অপারেশনটি বৈধ কিনা তা নিশ্চিত করে। তোমার কম্পাইলার ইতিমধ্যে যে আপনি যোগ করতে পারেন যাচাই করে নিয়েছেন 4এবং 5একসঙ্গে। সুতরাং যখন আপনার বাইনারি কোডটি চালিত হয় (উদাহরণ), এটির যাচাইকরণ করতে হবে না। এটি কেবল প্রতিটি পদক্ষেপকে অন্ধভাবে কার্যকর করে, সবকিছু ঠিকঠাক ধরে নিয়েছে (খারাপ ঘটনা ঘটে যখন তারা বাস্তবে হয়, ঠিক হয় না)।
এটি ভাবার আর একটি উপায় এটি। আমি আপনাকে এই তথ্য দিচ্ছি:
0x00000004: 0x12345678
আগের মতো একই বিন্যাস - বামে ঠিকানা, ডানদিকে মান। মান কত প্রকার? এই মুহুর্তে, আপনি কোডটি চালানোর সময় আপনার কম্পিউটারের মতো সেই মানটি সম্পর্কে ঠিক তেমন তথ্য জানবেন। আমি যদি আপনাকে সেই মানটিতে 12743 যোগ করতে বলেছিলাম তবে আপনি এটি করতে পারেন। এই অপারেশনটির কী কী ক্ষতি হবে তা পুরো সিস্টেমে কী হবে তা আপনার কোনও ধারণা নেই তবে দুটি সংখ্যা যুক্ত করা এমন একটি বিষয় যা আপনি সত্যিই ভাল, তাই আপনি এটি করতে পারতেন । যে মান একটি করে int? অগত্যা নয় - আপনি যা দেখেন তা হ'ল দুটি 32-বিট মান এবং সংযোজন অপারেটর।
সম্ভবত কিছু বিভ্রান্তি আবার ডেটা ফিরিয়ে আনছে। যদি আমাদের থাকে:
char A = 'a';
কীভাবে কম্পিউটার aকনসোলে প্রদর্শিত হবে? ঠিক আছে, যে অনেক পদক্ষেপ আছে। প্রথমটি Aমেমরির মধ্যে অবস্থানে গিয়ে এটি পড়তে হবে:
0x00000004: 0x00000061
aASCII এ হেক্সের মান 0x61, সুতরাং উপরেরটি হতে পারে এমন কিছু হতে পারে যা আপনি স্মৃতিতে দেখতে চান। সুতরাং এখন আমাদের মেশিন কোডটি পূর্ণসংখ্যার মানটি জানে। পূর্ণরূপটির মানটি প্রদর্শিত করতে একটি অক্ষরে রূপান্তর করা কীভাবে জানতে পারে? সহজ কথায়, সংকলক সেই রূপান্তরটি তৈরি করার জন্য প্রয়োজনীয় সমস্ত পদক্ষেপের মধ্যে রাখার বিষয়টি নিশ্চিত করেছিল। কিন্তু আপনার কম্পিউটারে নিজেই (বা প্রোগ্রামটি / এক্সিম) কোনও তথ্য নেই যে সেই ডেটার ধরণটি কী। সেই 32-বিট মানটি যে কোনও কিছু হতে পারে - int,, chara এর অর্ধেক double, একটি পয়েন্টার, অ্যারের অংশ, ক এর stringঅংশ, একটি নির্দেশের অংশ ইত্যাদি be
কম্পিউটার / অপারেটিং সিস্টেমের সাথে আপনার প্রোগ্রামটি (এক্সপি) থাকতে পারে তা এখানে একটি সংক্ষিপ্ত ইন্টারঅ্যাকশন।
প্রোগ্রাম: আমি শুরু করতে চাই। আমার 20 এমবি স্মৃতি দরকার।
অপারেটিং সিস্টেম: 20 টি ফ্রি এমবি মেমরি খুঁজে পাওয়া যায় যা ব্যবহৃত হয় না এবং তাদের হাতে দেয়
(গুরুত্বপূর্ণ দ্রষ্টব্যটি হ'ল এটি যে কোনও 20 ফ্রি এমবি মেমরির ফিরিয়ে দিতে পারে , তাদের এমনকি স্বচ্ছল হতে হবে না this এই মুহুর্তে, প্রোগ্রামটি এখন ওএসের সাথে কথা না বলেই মেমরিটির মধ্যে কাজ করতে পারে)
প্রোগ্রাম: আমি ধরে নেব যে মেমরির প্রথম স্থানটি একটি 32-বিট পূর্ণসংখ্যার পরিবর্তনশীল x।
(সংকলকটি নিশ্চিত করে যে অন্য ভেরিয়েবলগুলি অ্যাক্সেস করে মেমোরিতে এই স্পটটি কখনই স্পর্শ করবে না the সিস্টেমে এমন কিছুই নেই যা বলে যে প্রথম বাইটটি পরিবর্তনশীল x, বা সেই ভেরিয়েবলটি xএকটি পূর্ণসংখ্যা। একটি উপমা: আপনার একটি ব্যাগ রয়েছে You আপনি লোকদের বলুন যে আপনি কেবল এই ব্যাগটিতে হলুদ বর্ণের বল রাখবেন later পরে যখন কেউ ব্যাগটি থেকে কোনও জিনিস টানেন, তখন অবাক করে দেওয়ার মতো হবে যে তারা নীল বা ঘনক কিছু বের করে নেবে - কিছু মারাত্মকভাবে ভুল হয়েছে computers কম্পিউটারগুলির ক্ষেত্রেও এটিই যায়: আপনার প্রোগ্রামটি ধরে নিচ্ছে যে প্রথম মেমোরি স্পটটি পরিবর্তনশীল এক্স এবং এটি একটি পূর্ণসংখ্যা If মেমরির এই বাইটের উপরে যদি কখনও অন্য কিছু লেখা থাকে বা এটি অন্য কিছু বলে ধরে নেওয়া হয় - ভয়ঙ্কর কিছু ঘটেছে The সংকলকটি এই ধরণের জিনিসগুলি নিশ্চিত করে ঘটবে না)
প্রোগ্রাম: আমি এখন 2প্রথম চারটি বাইটে লিখব যেখানে আমি অনুমান করছি x।
প্রোগ্রাম: আমি 5 যোগ করতে চান x।
অস্থায়ী রেজিস্টারে X এর মান পড়ে
অস্থায়ী নিবন্ধে 5 যুক্ত করে
অস্থায়ী নিবন্ধের মানটিকে প্রথম বাইটে ফিরিয়ে দেয়, যা এখনও ধরে নেওয়া হয় x।
প্রোগ্রাম: আমি পরবর্তী উপলব্ধ বাইট ধরে নিতে যাচ্ছি চর ভেরিয়েবল y।
প্রোগ্রাম: আমি aপরিবর্তনশীল লিখতে হবে y।
প্রোগ্রাম: আমি এর বিষয়বস্তু প্রদর্শন করতে চাই y
দ্বিতীয় স্মৃতি স্পটে মান পড়ে Read
বাইট থেকে একটি চরিত্রে রূপান্তর করতে একটি লাইব্রেরি ব্যবহার করে
কনসোল স্ক্রিন পরিবর্তন করতে গ্রাফিক্স লাইব্রেরি ব্যবহার করে (কালো থেকে সাদাতে পিক্সেল সেট করা, একটি লাইন স্ক্রোলিং ইত্যাদি)
(এবং এটি এখান থেকে চলে)
আপনি সম্ভবত যা ঝুলিয়ে যাচ্ছেন তা হ'ল - যখন স্মৃতিতে প্রথম স্থানটি আর থাকে না তখন কী ঘটে x? নাকি দ্বিতীয়টি আর নেই y? যখন কেউ লেখা কি হবে xহিসেবে charবা yএকটি পয়েন্টার হিসাবে? সংক্ষেপে, খারাপ জিনিস ঘটে। এই জিনিসগুলির মধ্যে কিছুটির সু-সংজ্ঞায়িত আচরণ রয়েছে, আবার কারও কারও অপরিবর্তিত আচরণ রয়েছে। অপরিবর্তিত আচরণ হ'ল হ'ল প্রোগ্রাম বা অপারেটিং সিস্টেম ক্রাশ করার জন্য কিছুই হতে পারে না। এমনকি সু-সংজ্ঞায়িত আচরণও দূষিত হতে পারে। যদি আমি xআমার প্রোগ্রামের কোনও পয়েন্টারে পরিবর্তন করতে পারি এবং আপনার প্রোগ্রামটিকে এটি পয়েন্টার হিসাবে ব্যবহার করতে পারি তবে আমি আপনার প্রোগ্রামটি আমার প্রোগ্রামটি কার্যকর করতে শুরু করতে পারি - হ্যাকাররা যা করে ঠিক এটিই। আমরা int xএকটি হিসাবে ব্যবহার করি না তা নিশ্চিত করতে সহায়তার জন্য সংকলকটি রয়েছেstring, এবং যে প্রকৃতির জিনিস। মেশিন কোড নিজেই প্রকার সম্পর্কে সচেতন নয় এবং এটি কেবল নির্দেশাবলী যা করতে বলে তা করবে। রান-টাইমে প্রচুর পরিমাণে তথ্যের সন্ধানও রয়েছে: প্রোগ্রামটি কোন মেমরির বাইট ব্যবহার করার অনুমতি দেয়? না xপ্রথম বাইট বা 12th এ শুরু?
তবে আপনি কল্পনা করতে পারেন যে আসলে এই জাতীয় প্রোগ্রামগুলি লেখার জন্য এটি কতটা ভয়াবহ হবে (এবং আপনি সমাবেশের ভাষায়ও পারেন)। আপনি আপনার ভেরিয়েবলগুলি 'ডিক্লার' করে শুরু করেন - আপনি নিজেকে বলুন যে বাইট 1 হ'ল x, বাইট 2 হ'ল yএবং আপনি কোডের প্রতিটি লাইন লিখতে, নিবন্ধগুলি লোড এবং স্টোর করে রাখলে আপনাকে (একজন মানুষ হিসাবে) মনে রাখতে হবে কোনটি xএবং কোনটি একটি হ'ল y, কারণ সিস্টেমটির কোনও ধারণা নেই। এবং আপনাকে (একজন মানুষ হিসাবে) কী ধরণের xএবং কী তা মনে রাখতে হবে y, কারণ আবার - সিস্টেমটির কোনও ধারণা নেই।