क्या ऐसा प्रोग्राम है जो कभी भी मान्य C++ प्रोग्राम को समाप्त नहीं करता है?




language-lawyer undefined-behavior (2)

C ++ मानक में कुछ भी नहीं है जिसे समाप्त करने के लिए कार्यक्रम, या किसी दिए गए धागे की आवश्यकता होती है। इसके लिए निकटतम चीज़ [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