c++ - এমন একটি প্রোগ্রাম যা কোনও বৈধ সি++ প্রোগ্রামটি কখনই বন্ধ করে দেয় না?




language-lawyer undefined-behavior (2)

সি ++ স্ট্যান্ডার্ডের এমন কোনও কিছুই নেই যা সমাপ্ত করার জন্য প্রোগ্রাম, বা কোনও প্রদত্ত থ্রেডের প্রয়োজন। এর নিকটতম জিনিসটি হল [intro.progress]p1 , যা বলে

বাস্তবায়ন ধরে নেওয়া যেতে পারে যে কোনও থ্রেড অবশেষে নিম্নলিখিতগুলির মধ্যে একটি করবে:

  • বিনষ্ট,
  • I / O ফাংশনটিতে একটি লাইব্রেরিতে কল করুন,
  • একটি অস্থির আঠালো মাধ্যমে অ্যাক্সেস সঞ্চালন, বা
  • একটি সিঙ্ক্রোনাইজেশন অপারেশন বা একটি পারমাণবিক অপারেশন সঞ্চালন।

[ দ্রষ্টব্য: এটি সমাপ্তি প্রমাণিত না হওয়া সত্ত্বেও, খালি লুপগুলি অপসারণের মতো সংকলক রূপান্তরগুলিকে অনুমতি দেওয়ার উদ্দেশ্যে। - শেষ নোট ]

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

একটি প্রোগ্রাম কি সমাপ্ত করার প্রয়োজন? অন্য কথায় এমন একটি প্রোগ্রাম যা প্রযুক্তিগতভাবে অনির্ধারিত আচরণ চিরতরে চলে? নোট করুন এটি খালি লুপগুলি সম্পর্কে নয়। "স্টাফ" (যেমন পর্যবেক্ষণযোগ্য আচরণ) চিরকালের জন্য এমন প্রোগ্রামগুলির বিষয়ে কথা বলা।

যেমন এরকম কিছু:

int main()
{
    while (true)
    {
        try
        {
            get_input(); // calls IO
            process();
            put_output(); // calls IO, has observable behavior

            // never break, exit, terminate, etc
        } catch(...)
        {
            // ignore all exceptions
            // don't (re)throw
            // never go out of loop
        }
    }
}

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

স্পর্শকাতর: "অ্যালগরিদম" এর অনেকগুলি (কিছু?) সংজ্ঞাগুলির জন্য একটি অ্যালগরিদম অবশ্যই অবসান হওয়া আবশ্যক , অর্থাৎ এমন ক্রিয়াকলাপ যা কখনও শেষ হয় না একটি অ্যালগরিদম হিসাবে বিবেচিত হয় না।

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


হ্যাঁ। [intro.progress]

বাস্তবায়ন ধরে নেওয়া যেতে পারে যে কোনও থ্রেড অবশেষে নিম্নলিখিতগুলির মধ্যে একটি করবে:

  • বিনষ্ট,
  • I / O ফাংশনটিতে একটি লাইব্রেরিতে কল করুন,
  • একটি অস্থির আঠালো মাধ্যমে অ্যাক্সেস সঞ্চালন, বা
  • একটি সিঙ্ক্রোনাইজেশন অপারেশন বা একটি পারমাণবিক অপারেশন সঞ্চালন।

[ দ্রষ্টব্য: এটি সমাপ্তি প্রমাণিত না হওয়া সত্ত্বেও, খালি লুপগুলি অপসারণের মতো সংকলক রূপান্তরগুলিকে অনুমতি দেওয়ার উদ্দেশ্যে। - শেষ নোট ]





undefined-behavior