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


15

क्या एक कार्यक्रम को समाप्त करने के लिए आवश्यक है? दूसरे शब्दों में एक प्रोग्राम है जो हमेशा के लिए तकनीकी रूप से अपरिभाषित व्यवहार चलता है? ध्यान दें कि यह खाली छोरों के बारे में नहीं है। उन कार्यक्रमों के बारे में बात करना जो हमेशा के लिए "सामान" (यानी अवलोकनीय व्यवहार) करते हैं।

कुछ इस तरह:

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
        }
    }
}

यह एक अकादमिक प्रश्न है, जैसा कि आनुभविक रूप से सभी समझदार संकलक उपरोक्त प्रकार के कार्यक्रम के लिए अपेक्षित कोड उत्पन्न करेंगे (निश्चित रूप से यूबी का कोई अन्य स्रोत नहीं है)। और हां, निश्चित रूप से बहुत सारे प्रोग्राम हैं जो कभी भी समाप्त नहीं होते हैं (ओएस, एंबेडेड, सर्वर)। हालांकि मानक कभी-कभी विचित्र होता है, इस प्रकार प्रश्न।


स्पर्शरेखा: "एल्गोरिथम" की कई (कुछ?) परिभाषाओं के लिए आवश्यक है कि एक एल्गोरिथ्म को समाप्त किया जाना चाहिए , अर्थात ऑपरेशन की एक श्रृंखला जो कभी समाप्त नहीं होती है उसे एल्गोरिथ्म नहीं माना जाता है।


स्पर्शरेखा। हॉल्टिंग समस्या बताती है कि इनपुट के लिए कोई मनमाना प्रोग्राम पूरा हो जाए, यह निर्धारित करने के लिए एक एल्गोरिथ्म मौजूद नहीं हो सकता है। हालांकि इस विशेष कार्यक्रम के लिए चूंकि कोई शाखा नहीं है जो मुख्य से बाहर निकलने की ओर जाता है, कंपाइलर आसानी से निर्धारित कर सकता है कि कार्यक्रम कभी समाप्त नहीं होगा। यह हालांकि अप्रासंगिक है क्योंकि यह सवाल भाषा-वकील का है।


टिप्पणियाँ विस्तारित चर्चा के लिए नहीं हैं; इस वार्तालाप को बातचीत में स्थानांतरित कर दिया गया है ।
शमूएल ल्यू

जवाबों:


15

C ++ मानक में ऐसा कुछ भी नहीं है जिसे समाप्त करने के लिए कार्यक्रम या किसी दिए गए धागे की आवश्यकता हो। इसके लिए निकटतम चीज़ [intro.progress] p1 है , जो कहती है

कार्यान्वयन यह मान सकता है कि कोई भी धागा अंततः निम्नलिखित में से एक करेगा:

  • समाप्त कर दें,
  • लाइब्रेरी I / O फ़ंक्शन को कॉल करें,
  • एक वाष्पशील चमक के माध्यम से एक पहुंच का प्रदर्शन, या
  • एक सिंक्रनाइज़ेशन ऑपरेशन या एक परमाणु ऑपरेशन करें।

[  नोट: यह संकलक परिवर्तनों की अनुमति देने के लिए है जैसे कि खाली छोरों को हटाना, तब भी जब समाप्ति को सिद्ध नहीं किया जा सकता है। -  अंतिम नोट  ]

जब तक कुछ अवलोकन योग्य व्यवहार होता है, अंततः, या जब तक यह अपना सारा समय I / O ऑपरेशन या किसी अन्य अवरुद्ध लाइब्रेरी कॉल पर खर्च करता है, तब तक यह लागू नहीं होता है, और कार्यक्रम मान्य है (यह मानते हुए कि यह सभी को पूरा करता है अन्य वैधता मानदंड)।


"I / O ऑपरेशन या अन्य अवरुद्ध पुस्तकालय कॉल" - मानक बहुत स्पष्ट है और केवल I / O संचालन को सूचीबद्ध करता है। आप "या कोई अन्य अवरुद्ध लाइब्रेरी कॉल" क्यों जोड़ रहे हैं? इसके अलावा, कि I / O ऑपरेशन पहले से ही आपके " कुछ अवलोकन योग्य व्यवहार" में शामिल है।
एमएसलर्स

1
@MSalters std::mutex::lock()एक लाइब्रेरी कॉल है जो एक सिंक्रोनाइज़ेशन ऑपरेशन है, जो चौथी बुलेट के नीचे आती है। इसलिए यह सच नहीं है कि केवल I / O कॉल का उल्लेख है।
इगोर तांडेटनिक

यदि यह इनपुट पर अटका हुआ है , लेकिन कभी नहीं मिलता है, तो यह बहस योग्य है कि क्या यह देखने योग्य है।
डैनियल एच

4

हाँ। से[intro.progress]

कार्यान्वयन यह मान सकता है कि कोई भी धागा अंततः निम्नलिखित में से एक करेगा:

  • समाप्त कर दें,
  • लाइब्रेरी I / O फ़ंक्शन को कॉल करें,
  • एक वाष्पशील चमक के माध्यम से एक पहुंच का प्रदर्शन, या
  • एक सिंक्रनाइज़ेशन ऑपरेशन या एक परमाणु ऑपरेशन करें।

[ नोट: यह संकलक परिवर्तनों की अनुमति देने के लिए है जैसे कि खाली छोरों को हटाना, तब भी जब समाप्ति को सिद्ध नहीं किया जा सकता है। - अंतिम नोट ]


मेरा मानना ​​है कि थोड़ा सा विवरण यह बताता है कि कार्यक्रम I / O करना उचित होगा।
कामिलुक

इसलिए जब तक get_inputऔर put_outputओपी उदाहरण में कार्य करता है "एक पुस्तकालय I / O फ़ंक्शन को कॉल करें" कार्यक्रम वैध होना चाहिए, भले ही वह समाप्त न हो?
कुछ प्रोग्रामर ने

@Someprogrammerdude या एक वाष्पशील या परमाणु मान तक
पहुँचें

पूर्व c ++ 11 मानक के बारे में उत्सुक, जब वर्तमान मेमोरी मॉडल नहीं था।
बोलोव

1
compiler does not know- यह अप्रासंगिक है। कंपाइलर भाषा-परत के दृष्टिकोण से जान सकता है और नहीं भी जान सकता है - सवाल यह है कि क्या यह किसी भी मामले में वैध है।
कामिलुक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.