অনেক নিম্ন স্তরের প্রোগ্রাম, মেমরি ম্যাপিং এবং এই ধরনের জন্য ধরনের জন্য উদ্বায়ী শব্দ ব্যবহার কিন্তু আমি কি এটা হিসাবে বিভ্রান্ত সাজানোর আছি প্রকৃতই পটভূমিতে আছে। অন্য কথায়, যখন সংকলক মেমরি ঠিকানাটি "অনুকূলিত করে" না দেয় তার অর্থ কী?
অনেক নিম্ন স্তরের প্রোগ্রাম, মেমরি ম্যাপিং এবং এই ধরনের জন্য ধরনের জন্য উদ্বায়ী শব্দ ব্যবহার কিন্তু আমি কি এটা হিসাবে বিভ্রান্ত সাজানোর আছি প্রকৃতই পটভূমিতে আছে। অন্য কথায়, যখন সংকলক মেমরি ঠিকানাটি "অনুকূলিত করে" না দেয় তার অর্থ কী?
উত্তর:
volatile
এর অর্থ অন্য কোনও প্রসেসর বা আই / ও ডিভাইস বা কোনও কিছু আপনার নীচে থেকে চলকটি পরিবর্তন করতে পারে।
একটি সাধারণ পরিবর্তনশীল সহ, আপনার প্রোগ্রামের পদক্ষেপগুলি কেবল এটির পরিবর্তিত হবে। উদাহরণস্বরূপ আপনি যদি 5
কোনও ভেরিয়েবল থেকে পড়ে থাকেন এবং আপনি এটি পরিবর্তন করেন না তবে এটিতে এখনও এটি থাকবে 5
। যেহেতু আপনি এটির উপর নির্ভর করতে পারেন, আপনার প্রোগ্রামটি পরের বার ব্যবহার করতে চাইলে আবার চলকটি পড়তে সময় লাগবে না। সি ++ সংকলকটি কোড তৈরি করতে স্মার্ট, যা কেবলমাত্র মনে রাখে 5
।
তবে আপনি এটি হিসাবে পড়তে পারেন 5
, তারপরে সম্ভবত সিস্টেমটি সেই মেমরিতে ডিস্ক থেকে ডেটা লোড করে, এতে পরিবর্তন করে 500
। আপনি যদি নিজের প্রোগ্রামটি সতেজ মানটি পড়তে চান 500
তবে পূর্বে-পঠিত ব্যবহারটি সম্পর্কে খুব স্মার্ট না হওয়ার জন্য আপনার সংকলকটি দরকার 5
। আপনাকে প্রতিবার মানটি পুনরায় লোড করার জন্য এটি বলতে হবে। এটা কি volatile
করে।
5 বছর বয়সের বাচ্চাদের জন্য একটি সাদৃশ্য ধরা
যাক আপনি কোনও টেবিলে একটি বড় কাগজ রেখেছিলেন। কাগজের এক কোণে, আপনি একটি চলমান গেমের বর্তমান স্কোর লিখুন 3 to 4
,। তারপরে আপনি টেবিলের বিপরীত দিকে যান এবং গেমটি সম্পর্কে একটি গল্প লেখা শুরু করেন। আপনার বন্ধুটি যিনি গেমটি দেখছেন গেমটি এগিয়ে যাওয়ার সাথে সাথে সেই কোণায় স্কোর আপডেট করে। তিনি মুছে ফেলেন 3 to 4
এবং লেখেন 3 to 5
।
আপনি যখন আপনার গল্পে গেমের স্কোর রাখতে যান, আপনি হয় তা করতে পারেন:
3 to 4
, আনন্দের সাথে ধরে নিবেন যে এটি পরিবর্তন হয়নি (বা যদি তা হয় তবে কিছু মনে করেন না), বা3 to 5
এখন ঘটে ) এবং ফিরে হাঁটুন। এভাবেই একটি volatile
পরিবর্তনশীল কাজ করে।volatile
অর্থ দুটি জিনিস:
ভেরিয়েবলের মান কোনও কোড পরিবর্তন না করে পরিবর্তিত হতে পারে। সুতরাং যখনই সংকলক ভেরিয়েবলের মান পড়বে তখন এটি ধরে নিতে পারে না যে এটি শেষবারের মতো পড়া হয়েছিল, বা এটি সঞ্চিত সর্বশেষ মানের সমান, তবে এটি আবার পড়তে হবে।
একটি মানকে একটি উদ্বায়ী ভেরিয়েবলের কাছে সঞ্চয় করার কাজটি "পার্শ্ব প্রতিক্রিয়া" যা বাইরে থেকে লক্ষ্য করা যায়, তাই সংকলককে কোনও মান সংরক্ষণের অ্যাক্টটি সরাতে দেওয়া হয় না; উদাহরণস্বরূপ, যদি দুটি মান একটি সারিতে সঞ্চিত থাকে, তবে সংকলকটিকে অবশ্যই দুটিবার মানটি সঞ্চয় করতে হবে।
উদাহরণ হিসাবে:
i = 2;
i = i;
সংকলকটিকে অবশ্যই দুটি নম্বর সংরক্ষণ করতে হবে , ভেরিয়েবলটি পড়তে হবে, ভেরিয়েবলটি আইতে পড়বে।
অন্য একটি পরিস্থিতি রয়েছে: যদি কোনও ফাংশন ব্যবহার করে setjmp
এবং তারপরে longjmp
ডাকা হয় তবে ফাংশনের সমস্ত অস্থির স্থানীয় ভেরিয়েবলের সর্বশেষ মান সংরক্ষণের গ্যারান্টিযুক্ত - অ-উদ্বায়ী স্থানীয় ভেরিয়েবলগুলির ক্ষেত্রে এটি নয়।
i
এবং মান থাকে pi = &i
তবে x = *pi
তার থেকে একটি পঠন করা যায় i
তবে সেই পঠনটি অস্থির শব্দার্থে গ্যারান্টিযুক্ত নয়।
i
সেই হিসাবে ঘোষণা করা হয় volatile int i
তবে তা pi
অবশ্যই ঘোষণা করতে হবে , কোন volatile int *pi
ক্ষেত্রে *pi
একটি উদ্বায়ী প্রবেশাধিকার আছে, না?
বিমূর্ত ব্যাখ্যা
C এবং C ++ উভয়েরই একটি বিমূর্ত মেশিনের ধারণা রয়েছে । কোডটি যখন কিছু ভেরিয়েবলের মান ব্যবহার করে, তখন অ্যাবস্ট্রাক্ট মেশিনটি বলে যে বাস্তবায়নের ক্ষেত্রে সেই ভেরিয়েবলের মান অ্যাক্সেস করতে হবে। ফর্মের কোডটি statement_A; statement_B; statement_C;
নির্দিষ্ট আদেশ অনুসারে কার্যকর করতে হবে। এই তিনটি বিবৃতিতে সাধারণ অভিব্যক্তিগুলি প্রতিবার ঘটেছিল তা পুনরায় গণনা করতে হবে।
বিমূর্তির ক্রম প্রদত্ত বিমূর্ত মেশিনগুলি অনুসারে, statement_A; statement_B; statement_C;
বাস্তবায়নটি প্রথমে statement_A
তার সম্পূর্ণতা statement_B
এবং তারপরে অবশ্যই সম্পাদন করতে হবে statement_C
। বাস্তবায়ন মনে করতে পারে না যে আপনি age
5 এর মান নির্ধারণ করেছেন। প্রতিটি বিবৃতি যা রেফারেন্সের age
পরিবর্তে সেই পরিবর্তকের মানটি অ্যাক্সেস করতে হবে।
volatile
অ্যাবস্ট্রাক্ট মেশিনের স্পেসিফিকেশন অনুসারে যদি প্রয়োগগুলি কঠোরভাবে সি বা সি ++ কোড কার্যকর করে তবে কীওয়ার্ডটির প্রয়োজন হবে না । সি এবং সি ++ অ্যাবস্ট্রাক্ট মেশিনে নিবন্ধগুলির কোনও ধারণা নেই, সাধারণ সুবে এক্সপ্রেশনগুলির কোনও ধারণা নেই এবং কার্যকর করার আদেশ কঠোর।
উভয় ভাষারও বিধি - বিধান রয়েছে। কোনও বাস্তবায়ন এতক্ষণ মানের সাথে সঙ্গতিপূর্ণ যে বাস্তবায়ন এমনভাবে আচরণ করে যেন এটি বিমূর্ত মেশিনের স্পেসিফিকেশন অনুসারে জিনিসগুলি কার্যকর করে। সংকলকটি অনুমান করতে পারে যে অ-উদ্বায়ী ভেরিয়েবলগুলি অ্যাসাইনমেন্টের মধ্যে মান পরিবর্তন করে না। যতক্ষণ না এটি as-if
নিয়ম ভঙ্গ করে , ক্রমটি কিছু statement_A; statement_B; statement_C;
অংশ statement_C
, তার কিছু অংশ statement_A
, তারপরে সমস্ত statement_B
, তারপরে বাকী statement_A
এবং অবশেষে বাকী অংশগুলি প্রয়োগ করে প্রয়োগ করা যেতে পারে statement_C
।
সেগুলি যদি নিয়মগুলি volatile
ভেরিয়েবলের ক্ষেত্রে প্রযোজ্য না । বিষয়ে volatile
ভেরিয়েবল এবং ফাংশন, একটি বাস্তবায়ন ঠিক কি আপনি এটা বলেন না, এবং ঠিক অনুক্রমে আপনি কিছু করার এটা বলা কি আছে।
বিমূর্ত মেশিনের স্পেসিফিকেশনের একটি খারাপ দিক রয়েছে: এটি আস্তে আস্তে। অন্যান্য ভাষার তুলনায় সি এবং সি ++ এর একটি ইতিবাচক দিক হ'ল এগুলি বেশ দ্রুত। এই বিমূর্ত মেশিনে কোড কার্যকর করা হলে এটি হবে না। যেমন-যদি নিয়ম কি সক্ষম সি এবং সি ++ এত দ্রুত হতে হয়।
ELI5 উত্তর
সংকলক যখন মেমরি ঠিকানাটি "অনুকূলিত করে" না দেয় তার অর্থ কী?
একটি মেমরি ঠিকানার "অপ্টিমাইজ করা" একটি উন্নত ধারণা, এমন একটি জিনিস যা পাঁচ বছরের পুরানো ক্ষমতার ক্ষেত্রের মধ্যে নেই। পাঁচ বছর বয়সী বয়সের অনুসারী আপনি তাদের যা করতে বলছেন ঠিক তেমনই করবে, আর কিছু হবে না, কমও থাকবে না। এর সাথে volatile
, আপনি বাস্তবায়নটিকে পাঁচটির মতো কাজ করতে বলছেন: চিন্তা নেই, অভিনব অপ্টিমাইজেশন নেই। পরিবর্তে, বাস্তবায়নটি কোডটি যা করতে বলছে ঠিক তাই করবে।
(অ-) অস্থিরতা কীভাবে কোডটি অপ্টিমাইজ করা যায় তা সংকলকটির জন্য একটি ইঙ্গিত (উত্পন্ন সমাবেশ-কোড দৃষ্টিকোণ থেকে):
উত্তরগুলি বেশ সামঞ্জস্যপূর্ণ বলে মনে হচ্ছে তবে একটি গুরুত্বপূর্ণ বিষয় অনুপস্থিত। আপনি সংকলককে বলছেন যে আপনি স্থান বরাদ্দ করতে চান এবং প্রতিটি অ্যাক্সেসের জন্য, পড়ুন বা লিখুন, আপনি চান যে এই অ্যাক্সেসটি সম্পাদন করুন। আমরা চাই না যে এটি অ্যাক্সেসগুলি বা কোনও কারণে সেই পরিবর্তনশীলটিকে অপ্টিমাইজ করে।
হ্যাঁ, এর কারণ হ'ল অন্য কেউ আমাদের জন্য সেই মান পরিবর্তন করতে পারে। আর একটি কারণ হ'ল আমরা অন্য কারও জন্য সেই মানটি বদলাতে পারি। এটি অন্য যে আমাদের জন্য এটি পরিবর্তিত হয় বা আমরা যার জন্য এটি পরিবর্তন করছি সেটি হতে পারে হার্ডওয়্যার / যুক্তি বা সফ্টওয়্যার। এটি প্রায়শই খালি ধাতু এম্বেড থাকা প্রোগ্রামগুলিতে নিয়ন্ত্রণ এবং স্ট্যাটাস রেজিস্টারগুলিতে হার্ডওয়্যার থেকে লেখা বা পড়তে নিয়ন্ত্রণের জন্য অ্যাক্সেসগুলি সংজ্ঞায়িত করতে ব্যবহৃত হয়। পাশাপাশি সফটওয়্যারের সাথে সফ্টওয়্যারের সাথে অন্যান্য উত্তরে ব্যাখ্যা করা হয়েছে।
আপনি কোডের কোনও বিভাগকে সময় দেওয়ার চেষ্টা করছেন এবং আপনি প্রশ্নের উদ্বোধনী ভেরিয়েবল ব্যবহার করবেন না (প্রারম্ভিকর সময়, শেষ সময় এবং পার্থক্য) কেবলমাত্র হওয়া দরকার তা নিয়ন্ত্রণে ব্যবহার করতে সক্ষম অস্থিরও দেখতে পাবেন শেষের কাছাকাছি গণনা করা সংকলক সময় পরিমাপগুলির উভয় দিকে ঘুরে বেড়াতে মুক্ত (যেখানে আমরা সেগুলি রেখেছি) তা নয়, এটি অস্থিতিশীলতার সাথে কাক না তবে অভিজ্ঞতা এটি কম সম্ভাবনা দেখায়।
উপলক্ষ্যে, আপনি দেখতে পাবেন এটি কেবল সময় বার্ন করার জন্য ব্যবহৃত হয়েছিল, একটি প্রাথমিক নেতৃত্বের ঝলক, খালি ধাতুর হ্যালো ওয়ার্ল্ড, একটি ভেরিয়েবলের জন্য একটি অস্থির ব্যবহার করতে পারে যা নেতৃত্বের জন্য মানুষের চোখের জন্য সময় বার্ন করার জন্য কিছু সংখ্যককে গণনা করে রাষ্ট্র পরিবর্তন করুন। আরও উন্নত উদাহরণগুলি তারপরে সময়টি পোড়াতে টাইমার বা অন্যান্য ইভেন্টগুলি ব্যবহার করে।
volatile
ভেরিয়েবলের বাইরে পড়তে থাকেন এবং এটি 5 বলে, এবং আপনি পরের বছর আবার এটি পড়েন, আপনি 6 পাওয়ার নিশ্চয়তা