সংকলকটি কি কোনও স্থানীয় অস্থিরতাটিকে ধ্রুবকভাবে ভাঁজ করার অনুমতি দেয়?


25

এই সাধারণ কোডটি বিবেচনা করুন:

void g();

void foo()
{
    volatile bool x = false;
    if (x)
        g();
}

https://godbolt.org/z/I2kBY7

আপনি এটি দেখতে পাচ্ছেন না gccবা clangতেমন সম্ভাব্য কলটিকে অপ্টিমাইজও করতে পারবেন না g। বিমূর্ত যন্ত্র যা অনুমান করা হল: এটা আমার বুঝতে সঠিক volatile, তাই নির্দিষ্ট-ভাঁজ (হার্ডওয়্যার-ম্যাপ যেমন হচ্ছে কারণে) ভেরিয়েবল যে কোনো মুহূর্তে পরিবর্তিত হতে পারে falseমধ্যে আরম্ভের ifচেক ভুল হবে।

তবে এমএসভিসি gসম্পূর্ণরূপে কলটি সরিয়ে দেয় ( volatileযদিও পাঠ্যগুলি রাখে এবং লিখেন !)। এই মান-সম্মতিজনক আচরণ?


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


সম্পাদনা:


3
এটি আমার কাছে সুস্পষ্ট সংকলক বাগের মতো দেখাচ্ছে।
স্যাম বর্ষাভিক

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

3
তবে আমি মনে করি যে ওপির যুক্তিটি যে ভেরিয়েবলটি একটি ডিবাগার দ্বারা সংশোধন করা যেতে পারে যুক্তিসঙ্গত। হতে পারে কেউ এমএসভিসি-তে একটি বাগ রিপোর্ট ফাইল করা উচিত।
ব্রায়ান

2
@ কুরিয়াসগ্যুই এমনকি যদি আপনি ফলাফলটি বাতিল করেন এবং / অথবা সঠিক মান ধরে নেন, আপনি এখনও তা পড়েছেন।
Deduplicator

2
মজার বিষয় এটি x x এর জন্য কেবল তা করে। X86 সংস্করণটি এখনও জি () Godbolt.org/z/nc3Y-f
জেরি যেরেমিয়া

উত্তর:


2

আমার মনে হয় এমএসভিসি আচরণ ব্যাখ্যা করার জন্য [অন্তঃপরিবর্তন] (অনুচ্ছেদে সংখ্যাটি পৃথক) ব্যবহার করা যেতে পারে:

স্বয়ংক্রিয় স্টোরেজ সময়কাল সহ প্রতিটি বস্তুর উদাহরণ তার ব্লকের প্রতিটি প্রবেশের সাথে সম্পর্কিত। এই জাতীয় একটি অবজেক্ট বিদ্যমান এবং ব্লকটি কার্যকর করার সময় এবং সর্বশেষ সঞ্চিত মান ধরে রাখে এবং যখন ব্লকটি স্থগিত করা হয় ...

মানটি একটি অস্থির গ্লুভের মাধ্যমে কোনও পাঠ্য অপসারণের অনুমতি দেয় না, তবে উপরের অনুচ্ছেদে মানটি অনুমান করার অনুমতি হিসাবে ব্যাখ্যা করা যেতে পারে false


বিটিডাব্লু, সি স্ট্যান্ডার্ড (এন 1570 6.2.4 / 2) এটি বলছে

একটি অবজেক্ট বিদ্যমান, একটি স্থির ঠিকানা আছে, এবং তার জীবনকাল জুড়ে এটি সর্বশেষ সঞ্চিত মান ধরে রাখে। 34


34) একটি উদ্বায়ী বস্তুর ক্ষেত্রে, শেষ স্টোরটি প্রোগ্রামে সুস্পষ্ট হওয়া দরকার না।

এটি স্পষ্ট নয় যে সি মেমোরি / অবজেক্ট মডেলটিতে স্বয়ংক্রিয় স্টোরেজ সময়কাল সহ কোনও কোনও অব্যবহৃত স্টোর থাকতে পারে।


সম্মত হন যে সংকলক জানতে পারে যখন লক্ষ্য প্ল্যাটফর্মে অ-স্পষ্টত
এমএম

1
সুতরাং এটি যদি সত্য হয় তবে স্থানীয় অস্থির বস্তুগুলি (কমপক্ষে এমএসভিসিতে) সম্পূর্ণ অর্থহীন? volatileঅপ্টিমাইজেশনের উদ্দেশ্যে অগ্রাহ্য করা থাকলে এমন কিছু রয়েছে যা আপনাকে কেনা (অতিরিক্ত অতিরিক্ত পড়া / লেখাগুলি বাদে) কিনে?
ম্যাক্স ল্যাঙ্গোফ

1
@ ম্যাক্সল্যাংহোফ সম্পূর্ণরূপে অর্থহীন এবং আপনার পছন্দ / প্রত্যাশার কার্যকর প্রভাব না পাওয়ার মধ্যে পার্থক্য রয়েছে।
উত্সাহক

1
ফ্লোটিং পয়েন্ট গণনার @ ম্যাক্সল্যাংহফ ইন্টারমিডিয়েট ফলাফলগুলি কখনও কখনও নির্ভুলতার কারণে 80-বিট রেজিস্ট্রারে উন্নীত হয়। আমি বিশ্বাস করি এটি একটি জিসিসি-ইসম এবং এ জাতীয় সমস্ত দ্বৈতকে অস্থির হিসাবে ঘোষণা করে এড়ানো যায়। দেখুন: gcc.gnu.org/bugzilla/show_bug.cgi?id=323
ForeverLearning

1
@ ফিলিপ্সি পিএস আমার উত্তর দেখুন আমি জানি যে অ্যাক্সেস বাস্তবায়ন-সংজ্ঞায়িত। প্রশ্ন অ্যাক্সেস সম্পর্কে নয় (বস্তুটি অ্যাক্সেস করা হয়েছে), তবে মানটির পূর্বাভাস।
ভাষা আইনজীবী

2

TL; DR সংকলক প্রতিটি অস্থির অ্যাক্সেসে যা খুশি তা করতে পারে। তবে ডকুমেন্টেশন আপনাকে বলতে হবে .-- "একটি উদ্বায়ী গ্লাভের মাধ্যমে অ্যাক্সেসের শব্দার্থবিজ্ঞানগুলি বাস্তবায়ন-সংজ্ঞায়িত হয়।"


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

তবে মানটি বলে (আমার সাহসী জোর):

ওয়ার্কিং ড্রাফ্ট, প্রোগ্রামিং ল্যাঙ্গুয়েজের জন্য স্ট্যান্ডার্ড সি ++
নথির নম্বর: N4659
তারিখ: 2017-03-21

§ 10.1.7.1 সিভি-বাছাইকারী

5 একটি অস্থির গ্লুভলু দিয়ে অ্যাক্সেসের শব্দার্থবিজ্ঞান বাস্তবায়ন-সংজ্ঞায়িত। [...]

একইভাবে ইন্টারেক্টিভ ডিভাইসের জন্য (আমার বোল্ডফেস জোর):

6 4.6 প্রোগ্রাম কার্যকর করা

5 একটি সুগঠিত প্রোগ্রাম সম্পাদনকারী একটি কার্যকর বাস্তবায়ন একই প্রোগ্রাম এবং একই ইনপুট সহ বিমূর্ত মেশিনের সংশ্লিষ্ট দৃষ্টান্তের সম্ভাব্য মৃত্যুদণ্ডগুলির মধ্যে একটি হিসাবে একই পর্যবেক্ষণযোগ্য আচরণ তৈরি করবে। [...]

7 অনুসারে বাস্তবায়নের সর্বনিম্ন প্রয়োজনীয়তা হ'ল:

(.1.১) - বিমূর্ত যন্ত্রের নিয়ম অনুসারে অস্থির গ্লুভলুগুলির মাধ্যমে অ্যাক্সেসগুলি কঠোরভাবে মূল্যায়ন করা হয়।
(.2.২) - প্রোগ্রাম সমাপ্তির সময়, ফাইলগুলিতে লিখিত সমস্ত ডেটা সম্ভাব্য ফলাফলগুলির সাথে সমান হবে যেটি অ্যাবস্ট্রাক্ট শব্দার্থবিজ্ঞান অনুসারে প্রোগ্রামটি কার্যকর করা হতে পারে।
(.3.৩) - ইন্টারেক্টিভ ডিভাইসের ইনপুট এবং আউটপুট গতিবেগ এমন এক ফ্যাশনে সঞ্চালিত হবে যা কোনও প্রোগ্রামের ইনপুটটির জন্য অপেক্ষা করার আগে প্রম্প্টিং আউটপুট সরবরাহ করা হয়। একটি ইন্টারেক্টিভ ডিভাইস যা গঠন করে তা বাস্তবায়ন-সংজ্ঞায়িত।

এগুলি সম্মিলিতভাবে প্রোগ্রামটির পর্যবেক্ষণযোগ্য আচরণ হিসাবে উল্লেখ করা হয় । [...]

(যাইহোক, কোনও প্রোগ্রামের জন্য কী নির্দিষ্ট কোড উত্পন্ন হয় তা মান দ্বারা নির্দিষ্ট করা হয় না))

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

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

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


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

হ্যাঁ, বাস্তবায়নের মান প্রাসঙ্গিক। তবুও, ফাইলগুলিতে লেখার বাইরে, "পর্যবেক্ষণযোগ্য" [sic] বাস্তবায়ন-সংজ্ঞায়িত। আপনি যদি ব্রেকপয়েন্টগুলি সেট করতে, নির্দিষ্ট প্রকৃত স্মৃতিতে অ্যাক্সেস করতে চান, 'অস্থির' উপেক্ষা করতে পারেন, ইত্যাদি অ্যাবস্ট্রাক্ট উদ্বোধক পড়ে এবং লেখায় তবে আপনাকে আপনার সংকলক লেখককে উপযুক্ত কোড আউটপুট দিতে হবে । পি ইন ইন সি ++ "পার্শ্ব-প্রতিক্রিয়া" প্রতি সেবার পর্যবেক্ষণের জন্য ব্যবহার করা হয় না, এটি সুব্যাক্স্রেশনগুলির আংশিক ক্রম মূল্যায়ন বর্ণনা করার জন্য ব্যবহৃত হয়।
ফিলিপ্সি

[Sic] ব্যাখ্যা করতে যত্নশীল? আপনি কোন উত্সটি উদ্ধৃত করছেন এবং ভুলটি কী?
ম্যাক্স ল্যানঘফ

আমি ঠিক বলতে চাইছি যে একটি বিমূর্ত মেশিন পর্যবেক্ষণযোগ্য কেবল বাস্তব-বিশ্ব পর্যবেক্ষণযোগ্য যদি & কীভাবে বাস্তবায়ন এটি বলে।
ফিলিপ্সি

1
আপনি কি বলছেন যে একটি বাস্তবায়ন দাবি করতে পারে যে ইন্টারেক্টিভ ডিভাইসের মতো কোনও জিনিস নেই তাই কোনও প্রোগ্রাম যে কোনও কিছু করতে পারে, এবং এটি এখনও সঠিক হবে? (দ্রষ্টব্য: আমি ইন্টারেক্টিভ ডিভাইসগুলিতে আপনার জোর বুঝতে পারি না))
কৌতূহলী

-1

আমি বিশ্বাস করি যে চেকটি এড়ানো আইনসম্মত।

প্রত্যেকটি অনুচ্ছেদে উদ্ধৃতি দিতে পছন্দ করে

34) একটি উদ্বায়ী বস্তুর ক্ষেত্রে, শেষ স্টোরটি প্রোগ্রামে সুস্পষ্ট হওয়া দরকার না

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

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


কেন আপনি এটি ব্যাখ্যা করতে পারেন? কোড শোগুলিতে, ফাংশনটি আক্ষরিকভাবে কখনই বলা যায় না।
ডেভিড শোয়ার্জ

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

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

@ ডেভিডশওয়ার্টজ অবশ্যই এটি করতে পারেন - বিমূর্ত মেশিনের শব্দার্থবিজ্ঞান (বিশেষত, পড়তে এবং লিখতে) অনুসরণ করে। এটি সঠিকভাবে অনুকূল করতে সক্ষম নাও হতে পারে - এটি স্ট্যান্ডার্ডের পয়েন্ট point এখন, এটি একটি নোট এবং এইভাবে আদর্শিক নয়, এবং যেমন আমরা দুজনেই বলেছি, বাস্তবায়ন কী করতে পারে volatileতা নির্দিষ্ট করতে পারে এবং তাতে কী লেগে থাকে। আমার বক্তব্যটি হ'ল কোডটি নিজেই (সি ++ স্ট্যান্ডার্ড / অ্যাবস্ট্রাক্ট মেশিন অনুযায়ী) আপনাকে কল করা gযেতে পারে কিনা তা নির্ধারণ করতে দেয় না ।
ম্যাক্স ল্যাঙ্গোফ

@ ডেভিডশওয়ার্টজ কোডটি তেমন কিছু দেখায় না, কারণ নিখুঁত লেখার অনুপস্থিতি কোডটি অনুসরণ করে না।
এন। 'সর্বনাম' মি।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.