কোনও সি প্রোগ্রাম কার্যকর করার সময় কি ডেটা টাইপ ডিক্লেয়ারারগুলি যেমন "ইন" এবং "চর" র‌্যামে সঞ্চিত থাকে?


74

যখন কোনও সি প্রোগ্রাম চালু থাকে তখন ডেটা হিপ বা স্ট্যাকের মধ্যে সংরক্ষণ করা হয়। মানগুলি র‍্যাম ঠিকানায় সংরক্ষণ করা হয়। তবে প্রকারের সূচকগুলি সম্পর্কে কী (উদাহরণস্বরূপ, intবা char)? সেগুলিও কি সংরক্ষণ করা হয়?

নিম্নলিখিত কোড বিবেচনা করুন:

char a = 'A';
int x = 4;

আমি পড়েছি যে এ এবং 4 র্যামের ঠিকানাগুলিতে এখানে সঞ্চয় করা আছে। তবে কি aআর x? সবচেয়ে বিভ্রান্তিকরভাবে, মৃত্যুদন্ড কার্যকর কীভাবে জানতে পারে যে aএটি একটি চর এবং xএকটি অন্তর্নিহিত? আমি বলতে চাচ্ছি, হয় intএবং charর্যাম কোথাও উল্লেখ?

ধরা যাক যে কোনও মান 10011001 হিসাবে র‌্যামের কোথাও সঞ্চিত রয়েছে; যদি আমি প্রোগ্রামটি করি যা কোডটি কার্যকর করে, আমি কীভাবে জানব যে এই 10011001 একটি charবা একটি int?

কি আমি বুঝতে পারছি না কিভাবে কম্পিউটার জানে, যখন এটি একটি ঠিকানা যেমন 10001 থেকে একটি পরিবর্তনশীল মান সার্চ, সেটি হয়ত একটি হল intবা char। কল্পনা করুন আমি কল করা একটি প্রোগ্রাম ক্লিক করুন anyprog.exe। তত্ক্ষণাত্ কোডটি কার্যকর করা শুরু করে। এই এক্সিকিউটেবল ফাইলের মধ্যে কি স্টোর করা ভেরিয়েবল টাইপের হয় intবা না এর তথ্য অন্তর্ভুক্ত থাকে char?


24
রান-টাইমে এই তথ্য পুরোপুরি হারিয়ে গেছে। আপনাকে (এবং আপনার সংকলক) আগে থেকেই নিশ্চিত করতে হবে যে স্মৃতিটি সঠিকভাবে ব্যাখ্যা করা হবে। আপনি কি পরে এই উত্তর ছিল?
5gon12eder

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

22
@ user16307 সংক্ষিপ্ত উত্তরটি হ'ল স্থিতভাবে টাইপ করা ভাষায়, যখনই আপনি কোনও চর মুদ্রণ করবেন, সংকলকটি কোনও প্রিন্ট মুদ্রণের জন্য আলাদা কোড তৈরি করবে । রানটাইমের সময় আর কোনও জ্ঞান নেই যা xচর হয় তবে এটি চর-প্রিন্টিং কোড যা চালিত হয়, কারণ এটিই সংকলকটি নির্বাচিত।
Ixrec

13
@ ব্যবহারকারী 16307 এটি সর্বদা 65 নম্বরের বাইনারি উপস্থাপনা হিসাবে সঞ্চিত থাকে it এটি 65 হিসাবে মুদ্রিত হয় বা এ হিসাবে আপনার সংকলক কোডটি মুদ্রণের জন্য তৈরি করেছে তার উপর নির্ভর করে । 65 এর পাশের কোনও মেটাডেটা নেই যা বলে যে এটি আসলে চর বা কোনও অন্তর্নিহিত (কমপক্ষে, সি এর মতো স্ট্যাটিকালি টাইপ করা ভাষায় নয়)।
Ixrec

2
আপনি এখানে যে ধারণাগুলি সম্পর্কে জিজ্ঞাসা করেছেন সেগুলি পুরোপুরি বুঝতে পারবেন এবং সেগুলি নিজেই প্রয়োগ করুন, আপনি একটি সংকলক কোর্স গ্রহণ করতে চাইতে পারেন, অবশ্যই কোর্সের একটি
মুচাহো

উত্তর:


122

আপনি বেশ কয়েকটি মন্তব্যে পোস্ট করেছেন এমন প্রশ্নের সমাধানের জন্য (যা আমি মনে করি আপনার নিজের পোস্টে সম্পাদনা করা উচিত):

আমি যা বুঝতে পারি না তা হ'ল কম্পিউটার কীভাবে জানতে পারে যখন এটি কোনও ভেরিয়েবলের মান এবং ঠিকানা যেমন 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

  • এর জন্য বাইট মানটি খুঁজে পেতে একটি লাইব্রেরি ব্যবহৃত হয় a

  • বাইটটি ঠিকানায় লেখা আছে প্রোগ্রামটি ধরে নেওয়া হচ্ছে y

প্রোগ্রাম: আমি এর বিষয়বস্তু প্রদর্শন করতে চাই y

  • দ্বিতীয় স্মৃতি স্পটে মান পড়ে Read

  • বাইট থেকে একটি চরিত্রে রূপান্তর করতে একটি লাইব্রেরি ব্যবহার করে

  • কনসোল স্ক্রিন পরিবর্তন করতে গ্রাফিক্স লাইব্রেরি ব্যবহার করে (কালো থেকে সাদাতে পিক্সেল সেট করা, একটি লাইন স্ক্রোলিং ইত্যাদি)

(এবং এটি এখান থেকে চলে)

আপনি সম্ভবত যা ঝুলিয়ে যাচ্ছেন তা হ'ল - যখন স্মৃতিতে প্রথম স্থানটি আর থাকে না তখন কী ঘটে x? নাকি দ্বিতীয়টি আর নেই y? যখন কেউ লেখা কি হবে xহিসেবে charবা yএকটি পয়েন্টার হিসাবে? সংক্ষেপে, খারাপ জিনিস ঘটে। এই জিনিসগুলির মধ্যে কিছুটির সু-সংজ্ঞায়িত আচরণ রয়েছে, আবার কারও কারও অপরিবর্তিত আচরণ রয়েছে। অপরিবর্তিত আচরণ হ'ল হ'ল প্রোগ্রাম বা অপারেটিং সিস্টেম ক্রাশ করার জন্য কিছুই হতে পারে না। এমনকি সু-সংজ্ঞায়িত আচরণও দূষিত হতে পারে। যদি আমি xআমার প্রোগ্রামের কোনও পয়েন্টারে পরিবর্তন করতে পারি এবং আপনার প্রোগ্রামটিকে এটি পয়েন্টার হিসাবে ব্যবহার করতে পারি তবে আমি আপনার প্রোগ্রামটি আমার প্রোগ্রামটি কার্যকর করতে শুরু করতে পারি - হ্যাকাররা যা করে ঠিক এটিই। আমরা int xএকটি হিসাবে ব্যবহার করি না তা নিশ্চিত করতে সহায়তার জন্য সংকলকটি রয়েছেstring, এবং যে প্রকৃতির জিনিস। মেশিন কোড নিজেই প্রকার সম্পর্কে সচেতন নয় এবং এটি কেবল নির্দেশাবলী যা করতে বলে তা করবে। রান-টাইমে প্রচুর পরিমাণে তথ্যের সন্ধানও রয়েছে: প্রোগ্রামটি কোন মেমরির বাইট ব্যবহার করার অনুমতি দেয়? না xপ্রথম বাইট বা 12th এ শুরু?

তবে আপনি কল্পনা করতে পারেন যে আসলে এই জাতীয় প্রোগ্রামগুলি লেখার জন্য এটি কতটা ভয়াবহ হবে (এবং আপনি সমাবেশের ভাষায়ও পারেন)। আপনি আপনার ভেরিয়েবলগুলি 'ডিক্লার' করে শুরু করেন - আপনি নিজেকে বলুন যে বাইট 1 হ'ল x, বাইট 2 হ'ল yএবং আপনি কোডের প্রতিটি লাইন লিখতে, নিবন্ধগুলি লোড এবং স্টোর করে রাখলে আপনাকে (একজন মানুষ হিসাবে) মনে রাখতে হবে কোনটি xএবং কোনটি একটি হ'ল y, কারণ সিস্টেমটির কোনও ধারণা নেই। এবং আপনাকে (একজন মানুষ হিসাবে) কী ধরণের xএবং কী তা মনে রাখতে হবে y, কারণ আবার - সিস্টেমটির কোনও ধারণা নেই।


আশ্চর্যজনক ব্যাখ্যা। কেবলমাত্র আপনি যে অংশটি লিখেছেন "এটি পূর্ণরূপের মানটি কীভাবে এটি প্রদর্শিত করতে অক্ষরে রূপান্তর করতে জানে? সহজ ভাষায় বলতে গেলে, সংকলকটি সেই রূপান্তরটি তৈরি করার জন্য প্রয়োজনীয় সমস্ত পদক্ষেপের মধ্যে রাখার বিষয়টি নিশ্চিত করেছিল।" এখনও আমার জন্য কুয়াশাচ্ছন্ন। বলুন যে সিপিইউ র‌্যাম রেজিস্টার থেকে 0x00000061 এনেছে। এই বিন্দু থেকে আপনি কি বলছেন যে অন্যান্য নির্দেশাবলী রয়েছে (এক্সপি ফাইলটিতে) যা আমরা স্ক্রিনে দেখতে পাই তাতে রূপান্তর করে?
ব্যবহারকারী 16307

2
@ ব্যবহারকারী 16307 হ্যাঁ, অতিরিক্ত নির্দেশাবলী রয়েছে। আপনার লেখা প্রতিটি কোডের লাইনটি সম্ভাব্যভাবে অনেক নির্দেশিকায় রূপান্তরিত হতে পারে। কোন অক্ষরটি ব্যবহার করবেন তা নির্ধারণের জন্য নির্দেশাবলী রয়েছে, কোন পিক্সেলগুলি সংশোধন করতে হবে এবং কোন রঙে পরিবর্তিত হবে সে সম্পর্কে নির্দেশাবলী রয়েছে etc. এখানে এমন কোডও রয়েছে যা আপনি সত্যিই দেখেন না। উদাহরণস্বরূপ, std :: cout ব্যবহারের অর্থ আপনি একটি লাইব্রেরি ব্যবহার করছেন। কনসোলে আপনার লিখনের কোডটি কেবল একটি লাইন হতে পারে তবে আপনি যে ফাংশনটি কল করবেন তা আরও লাইন হবে এবং প্রতিটি লাইন অনেকগুলি মেশিনের নির্দেশিকায় রূপান্তর করতে পারে।
Shaz

8
@ user16307 Otherwise how can console or text file outputs a character instead of int কারণ কোনও মেমরি অবস্থানের বিষয়বস্তুটি একটি পূর্ণসংখ্যারূপে বা বর্ণানুক্রমিক অক্ষর হিসাবে আউটপুট দেওয়ার জন্য নির্দেশের একটি পৃথক ক্রম রয়েছে। সংকলকটি ভেরিয়েবলের প্রকারগুলি সম্পর্কে জানতে পারে এবং সংকলনের সময় নির্দেশাবলীর যথাযথ ক্রমটি চয়ন করে এবং এটি এএসইএতে রেকর্ড করে।
চার্লস ই। গ্রান্ট

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

6
@ ব্যবহারকারী 16307 সি ++ এবং সি # সম্পর্কে উদ্বিগ্ন না হওয়ার চেষ্টা করুন। এই ব্যক্তিরা যা বলছেন তা কম্পিউটার এবং সংকলকরা কীভাবে কাজ করে তা আপনার বর্তমান বোঝার aboveর্ধ্বে। আপনি যা বোঝার চেষ্টা করছেন তার উদ্দেশ্যে, হার্ডওয়্যার ধরণ, চর বা ইন্ট বা যা কিছু সম্পর্কে কিছুই জানে না। আপনি যখন কম্পাইলারকে কিছু ভেরিয়েবলটি একটি ইনট বলেছিলেন, এটি কোনও মেমরির অবস্থান হ্যান্ডেল করার জন্য এক্সিকিউটেবল কোড উত্পন্ন করে যদি এটি কোনও int হয়। মেমরির অবস্থানটিতে নিজেই ধরণের সম্পর্কে কোনও তথ্য নেই; এটি ঠিক যে আপনার প্রোগ্রামটি এটিকে একটি আন্ত হিসাবে বিবেচনা করার সিদ্ধান্ত নিয়েছে। রানটাইম টাইপের তথ্য সম্পর্কে আপনি যা শুনেছেন তা ভুলে যান।
আন্দ্রেস এফ।

43

আমি মনে করি আপনার মূল প্রশ্নটি মনে হচ্ছে: "টাইপটি যদি সংকলন-সময়ে মুছে ফেলা হয় এবং রানটাইম ধরে রাখা না হয়, তবে কম্পিউটার কীভাবে কোড উইচকে এটির ব্যাখ্যা করে intবা কোড হিসাবে এটি ব্যাখ্যা করে যা কার্যকর করে কিনা তা কীভাবে জানতে পারে char? "

এবং উত্তরটি হ'ল ... কম্পিউটারটি দেয় না। যাইহোক, কম্পাইলার নেই জানি, আর এটা শুধু প্রথম স্থানে বাইনারি সঠিক কোড করা আছে হবে। পরিবর্তনশীল হিসাবে টাইপ করা ছিল char, তারপর কম্পাইলার না কোড একটি যেমন চিকিত্সার জন্য করা হবে intপ্রোগ্রামে, এটা একটি হল চিকিত্সা কোড করা হবে char

সেখানে হয় কারণ রানটাইম এ ধরনের ধরে রাখতে:

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

টাইপটি সি-তে রানটাইম রাখার একমাত্র কারণ ডিবাগিংয়ের জন্য হতে পারে তবে সাধারণত উত্সটি উপলক্ষে ডিবাগিং করা হয় এবং তারপরে আপনি সোর্স ফাইলে টাইপটি সন্ধান করতে পারেন।

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

রানটাইমে টাইপগুলি বজায় রাখা কেবল তখনই প্রয়োজন যখন আপনি রানটাইমের ধরণের সাথে কিছু করতে চান।

হাস্কেল হ'ল সর্বাধিক কঠোর, কঠোর, টাইপ-সেফ স্ট্যাটিকালি টাইপ করা ভাষা এবং হ্যাস্কেল সংকলক সাধারণত সব ধরণের মুছুন। (টাইপ শ্রেণীর জন্য পদ্ধতি অভিধান পাস করা ব্যতিক্রম, আমি বিশ্বাস করি।)


3
না! কেন? এই তথ্যের জন্য কী প্রয়োজন হবে? সংকলক charবাইনারি মধ্যে একটি পড়ার জন্য কোড আউটপুট । এটি একটি জন্য নয় আউটপুট কোড আছে intতা না আউটপুট কোড করে, byteতাই না আউটপুট একটি পয়েন্টার কোড, এটা শুধু আউটপুট না, শুধুমাত্র কোড একটি জন্য char। ধরণের ভিত্তিতে কোনও রানটাইম সিদ্ধান্ত নেই। আপনার টাইপের দরকার নেই। এটি সম্পূর্ণ এবং সম্পূর্ণ অপ্রাসঙ্গিক। সমস্ত প্রাসঙ্গিক সিদ্ধান্ত ইতিমধ্যে সংকলন সময়ে নেওয়া হয়েছে।
Jörg ডব্লু মিটাগ

2
নেই। সংকলকটি বাইনারিগুলিতে একটি চর মুদ্রণের জন্য কেবল কোড রাখে। সময়কাল। সংকলক জানে যে সেই মেমরি ঠিকানায়, চর রয়েছে, সুতরাং এটি বাইনারিটিতে একটি চর মুদ্রণের জন্য কোড রাখে। যদি কোনও অদ্ভুত কারণে সেই মেমরি ঠিকানার মানটি চর না হয়ে থাকে তবে ঠিক আছে, সমস্ত নরক আলগা হয়ে যায়। এটিই মূলত পুরো শ্রেণীর সুরক্ষা কীভাবে কাজ করে।
Jörg ডব্লু মিটাগ

2
এটি সম্পর্কে চিন্তা করুন: সিপিইউ যদি কোনওভাবে প্রোগ্রামের ডেটা ধরণের সম্পর্কে জানত তবে গ্রহের প্রত্যেককেই নতুন সিপিইউ কিনতে হবে যখনই কেউ নতুন ধরণের আবিষ্কার করেন। public class JoergsAwesomeNewType {};দেখা? আমি সবেমাত্র একটি নতুন ধরণের উদ্ভাবন করেছি! আপনার একটি নতুন সিপিইউ কিনতে হবে!
Jörg ডব্লু মিটাগ

9
না। না। বাইনারিটিতে এটি কী কোড রাখবে তা সংকলক জানে। এই তথ্যটি চারপাশে রাখার কোনও মানে নেই। আপনি যদি কোন প্রিন্ট মুদ্রণ করছেন, সংকলকটি কোন প্রিন্ট মুদ্রণের জন্য কোডটি রাখবে। আপনি যদি একটি চর মুদ্রণ করছেন, সংকলক একটি চর মুদ্রণের জন্য কোড রাখবে। সময়কাল। তবে এটি কেবল একটি বিট প্যাটার্ন। একটি চরটি মুদ্রণের জন্য কোড একটি নির্দিষ্ট উপায়ে বিট প্যাটার্নকে ব্যাখ্যা করবে, কোন প্রিন্ট প্রিন্ট করার কোডটি বিটটিকে ভিন্ন উপায়ে ব্যাখ্যা করবে, তবে বিট প্যাটার্নের পার্থক্য করার কোনও উপায় নেই যা বিট প্যাটার্ন থেকে কোন আন্তঃ এটি একটি চর, এটি বিটের একটি স্ট্রিং।
Jörg W Mittag

2
@ ইউজার 16307: "কোন ঠিকানাটি কোন ধরণের ডেটা হয় তা সম্পর্কে কোনও তথ্য অন্তর্ভুক্ত করে না?" হতে পারে. আপনি যদি ডিবাগ ডেটা দিয়ে কম্পাইল করেন তবে ডিবাগ ডেটাতে ভেরিয়েবলের নাম, ঠিকানা এবং ধরণের তথ্য অন্তর্ভুক্ত থাকবে। এবং কখনও কখনও সেই ডিবাগ ডেটা .exe ফাইলের মধ্যে সংরক্ষণ করা হয় (বাইনারি স্ট্রিম হিসাবে)। তবে এটি এক্সিকিউটেবল কোডের অংশ নয়, এবং এটি অ্যাপ্লিকেশন নিজেই ব্যবহার করে না, কেবল কোনও ডিবাগার দ্বারা।
বেন ভয়েগট

12

কম্পিউটার কী ঠিকানাগুলি কী তা "জানে না" তবে আপনার প্রোগ্রামের নির্দেশাবলীতে কী বেকড রয়েছে তা কী তা সম্পর্কে জ্ঞান।

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

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

খারাপ উপমা সময়: একটি জটিল শিপিং গুদাম কল্পনা করুন, যেখানে গুদাম মেমরি এবং লোকেরা জিনিস বাছাই করে সিপিইউ। গুদাম 'প্রোগ্রাম' এর একটি অংশ শেল্ফটিতে বিভিন্ন আইটেম রাখে। আরেকটি প্রোগ্রাম গিয়ে গুদাম থেকে আইটেমগুলি ধরে এবং বাক্সগুলিতে রাখে। যখন তাদের টেনে নামানো হয়, তাদের চেক করা হয় না, তারা কেবল বাক্সে যায়। সিঙ্কে কাজ করা প্রতিটি জিনিস দিয়ে পুরো গুদামটি কাজ করে, সঠিক আইটেমগুলি সর্বদা সঠিক সময়ে সঠিক জায়গায় থাকে, অন্যথায় সমস্ত ঘটনা ক্র্যাশ করে, ঠিক যেমন একটি আসল প্রোগ্রামে।


আপনি কীভাবে ব্যাখ্যা করবেন যদি সিপিইউ একটি রেজিস্টারে 0x00000061 খুঁজে পায় এবং এটি আনে; এবং কল্পনা করুন যে কনসোল প্রোগ্রামটি আউটপুট করার জন্য অনুভূতি হিসাবে একটি অক্ষর হিসাবে আউটপুট হবে। আপনি কি বোঝাতে চেয়েছেন যে সেই এক্স ফাইলটিতে এমন কিছু নির্দেশ কোড রয়েছে যা 0x00000061 এর ঠিকানাটি একটি চর এবং জানে এবং ASCII টেবিলটি ব্যবহার করে একটি চরিত্রে রূপান্তরিত করে?
ব্যবহারকারী 16307

7
মনে রাখবেন যে "সমস্ত কিছু ক্র্যাশ হয়ে গেছে" প্রকৃতপক্ষে সেরা ক্ষেত্রে। "অদ্ভুত জিনিসগুলি ঘটে" এটি দ্বিতীয় সর্বোত্তম পরিস্থিতি, "সূক্ষ্মভাবে-উদ্ভট জিনিসগুলি ঘটে" আরও খারাপ এবং সবচেয়ে খারাপ ঘটনাটি হ'ল "আপনার পিঠের পিছনে এমন ঘটনা ঘটে যে কেউ নিজের ইচ্ছাকৃতভাবে যেভাবে চায় সেভাবে ঘটানোর জন্য হেরফের করেছিল", ওরফে একটি নিরাপত্তা শোষণ।
Jörg ডব্লু মিটাগ

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

1
@ জার্গডব্লিউমিত্যাগ: সত্যই। আমি উদাহরণ হিসাবে একটি বাফার ওভারফ্লো উল্লেখ করার বিষয়ে ভেবেছিলাম তবে সিদ্ধান্ত নিয়েছি এটি কেবল জিনিসগুলিকে আরও বিভ্রান্ত করবে।
09-এ

@ ব্যবহারকারী 16307: স্ক্রিনে ডেটা প্রদর্শন করে এমন একটি প্রোগ্রাম। Traditionalতিহ্যবাহী ইউনিক্সে এটি একটি টার্মিনাল (DEC VT100 সিরিয়াল টার্মিনাল অনুকরণ করে এমন একটি সফ্টওয়্যারের টুকরো - একটি মনিটর এবং কীবোর্ড সহ একটি হার্ডওয়্যার ডিভাইস যা তার মোডেমটিতে যা আসে তা মনিটরে প্রদর্শন করে এবং এর কীবোর্ডে টাইপযুক্ত যা কিছু পাঠায় তা তার মডেমকে প্রেরণ করে)। ডসটিতে এটি ডস (আসলে আপনার ভিজিএ কার্ডের পাঠ্য মোড তবে এটি উপেক্ষা করতে দেয়) এবং উইন্ডোজে এটি কমান্ড ডট কম। আপনার প্রোগ্রামটি জানেন না যে এটি আসলে স্ট্রিংগুলি মুদ্রণ করছে, এটি কেবল বাইটস (সংখ্যা) এর ক্রম প্রিন্ট করছে।
slebetman

8

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

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


আমি যা বুঝতে পারি না তা হ'ল কম্পিউটার কীভাবে জানতে পারে যখন এটি কোনও ভেরিয়েবলের মান এবং ঠিকানা যেমন 10001 পড়বে যখন কোনও আন্ত বা চর হয়। কল্পনা করুন যে আমি যেকোন প্রোগ্রামে ক্লিক করেছি e তত্ক্ষণাত্ কোডটি কার্যকর করা শুরু করে। এই এক্সি ফাইলটিতে ভেরিয়েবলগুলি হিসাবে বা চরের মতো সংরক্ষণ করা হয় সে সম্পর্কে তথ্য অন্তর্ভুক্ত থাকে? -
ব্যবহারকারী 16307

@ ইউজার 16307 না, কিছু ইন্ট বা চর থাকলে সে সম্পর্কে অতিরিক্ত কোনও তথ্য নেই। আমি পরে আর কোনও উদাহরণ স্টাফ যুক্ত করব, ধরে নিলাম আর কেউ আমাকে এতে মারবে না।
বিট্রি

1
@ ব্যবহারকারী 16307: এক্সি ফাইলটিতে অপ্রত্যক্ষভাবে সেই তথ্য রয়েছে। প্রোগ্রামটি সম্পাদনকারী প্রসেসর প্রোগ্রামটি লেখার সময় ব্যবহৃত ধরণের বিষয়ে চিন্তা করে না, তবে এর বেশিরভাগ অংশ বিভিন্ন মেমরির অবস্থানগুলিতে অ্যাক্সেসের জন্য ব্যবহৃত নির্দেশাবলী থেকে অনুমান করা যায়।
বার্ট ভ্যান ইনজেন শেহেনো

@ ব্যবহারকারী 16307 আসলে কিছুটা অতিরিক্ত তথ্য রয়েছে। এক্স ফাইলগুলি জানে যে কোনও পূর্ণসংখ্যা 4 বাইট হয় তাই যখন আপনি "int" লিখুন তখন সংকলকটি চলকটির জন্য 4 বাইট সংরক্ষণ করে এবং এর পরে কোনও এবং অন্যান্য ভেরিয়েবলের ঠিকানা গণনা করতে পারে।
এসবেন স্কোভ পেডারসেন

1
@ user16307 কোন ব্যবহারিক পার্থক্য মধ্যে পার্থক্য (টাইপ আকার পাশে) হল int a = 65এবং char b = 'A'একবার কোড কম্পাইল করা হয়।

6

বেশিরভাগ প্রসেসর বিভিন্ন ধরণের ডেটা নিয়ে কাজ করার জন্য বিভিন্ন নির্দেশনা সরবরাহ করে, তাই টাইপ তথ্য সাধারণত উত্পন্ন মেশিন কোডে "বেকড" হয়। অতিরিক্ত ধরণের মেটাডেটা সঞ্চয় করার দরকার নেই।

কিছু দৃ concrete় উদাহরণ সাহায্য করতে পারে। নীচে মেশিন কোডটি সিসিইএস লিনাক্স এন্টারপ্রাইজ সার্ভার (এসইএলএস) 10 চালিত একটি x86_64 সিস্টেমে gcc 4.1.2 ব্যবহার করে তৈরি করা হয়েছিল।

নিম্নলিখিত উত্স কোড অনুমান করুন:

int main( void )
{
  int x, y, z;

  x = 1;
  y = 2;

  z = x + y;

  return 0;
}

এখানে উত্স অনুসারে উত্পন্ন সমাবেশ কোডের মাংস এখানে রয়েছে (ব্যবহার করে gcc -S), আমার মন্তব্য দ্বারা যুক্ত হয়েছে:

main:
.LFB2:
        pushq   %rbp               ;; save the current frame pointer value
.LCFI0:
        movq    %rsp, %rbp         ;; make the current stack pointer value the new frame pointer value
.LCFI1:                            
        movl    $1, -12(%rbp)      ;; x = 1
        movl    $2, -8(%rbp)       ;; y = 2
        movl    -8(%rbp), %eax     ;; copy the value of y to the eax register
        addl    -12(%rbp), %eax    ;; add the value of x to the eax register
        movl    %eax, -4(%rbp)     ;; copy the value in eax to z
        movl    $0, %eax           ;; eax gets the return value of the function
        leave                      ;; exit and restore the stack
        ret

কিছু অতিরিক্ত জিনিস রয়েছে যা অনুসরণ করে retতবে এটি আলোচনার সাথে প্রাসঙ্গিক নয়।

%eaxএকটি 32-বিট সাধারণ উদ্দেশ্যে ডেটা রেজিস্টার। স্ট্যাক পয়েন্টারটি%rsp সংরক্ষণের জন্য সংরক্ষিত একটি -৪-বিট রেজিস্টার , যাতে স্ট্যাকের উপরে ধাক্কা দেওয়া শেষ জিনিসটির ঠিকানা রয়েছে। ফ্রেম পয়েন্টার সংরক্ষণের জন্য সংরক্ষিত একটি 64৪-বিট রেজিস্টার , এতে বর্তমান স্ট্যাক ফ্রেমের ঠিকানা রয়েছে । আপনি যখন কোনও ফাংশন প্রবেশ করেন তখন স্ট্যাকের উপর একটি স্ট্যাক ফ্রেম তৈরি করা হয় এবং এটি ফাংশনের আর্গুমেন্ট এবং স্থানীয় ভেরিয়েবলের জন্য স্থান সংরক্ষণ করে। ফ্রেম পয়েন্টার থেকে অফসেট ব্যবহার করে আর্গুমেন্ট এবং ভেরিয়েবল অ্যাক্সেস করা হয়। এই ক্ষেত্রে, ভেরিয়েবলের জন্য মেমরিটি সঞ্চিত ঠিকানাটির "নীচে" 12 বাইট থাকে । %rbpx%rbp

উপরের কোডে, আমরা নির্দেশের সাহায্যে রেজিস্টারটিতে x(1 টি সংরক্ষিত -12(%rbp)) এর পূর্ণসংখ্যা মানটি অনুলিপি করি , যা এক অবস্থান থেকে অন্য জায়গায় 32-বিট শব্দ অনুলিপি করতে ব্যবহৃত হয়। তারপরে আমরা কল করি , যা ইতিমধ্যে অন্তর্ভুক্ত মানের সাথে (সঞ্চিত ) এর পূর্ণসংখ্যা মান যুক্ত করে । তারপরে আমরা ফলাফলটি সংরক্ষণ করি যা হ'ল । %eaxmovladdly-8(%rbp)%eax-4(%rbp)z

এখন এটি পরিবর্তন করা যাক আমরা doubleমানগুলির পরিবর্তে মানগুলি নিয়ে কাজ করছি int:

int main( void )
{
  double x, y, z;

  x = 1;
  y = 2;

  z = x + y;

  return 0;
}

gcc -Sআবার দৌড়ানো আমাদের দেয়:

main:
.LFB2:
        pushq   %rbp                              
.LCFI0:
        movq    %rsp, %rbp
.LCFI1:
        movabsq $4607182418800017408, %rax ;; copy literal 64-bit floating-point representation of 1.00 to rax
        movq    %rax, -24(%rbp)            ;; save rax to x
        movabsq $4611686018427387904, %rax ;; copy literal 64-bit floating-point representation of 2.00 to rax
        movq    %rax, -16(%rbp)            ;; save rax to y
        movsd   -24(%rbp), %xmm0           ;; copy value of x to xmm0 register
        addsd   -16(%rbp), %xmm0           ;; add value of y to xmm0 register
        movsd   %xmm0, -8(%rbp)            ;; save result to z
        movl    $0, %eax                   ;; eax gets return value of function
        leave                              ;; exit and restore the stack
        ret

বিভিন্ন পার্থক্য। movlএবং এর পরিবর্তে addl, আমরা ব্যবহার করি movsdএবং addsd(ডাবল-প্রিসিশন ফ্লোটগুলি নির্ধারণ এবং যুক্ত করি)। অন্তর্বর্তীকালীন মানগুলি সংরক্ষণ করার পরিবর্তে %eax, আমরা ব্যবহার করি %xmm0

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


4

Icallyতিহাসিকভাবে , সি মেমরিটিকে সংখ্যাযুক্ত স্লট ধরণের কয়েকটি গ্রুপের সমন্বয়ে বিবেচনা করেunsigned char(এটি "বাইট" নামেও পরিচিত, যদিও এটি সর্বদা 8 বিটের প্রয়োজন হয় না)। যে কোনও কোড যা মেমরিতে সঞ্চিত কিছু ব্যবহার করেছিল সেগুলি কোন স্লট বা স্লট তথ্যগুলিতে সঞ্চিত ছিল তা জানতে হবে এবং তথ্যের সাথে কী করা উচিত তা জানতে হবে [উদাহরণস্বরূপ "123: 456 ঠিকানায় শুরু হওয়া চারটি বাইটকে 32-বিট হিসাবে ব্যাখ্যা করুন ফ্লোটিং-পয়েন্ট মান "বা" সর্বাধিক গণিত পরিমাণের নীচের 16 বিটগুলিকে 343: 678 ঠিকানায় শুরু করে দুটি বাইটে সংরক্ষণ করুন] মেমরিটি নিজেই জানতে পারে না বা মেমরি স্লটে সংরক্ষণ করা মানগুলি কী বোঝায় না তা যদি বোঝায় না If কোডটি এক প্রকারের সাহায্যে মেমরি লেখার চেষ্টা করেছিল এবং এটিকে অন্য হিসাবে পড়তে চেষ্টা করেছিল, লেখার দ্বারা সঞ্চিত বিট প্যাটার্নগুলি দ্বিতীয় প্রকারের নিয়ম অনুসারে ব্যাখ্যা করা হবে, যার ফলাফল যাই হোক না কেন।

উদাহরণস্বরূপ, যদি কোডটি 0x1234567832-বিটে সংরক্ষণ করা হয় unsigned intএবং unsigned intতার ঠিকানা এবং উপরের একটি থেকে পরপর দুটি 16-বিট মান পড়ার চেষ্টা করা হয় , তবে কোডটির অর্ধেকটি unsigned intকোথায় সংরক্ষণ করা হয়েছিল তার উপর নির্ভর করে কোডটি মানগুলি পড়তে পারে 0x1234 এবং 0x5678, বা 0x5678 এবং 0x1234।

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

প্রদত্ত:

unsigned int a = 0x12345678;
unsigned short p = (unsigned short *)&a;
printf("0x%04X",*p);

কিছু বাস্তবায়ন 0x1234 মুদ্রণ করতে পারে এবং অন্যরা 0x5678 মুদ্রণ করতে পারে, তবে C99 স্ট্যান্ডার্ডের অধীনে "FRINK RULES!" মুদ্রণ করা বাস্তবায়নের জন্য এটি আইনী হবে! বা এই তত্ত্বের ভিত্তিতে অন্য যে কোনও কিছু করা উচিত যে মেমরির অবস্থানগুলির aজন্য এমন হার্ডওয়ার অন্তর্ভুক্ত রাখা বৈধ হবে যা তাদের লেখার জন্য কোন ধরণের রেকর্ডিং রেকর্ড করে, এবং এই জাতীয় হার্ডওয়্যার দ্বারা কোনও ফ্যাশনে একটি অবৈধ পড়ার প্রচেষ্টাতে প্রতিক্রিয়া জানানো, কারণ সহ "স্পষ্ট বিধি!" আউটপুট হতে।

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

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

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


1
আরটিটিআই নেই কীভাবে বুঝতে পারে না এমন কাউকে ছাঁটাই করার সময় অপরিজ্ঞাত আচরণের কথা উল্লেখ করা আন্তঃজ্ঞানসম্মত বলে মনে হয়
কোল জনসন

@ কোলজোনসন: এটি খুব খারাপ যে ২০০৯-এর প্রাক-সংকলকগুলির 99% দ্বারা সমর্থিত সি এর উপভাষার জন্য কোনও আনুষ্ঠানিক নাম বা মান নেই, যেহেতু একটি শিক্ষাদানের দৃষ্টিভঙ্গি এবং ব্যবহারিক উভয় দিক থেকেই তাদের মূল ভাষা ভিন্ন বিবেচনা করা উচিত। যেহেতু একই নামটি 35 বছরেরও বেশি সময় ধরে অনুমানযোগ্য এবং অনুকূলকরণযোগ্য আচরণের বিবর্তনে উভয় ভাষাকেই দেওয়া হয়েছে, তাত্পর্যটি অপ্টিমাইজেশনের জন্য অনুমিত উদ্দেশ্য হিসাবে এই ধরনের আচরণগুলি ছুঁড়ে ফেলেছে তাই তাদের মধ্যে ভিন্নভাবে কাজ করে এমন বিষয়ে কথা বলার সময় বিভ্রান্তি এড়ানো কঠিন to ।
সুপারক্যাট

Icallyতিহাসিকভাবে সি লিস্প মেশিনগুলিতে দৌড়েছিল যা ধরণের ধরণের খেলায় অনুমতি দেয় না। আমি নিশ্চিত যে 30 বছর পূর্বে দেখা অনেক "অনুমানযোগ্য এবং অনুকূলকরণযোগ্য আচরণ" ভ্যাক্সে বিএসডি ইউনিক্স ছাড়া কোথাও কাজ করেনি।
পেশাদাররা

@ প্রসফাইলেস: সম্ভবত "১৯৯৯ থেকে ২০০৯ অবধি ব্যবহৃত 99% সংকলক" আরও সঠিক হতে পারে? এমনকি যখন সংকলকগুলির কাছে কিছু বরং আক্রমণাত্মক পূর্ণসংখ্যার অপ্টিমাইজেশনের জন্য বিকল্প ছিল, তারা কেবল সেগুলি ছিল - বিকল্পগুলি। আমি জানি না যে আমি 1999 এর আগে কখনও একটি সংকলক দেখেছি যার মোডে এমন গ্যারান্টি ছিল না যে প্রদত্ত int x,y,z;এক্সপ্রেশনটি x*y > z1 বা 0 রিটার্ন ব্যতীত অন্য কিছু করবে না, বা যেখানে অ্যালাইজিং লঙ্ঘনের কোনও প্রভাব থাকবে সংকলক যথেচ্ছভাবে পুরানো বা নতুন মান হয় ফিরে দেওয়া ছাড়া অন্য।
সুপারক্যাট

1
... যেখানে unsigned charটাইপ তৈরি করতে ব্যবহৃত মানগুলি "এসেছে"। যদি কোনও প্রোগ্রাম একটি পয়েন্টারকে একটিতে পচিয়ে যায় unsigned char[], তার হেক্স বিষয়বস্তুটি স্ক্রিনে সংক্ষিপ্তভাবে প্রদর্শন করুন এবং তারপরে পয়েন্টারটি, the unsigned char[], এবং পরে কীবোর্ড থেকে কিছু হেক্স নম্বর গ্রহণ করুন, সেগুলিকে একটি পয়েন্টারে আবার অনুলিপি করুন এবং তারপরে সেই পয়েন্টারটিকে অবলম্বন করুন , আচরণটি সেই ক্ষেত্রে যেখানে সংখ্যায় টাইপ করা হত সেই সংখ্যার সাথে মেলে যা সংখ্যায় প্রদর্শিত হয়েছিল।
সুপারক্যাট

3

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

সাধারণত সংকলকটি আপনার জন্য এটি যত্ন করে এবং আপনি যদি কিছু ভুল করেন তবে আপনি একটি সংকলন-সময় ত্রুটি (বা সতর্কতা) পাবেন।


আমি যা বুঝতে পারি না তা হ'ল কম্পিউটার কীভাবে জানতে পারে যখন এটি কোনও ভেরিয়েবলের মান এবং ঠিকানা যেমন 10001 পড়বে যখন কোনও আন্ত বা চর হয়। কল্পনা করুন যে আমি যেকোন প্রোগ্রামে ক্লিক করেছি e তত্ক্ষণাত্ কোডটি কার্যকর করা শুরু করে। এই এক্সি ফাইলটিতে ভেরিয়েবলগুলি হিসাবে বা চরের মতো সংরক্ষণ করা হয় সে সম্পর্কে তথ্য অন্তর্ভুক্ত থাকে? -
ব্যবহারকারী 16307

1
@ ব্যবহারকারী 16307 মূলত না, সমস্ত তথ্য সম্পূর্ণ হারিয়ে গেছে is এটি তথ্য ছাড়াই ডানদিকে কাজ করার জন্য যথেষ্টভাবে ডিজাইন করা মেশিন কোডের উপর নির্ভর করে। সমস্ত কম্পিউটারের যত্নশীল হ'ল ঠিকানায় আট সারিতে বিট রয়েছে 10001। মেশিন বা অ্যাসেম্বলি কোড লেখার সময় ম্যানুয়ালি এই জাতীয় জিনিসগুলি চালিয়ে যাওয়া আপনার কাজ বা সংকলকের কাজ, কেস নির্ভর করে either
Panzercrisis

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

আমার প্রশ্নটি দেখুন আমি লিখেছিলাম "যখন একটি সি প্রোগ্রাম কার্যকর হয়?" তারা কি পরোক্ষভাবে নির্দেশ কোডগুলির মধ্যে এক্সপি ফাইলে সঞ্চয় করে এবং শেষ পর্যন্ত মেমোরিতে স্থান নেয় না? আমি এটি আপনার জন্য আবার লিখছি: সিপিইউ যদি একটি রেজিস্টারে 0x00000061 খুঁজে পায় এবং এটি আনে; এবং কল্পনা করুন যে কনসোল প্রোগ্রামটি আউটপুট করার জন্য অনুভূতি হিসাবে একটি অক্ষর হিসাবে আউটপুট হবে। সেই এক্সাই ফাইলটিতে (মেশিন / বাইনারি কোড) এমন কিছু নির্দেশ কোড রয়েছে যা 0x00000061 এর ঠিকানাটি জানে এবং ASCII টেবিলটি ব্যবহার করে একটি চরিত্রে রূপান্তর করে? যদি তা হয় তবে এর অর্থ হল চার আইটি আইডেন্টিফায়ারগুলি অপ্রত্যক্ষভাবে বাইনারি হয় ???
ব্যবহারকারী 16307

যদি মান 0x61 হয় এবং এটি চর হিসাবে ঘোষণা করা হয় (অর্থাত্ 'এ') এবং আপনি এটি প্রদর্শন করার জন্য একটি রুটিন কল করেন, [অবশেষে] সেই অক্ষরটি প্রদর্শন করার জন্য একটি সিস্টেম কল আসবে। যদি আপনি এটিকে কোনও আন্ত হিসাবে ঘোষণা করেছেন এবং প্রদর্শন রুটিনকে কল করেন, সংকলক 0x61 (দশমিক 97) কে ASCII সিকোয়েন্স 0x39, 0x37 ('9', '7') এ রূপান্তর করতে কোড উত্পন্ন করতে জানবে। নীচের লাইন: উত্পন্ন কোডটি আলাদা কারণ সংকলক তাদের আলাদাভাবে আচরণ করতে জানে।
মাইক হ্যারিস

3

আপনি মধ্যে পার্থক্য আছে compiletimeএবং runtimeএক হাত এবং এর codeএবং dataঅন্যদিকে।

একটি মেশিন দৃষ্টিকোণ থেকে এটা কি আপনি কল মধ্যে কোন পার্থক্য নেই codeবা instructionsএবং আপনি কি কল data। এটি সমস্ত সংখ্যায় নেমে আসে। তবে কিছু সিকোয়েনস - আমরা কী বলব code- আমরা কী দরকারী তা কিছু করি, অন্যরা কেবল crashমেশিনটি করে।

সিপিইউ দ্বারা সম্পাদিত কাজটি একটি সহজ 4 ধাপের লুপ:

  • প্রদত্ত ঠিকানা থেকে "ডেটা" আনুন
  • নির্দেশটি ডিকোড করুন (অর্থাত্ সংখ্যাকে "হিসাবে ব্যাখ্যা করুন" instruction)
  • একটি কার্যকর ঠিকানা পড়ুন
  • কার্যকর এবং স্টোর ফলাফল

একে নির্দেশ চক্র বলা হয় ।

আমি পড়েছি যে এ এবং 4 র্যামের ঠিকানাগুলিতে এখানে সঞ্চয় করা আছে। তবে কি এবং এক্স সম্পর্কে কী?

aএবং xভেরিয়েবলগুলি, যা ঠিকানাগুলির জন্য স্থানধারক, যেখানে প্রোগ্রামটি ভেরিয়েবলগুলির "সামগ্রী" সন্ধান করতে পারে। সুতরাং, যে কোনও সময় চলকটি aব্যবহৃত হয়, কার্যকরভাবেa ব্যবহৃত সামগ্রীর ঠিকানা রয়েছে ।

সবচেয়ে বিভ্রান্তিকরভাবে, কার্যকরভাবে কীভাবে জানতে পারে যে একটি একটি চর এবং x একটি অন্তর্নিহিত?

মৃত্যুদণ্ড কার্যকর জানে না। ভূমিকাতে যা বলা হয়েছিল সেগুলি থেকে, সিপিইউ কেবল তথ্য এনে দেয় এবং এই ডেটাটিকে নির্দেশনা হিসাবে ব্যাখ্যা করে।

Printf, -function "জানি" থেকে, ইনপুট কি ধরনের তা নির্বাণ হয়, অর্থাত তার ফলে কোড অধিকার নির্দেশাবলী দেয় কিভাবে বিশেষ মেমরির অংশে অন্তর্ভুক্ত করার সঙ্গে মোকাবিলা করার জন্য ডিজাইন করা হয়। অবশ্যই, আজেবাজে আউটপুট জেনারেট করা সম্ভব: একটি ঠিকানা ব্যবহার করে, যেখানে "% s" এর সাথে কোনও স্ট্রিং সংরক্ষণ করা হয় না printf()তার ফলস্বরূপ বাজে কথা বলা আউটপুট কেবল একটি এলোমেলো মেমরি অবস্থান দ্বারা বন্ধ হয়ে যায়, যেখানে 0 ( \0) থাকে।

একই হিসাবে একটি প্রোগ্রামের এন্ট্রি পয়েন্ট। সি 64 এর অধীনে আপনার প্রোগ্রামগুলি (প্রায়) প্রতিটি পরিচিত ঠিকানাতে রাখা সম্ভব ছিল। বিধানসভা-প্রোগ্রামগুলি একটি নির্দেশের sysপরে একটি ঠিকানা দিয়ে শুরু করা sys 49152হয়েছিল : আপনার এসেম্বলারের কোডটি রাখার একটি সাধারণ জায়গা। তবে কিছুই আপনাকে উদাহরণস্বরূপ গ্রাফিকাল ডেটা লোড করতে বাধা দেয় নি 49152, ফলে এই বিন্দু থেকে "শুরু" করার পরে একটি মেশিন ক্রাশ হয় sh এই ক্ষেত্রে, নির্দেশ চক্রটি "গ্রাফিকাল ডেটা" পড়ার সাথে সাথে "কোড" হিসাবে ব্যাখ্যা করার চেষ্টা করে শুরু হয়েছিল (যা অবশ্যই কোনও অর্থ দেয়নি); এর প্রভাবগুলি কিছুটা অবাক করে দিয়েছিল;)

ধরা যাক যে কোনও মান 10011001 হিসাবে র‌্যামের কোথাও সঞ্চিত রয়েছে; যদি আমি প্রোগ্রামটি করি যা কোডটি কার্যকর করে, তবে আমি কীভাবে জানব যে এই 10011001 একটি গৃহস্থালি বা কোনও int?

যেমনটি বলা হয়েছে: "প্রসঙ্গ" - যেমন পূর্ববর্তী এবং পরবর্তী নির্দেশাবলী - আমরা এটি যেভাবে চাই তা উপাত্তে চিকিত্সা করতে সহায়তা করে। যন্ত্রের দৃষ্টিকোণ থেকে কোনও স্মৃতি অবস্থানের মধ্যে কোনও পার্থক্য নেই। intএবং charএটি কেবল শব্দভান্ডার, যা বোঝায় compiletime; runtime(বিধানসভা স্তরে) চলাকালীন , কোনও charবা নেই int

আমি যেটা বুঝতে পারি না তা হ'ল কম্পিউটার কীভাবে জানে, যখন এটি 10001 এর মতো কোনও ঠিকানা থেকে কোনও ভেরিয়েবলের মান পড়বে, তা এটি কোনও আন্ত বা চর হোক।

কম্পিউটার কিছুই জানে না। প্রোগ্রামার আছে। সংকলিত কোডটি প্রসঙ্গটি তৈরি করে , যা মানুষের জন্য অর্থপূর্ণ ফলাফল উত্পন্ন করার জন্য প্রয়োজনীয়।

এই নির্বাহযোগ্য ফাইলে কি সঞ্চিত ভেরিয়েবলগুলি টাইপ ইন্ট বা চরের টাইপের তথ্য অন্তর্ভুক্ত করে?

হ্যাঁ এবং কোন । তথ্য, এটি একটি intবা একটি charহারিয়ে গেছে। তবে অন্যদিকে, প্রসঙ্গটি (নির্দেশাবলী যা জানায় যে কীভাবে মেমরির অবস্থানগুলি, যেখানে ডেটা সংরক্ষণ করা হয় সেগুলি কীভাবে মোকাবেলা করা যায়) সংরক্ষণ করা হয়; তাই implicitely হ্যাঁ, "তথ্য" হয় implicitely পাওয়া যায়।


সংকলন সময় এবং রানটাইমের মধ্যে দুর্দান্ত পার্থক্য।
মাইকেল ব্ল্যাকবার্ন

2

আসুন এই আলোচনাটি কেবল সি ভাষায় রাখি ।

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

char a = 'A';
int x = 4;

আসুন প্রতিটি অংশ বিশ্লেষণ করার চেষ্টা করুন:

চর / ইনট ডাটা টাইপ হিসাবে পরিচিত। এগুলি সংকলককে মেমরি বরাদ্দ করতে বলে। charএটির ক্ষেত্রে 1 বাইট এবং int2 বাইট হবে। (দয়া করে মনে রাখবেন এই মেমরির আকারটি আবার মাইক্রোপ্রসেসরের উপর নির্ভরশীল)।

a / x সনাক্তকারী হিসাবে পরিচিত। এখন এগুলি আপনি র্যামে মেমরির অবস্থানগুলিতে প্রদত্ত "ব্যবহারকারী বান্ধব" নামগুলি বলতে পারেন।

= সংকলককে 'এ' মেমরির অবস্থানের aস্থানে এবং 4 মেমরির স্থানে সঞ্চয় করতে বলে x

সুতরাং ইনট / চর ডেটা টাইপ শনাক্তকরণগুলি কেবলমাত্র সংকলক দ্বারা ব্যবহৃত হয় এবং প্রোগ্রাম সঞ্চালনের সময় মাইক্রোপ্রসেসর দ্বারা নয়। সুতরাং এগুলি স্মৃতিতে সংরক্ষণ করা হয় না।


ঠিক আছে / int চার্ট তথ্য ধরণের শনাক্তকারীরা ভেরিয়েবল হিসাবে মেমরিতে সরাসরি সংরক্ষণ করা হয় না, তবে তারা কি পরোক্ষভাবে নির্দেশ কোডগুলির মধ্যে এক্সপি ফাইলে সঞ্চিত থাকে এবং শেষ পর্যন্ত মেমোরিতে স্থান নেয়? আমি এটি আপনার জন্য আবার লিখছি: সিপিইউ যদি একটি রেজিস্টারে 0x00000061 খুঁজে পায় এবং এটি আনে; এবং কল্পনা করুন যে কনসোল প্রোগ্রামটি আউটপুট করার জন্য অনুভূতি হিসাবে একটি অক্ষর হিসাবে আউটপুট হবে। সেই এক্সাই ফাইলটিতে (মেশিন / বাইনারি কোড) এমন কিছু নির্দেশ কোড রয়েছে যা 0x00000061 এর ঠিকানাটি জানে এবং ASCII টেবিলটি ব্যবহার করে একটি চরিত্রে রূপান্তর করে? যদি তা হয় তবে এর অর্থ হল চার আইটি আইডেন্টিফায়ারগুলি অপ্রত্যক্ষভাবে বাইনারি হয় ???
ব্যবহারকারী 16307

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

2

আমার উত্তরটি এখানে কিছুটা সরল করা হয়েছে এবং এটি কেবল সি-তে উল্লেখ করবে

না, টাইপ তথ্য প্রোগ্রামে সঞ্চিত হয় না।

intবা charসিপিইউতে সূচকগুলি টাইপ করে না; শুধুমাত্র সংকলক

সংকলক দ্বারা নির্মিত এপিকে intভেরিয়েবলটি হিসাবে ঘোষিত হলে ম্যানিপুলেট করার জন্য নির্দেশাবলী থাকবে int। তেমনিভাবে char, চলকটি একটি হিসাবে ঘোষিত হলে , এক্সে ম্যানেজ করার নির্দেশাবলী থাকবে char

সি তে:

int main()
{
    int a = 65;
    char b = 'A';
    if(a == b)
    {
        printf("Well, what do you know. A char can equal an int.\n");
    }
    return 0;
}

এই প্রোগ্রামটি প্রিন্ট হবে তার বার্তা, যেহেতু charএবং intআছে একই মান উপস্থিত RAM- র মধ্যে।

এখন, আপনি হতাশ হয় যদি কিভাবে printfআউটপুট পরিচালনা করে 65একটি জন্য intএবং Aএকটি জন্য char, যে কারণ আপনি "বিন্যাস STRING" এর মধ্যে নির্দিষ্ট করতে হবে কিভাবে printfআচরণ করা উচিত মান
(উদাহরণস্বরূপ, %cঅর্থটিকে মান হিসাবে বিবেচনা করা charএবং এর %dঅর্থ মানটিকে পূর্ণসংখ্যা হিসাবে বিবেচনা করা; একই মান উভয় উপায়েই করা উচিত))


2
আমি আশা করছিলাম যে কেউ কেউ ব্যবহার করে উদাহরণ ব্যবহার করবে printf। @ ওপ: int a = 65; printf("%c", a)আউটপুট দেবে 'A'। কেন? কারণ প্রসেসরের যত্ন নেই। এটির জন্য, এটি সমস্ত দেখায় বিট। আপনার প্রোগ্রাম প্রসেসরকে 65 (কাকতালীয়ভাবে 'A'ASCII এর মান ) সংরক্ষণ করতে aএবং তারপরে একটি চরিত্র আউটপুট করতে বলেছিল যা আনন্দের সাথে করে। কেন? কারণ এটা যত্ন নেই।
কোল জনসন

তবে কেন কেউ কেউ এখানে সি # ক্ষেত্রে বলেন, এটি গল্প নয়? আমি অন্য কিছু মন্তব্য পড়েছি এবং তারা সি # এবং সি ++ এ গল্পে (ডেটা ধরণের তথ্যগুলি) আলাদা এবং এমনকি সিপিইউ কম্পিউটিংটি করে না। সে সম্পর্কে কোন ধারণা?
ব্যবহারকারী 16307

@ user16307 যদি সিপিইউ কম্পিউটিংটি না করে তবে প্রোগ্রামটি চলছে না। :) সি # হিসাবে, আমি জানি না, তবে আমি মনে করি আমার উত্তরটি সেখানেও প্রযোজ্য। সি ++ এর জন্য, আমি জানি আমার উত্তরটি সেখানে প্রযোজ্য।
বেনজিওবি

0

সর্বনিম্ন স্তরে, প্রকৃত শারীরিক সিপিইউতে কোনও প্রকার নেই (ভাসমান পয়েন্ট ইউনিটগুলি উপেক্ষা করে)। বিট মাত্র নিদর্শন। একটি কম্পিউটার বিটগুলির নিদর্শনগুলি খুব, খুব দ্রুত চালিত করে কাজ করে।

এটিই সিপিইউর যা কিছু করে তা সবই করতে পারে। কোনও ইন্ট, বা চরের মতো জিনিস নেই।

x = 4 + 5

হিসাবে কার্যকর করা হবে:

  1. রেজিস্টার 1 এ 00000100 লোড করুন
  2. রেজিস্টার 2 এ 00000101 লোড করুন
  3. 2 রেজিস্টার করতে IAd যোগ করুন 1 এবং রেজিস্টার 1 এ স্টোর করুন

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

উত্সে প্রদত্ত প্রকারের উপর ভিত্তি করে সঠিক নির্দেশিকাটি বেছে নিতে সংকলকটিতে রয়েছে, তবে সিপিইউ দ্বারা চালিত প্রকৃত মেশিন কোডে কোথাও কোনও প্রকার নেই।

সম্পাদনা: নোট করুন যে প্রকৃত মেশিন কোডটি আসলে 4 বা 5 বা কোথাও পূর্ণসংখ্যার উল্লেখ করে না। এটি বিটের মাত্র দুটি নিদর্শন, এবং এমন একটি নির্দেশ যা দুটি বিট নিদর্শন গ্রহণ করে, ধরে নেয় তারা অন্তর্নিহিত, এবং সেগুলি একসাথে যুক্ত করে।


0

সংক্ষিপ্ত উত্তর, টাইপটি সিপিইউতে সংকেতযুক্ত নির্দেশকটি সংকলকটি জেনারেট করে instructions

তথ্যের ধরণ বা আকার সম্পর্কে তথ্য সরাসরি সংরক্ষণ করা না গেলেও এই ভেরিয়েবলগুলিতে মানগুলি অ্যাক্সেস, সংশোধন এবং সংরক্ষণের সময় সংকলক এই তথ্যটি ট্র্যাক করে রাখে।

এক্সিকিউশনটি কীভাবে জানতে পারে যে ক একটি চর এবং এক্স একটি আন্ত?

এটি হয় না, তবে সংকলক যখন মেশিন কোড তৈরি করে তখন এটি জানে। একটি intএবং একটি charবিভিন্ন আকারের হতে পারে। এমন একটি আর্কিটেকচারে যেখানে একটি xচরটি বাইটের আকার এবং কোনও ইন্টি 4 বাইট হয়, তবে পরিবর্তনশীল 10001 ঠিকানায় নয়, তবে 10002, 10003 এবং 10004 এও হয় When যখন কোডটি xকোনও সিপিইউ রেজিস্ট্রারে মান লোড করতে হয় , এটি 4 বাইট লোড করার জন্য নির্দেশ ব্যবহার করে। কোনও চর লোড করার সময়, এটি 1 বাইট লোড করার নির্দেশিকাটি ব্যবহার করে।

দুটি নির্দেশাবলীর মধ্যে কোনটি নির্বাচন করবেন? সংকলক সংকলনের সময় সিদ্ধান্ত নেয়, এটি মেমরির মানগুলি পরীক্ষা করার পরে রানটাইমে করা হয় না।

পাশাপাশি নোটগুলি বিভিন্ন আকারের হতে পারে তাও নোট করুন। ইন্টেল x86 সিপিইউতে EAX 32 বিট প্রশস্ত, এর অর্ধেকটি এক্স, যা 16, এবং এক্সটি এএএচ এবং এএল, উভয় 8 বিট বিভক্ত।

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

অন্যান্য ক্রিয়াকলাপের ক্ষেত্রেও একই ঘটনা ঘটে। অপারেশনগুলির আকারের উপর নির্ভর করে সংযোজন সম্পাদনের জন্য অনেকগুলি নির্দেশনা রয়েছে এবং এমনকি তারা স্বাক্ষরিত বা স্বাক্ষরযুক্ত না থাকলেও। Https://en.wikedia.org/wiki/ADD_(x86_in تعمیر) দেখুন যা বিভিন্ন সম্ভাব্য সংযোজনগুলির তালিকা করে।

ধরা যাক যে কোনও মান 10011001 হিসাবে র‌্যামের কোথাও সঞ্চিত রয়েছে; যদি আমি প্রোগ্রামটি করি যা কোডটি কার্যকর করে, আমি কীভাবে জানব যে এই 10011001 একটি গৃহস্থালি বা কোনও int নয়

প্রথমত, একটি চরটি 10011001 হবে, তবে কোনও আন্ত হবে 00000000 00000000 00000000 10011001, কারণ সেগুলি বিভিন্ন আকারের (উপরে বর্ণিত একই আকারের কম্পিউটারে)। কিন্তু কেনার ক্ষেত্রে বিবেচনা করতে দেয় signed charবনাম unsigned char

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


তবে কেন কেউ কেউ এখানে সি # ক্ষেত্রে বলেন, এটি গল্প নয়? আমি অন্য কিছু মন্তব্য পড়েছি এবং তারা সি # এবং সি ++ এ গল্পে (ডেটা ধরণের তথ্যগুলি) আলাদা এবং এমনকি সিপিইউ কম্পিউটিংটি করে না। সে সম্পর্কে কোন ধারণা?
ব্যবহারকারী 16307

0

তবে কেন কেউ কেউ এখানে সি # ক্ষেত্রে বলেন, এটি গল্প নয়? আমি অন্য কিছু মন্তব্য পড়েছি এবং তারা সি # এবং সি ++ এ গল্পে (ডেটা ধরণের তথ্যগুলি) আলাদা এবং এমনকি সিপিইউ কম্পিউটিংটি করে না। সে সম্পর্কে কোন ধারণা?

সি # এর মতো টাইপ-চেক করা ভাষায়, টাইপ-চেকিং সংকলক দ্বারা সম্পন্ন হয়। কোড বেঞ্জি লিখেছেন:

int main()
{
    int a = 65;
    char b = 'A';
    if(a == b)
    {
        printf("Well, what do you know. A char can equal an int.\n");
    }
    return 0;
}

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

int a = 42;
string b = "Compilers are awesome.";
double[] c = a * b;

আপনার স্ট্রিং এতে যতটা চুম্বন করেছে তা বিবেচনা করেই কম্পাইলার কেবল এই সি # থেকে মেশিন কোড উত্পন্ন করতে অস্বীকার করবে।


-4

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

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


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

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

2
আমি মনে করি এই উত্তরটি সহায়ক নয়। এটি ওপিকে বোঝার বর্তমান স্তরের বাইরে বিষয়গুলিকে জটিল করে তোলে। এটি স্পষ্ট হয়ে গেছে যে ওপি একটি সিপিইউ + র‌্যামের মূল নির্বাহ মডেলটি বুঝতে পারে না এবং সংকলক কীভাবে সম্পাদনযোগ্য বাইনারিতে প্রতীকী উচ্চ-স্তরের উত্স অনুবাদ করে। ট্যাগযুক্ত মেমরি, আরটিটিআই, লিস্প ইত্যাদি প্রশ্নকর্তাকে আমার মতে যা জানা দরকার তা ছাড়িয়ে যাওয়া, এবং কেবল তাকে / তাকে আরও বিভ্রান্ত করবে।
আন্দ্রেস এফ।

তবে কেন কেউ কেউ এখানে সি # ক্ষেত্রে বলেন, এটি গল্প নয়? আমি অন্য কিছু মন্তব্য পড়েছি এবং তারা সি # এবং সি ++ এ গল্পে (ডেটা ধরণের তথ্যগুলি) আলাদা এবং এমনকি সিপিইউ কম্পিউটিংটি করে না। সে সম্পর্কে কোন ধারণা?
ব্যবহারকারী 16307
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.