"वास्तविक" कंप्यूटर प्रोग्राम की कम्प्यूटेशनल कठोरता


10

मैंने अक्सर यह कहा है कि आप चावल के प्रमेय के कारण किसी वेब ब्राउज़र, या वर्ड-प्रोसेसर, या ऑपरेटिंग सिस्टम में बग्स को पकड़ने के लिए कोई प्रोग्राम नहीं लिख सकते हैं: ट्यूरिंग-पूर्ण भाषा के लिए कोई भी शब्दार्थ संपत्ति अपरिहार्य है।

हालांकि, मुझे यकीन नहीं है कि यह वास्तविक दुनिया के कार्यक्रम पर लागू होता है जो ऑपरेटिंग सिस्टम पसंद करता है। क्या इस प्रकार के कार्यक्रमों को ट्यूरिंग पूर्णता की पूरी ताकत की आवश्यकता है? क्या गणना के सरल मॉडल (जैसे पीआर) हैं जिसमें ये एप्लिकेशन लिखे जा सकते हैं? यदि हां, तो यह किस हद तक कार्यक्रम की शुद्धता को कम करने की अनुमति देता है?


आप बहुत कमजोर मॉडल के गैर-तुच्छ सार्वभौमिक गुणों (जैसे कुछ इनपुट के लिए कुछ रखती है) की जांच नहीं कर सकते हैं, उदाहरण के लिए, यदि आप दो पॉलीटाइम कम्प्यूटेबल टीएम एक ही फ़ंक्शन की गणना कर रहे हैं, तो जांच नहीं कर सकते हैं (हालांकि उनके लिए ह्रास निर्णायक है क्योंकि एक पॉलीटीमीटर टीएम हमेशा रुकता है)। दूसरी ओर, यदि इनपुट का डोमेन बाध्य है, तो आप कुछ मॉडलों में कुछ गुणों की जांच कर सकते हैं, जैसे कि कार्यक्रम 1,000 से कम आकार के इनपुट पर क्रैश नहीं करता है, कम से कम सिद्धांत में (व्यवहार में यह अचूक हो सकता है)।
केव

हल्का संबंधित प्रश्न
आर्टेम Kaznatcheev

जवाबों:


14

आप निश्चित रूप से ऐसे प्रोग्राम लिख सकते हैं जो बग को पकड़ते हैं - ऐसे लोगों का एक बड़ा और सक्रिय समुदाय है जो वास्तव में ऐसा करने के लिए प्रोग्राम लिखते हैं। हालाँकि, राइस का प्रमेय आपको ऐसा करने से रोकता है जो बग-कैचर लिखने के लिए है जो ध्वनि और पूर्ण दोनों हैं (यानी, एक निश्चित वर्ग के सभी बग को बिना किसी सकारात्मकता के पकड़ते हैं)।

उस ने कहा, गणना के मॉडल पर भोले प्रतिबंध वास्तव में कार्यक्रम विश्लेषण की व्यावहारिकता में सुधार करने में आपकी बहुत मदद नहीं करते हैं। कारण यह है कि आप ऐसे प्रोग्राम प्राप्त कर सकते हैं जो लूप्स को मोड़कर "लगभग एक ही बात" करते हैं

while P do 
   C

एक बड़े पुनरावृत्ति स्थिरांक के लिए छोरों में:

for i = 0 to BIGNUM do 
  if P then 
    C
  else
    break

अब इस कार्यक्रम को भी आदिम पुनरावर्ती की पूरी ताकत की आवश्यकता नहीं है (क्योंकि फॉर-लूप को मैक्रो-एक विशाल नेस्टेड में विस्तार किया जा सकता है यदि-तब-अन्यथा कथन), लेकिन अधिकांश व्यावहारिक मामलों में यह पहले की तरह ही व्यवहार करेगा। ध्यान दें कि यह सिद्धांत में निर्णायकता में मदद करता है - कार्यक्रम कुल है, इसलिए आप कार्यक्रम को चलाकर और क्या होता है देखकर सवालों के जवाब दे सकते हैं। यह वह नहीं है जो हम वास्तव में चाहते हैं, जो कि प्रोग्राम को चलाने की तुलना में तेजी से उत्तर प्राप्त करना है - प्रस्तुत कृत्रिम समाप्ति वास्तव में प्रोग्राम विश्लेषण में मदद नहीं करती है, क्योंकि बग वास्तविक प्रोग्राम लॉजिक में त्रुटियों के कारण होते हैं, और हम ' टी कि सभी पर छुआ।

इसके अलावा, प्रोग्रामिंग भाषा में अमूर्त सुविधाओं को जोड़ने से विश्लेषण समस्या की जटिलता और भी बदतर हो सकती है, जबकि अभ्यास में कार्यक्रमों को सत्यापित करना आसान हो जाता है। उदाहरण के लिए, प्राकृतिक संख्याओं के साथ बस टाइप किए गए कैलकुलस की समाप्ति को साबित करने के लिए तक प्रेरण की आवश्यकता होती है , लेकिन प्रकार के बहुरूपता को जोड़कर आपको सिस्टम एफ मिलता है, जिसका समाप्ति प्रमाण दूसरे क्रम के अंकगणित की स्थिरता के रूप में मजबूत होता है। फिर भी, एफ में लिखे गए अभ्यास कार्यक्रमों को सत्यापित करना बहुत आसान है, क्योंकि दूसरे-क्रम मात्राकरण के प्रतिरूपकता गुण लेखन कार्यक्रमों को सही बनाते हैं और शुद्धता प्रमाण बहुत आसान होते हैं।ϵ0


आपका क्या मतलब है "यह कार्यक्रम भी आदिम पुनरावर्ती नहीं है"?
रयान विलियम्स

@ रियानविलियम्स शायद बस इतना है कि यह एक ऐसी प्रणाली में लिखा जा सकता है जो आदिम पुनरावर्ती कार्यों के पूर्ण सरणी से कम की अनुमति देता है, उदाहरण के लिए उन कार्यक्रमों के लिए जिन्हें लूप पर स्पष्ट (संकलन समय) की आवश्यकता होती है।
कोड़ी

आप स्थूल-विस्तार को दूर कर सकते हैं, आपको एक ब्रांचिंग कार्यक्रम के साथ छोड़ सकते हैं (यानी, केवल अगर-तब-और-और अनुक्रमिक रचना के साथ)।
नील कृष्णस्वामी

शायद यह कहना स्पष्ट होगा कि "इस कार्यक्रम को आदिम पुनरावृत्ति की पूरी ताकत की आवश्यकता नहीं है"।
अधिकतम

@ मोम: सुझाव स्वीकार कर लिया!
नील कृष्णस्वामी

5

चूंकि आपने ऑपरेटिंग सिस्टम जैसे वास्तविक विश्व कार्यक्रमों के कार्यक्रम की शुद्धता के बारे में पूछा था, इसलिए आपको seL4 परियोजना ( पत्रिका , पीडीएफ , सम्मेलन ) में रुचि हो सकती है ।

NICTA टीम ने C के 8700 लाइनों की तीसरी-पीढ़ी की माइक्रोकर्नेल और असेंबलर की 600 लाइनों को हास्केल में एक सार विनिर्देश के अनुसार लागू किया। उन्होंने एक औपचारिक, मशीन-चेक किए गए प्रमाण (इसाबेल / एचओएल में) प्रदान किए कि कार्यान्वयन सख्ती से विनिर्देश का पालन करता है। इस प्रकार यह साबित करना कि उनका कार्यक्रम बग-मुक्त है।

तो बस रुकने की समस्या की तरह, हालांकि इसे सामान्य रूप से हल नहीं किया जा सकता है, इसे कुछ विशिष्ट उदाहरणों के लिए हल किया जा सकता है। इस मामले में, हालांकि आप यह साबित नहीं कर सकते कि मनमाना सी कोड बग मुक्त है, वे इसे seL4 माइक्रोकर्नल के मामले में कर सकते हैं।


ध्यान दें कि प्रमाणित कोड अभी भी इसके विनिर्देशन में गलतियों के प्रति संवेदनशील है, इसलिए आप केवल यह कह सकते हैं कि यह कोड विनिर्देशन से अपेक्षाकृत मुक्त है।
nponeccop

@noppeccop निश्चित रूप से सच है, लेकिन जब आप विनिर्देश पर संदेह करना शुरू करते हैं तो आप वास्तव में कुख्यात बग-फीचर लाइन को धुंधला करना शुरू करते हैं। कुछ को 'बग' कहने के लिए आपके मन में कुछ निहित विनिर्देश होना चाहिए, इस तरह के अंतर्निहित विनिर्देश के पीछे अंतर्ज्ञान को कैप्चर करना वास्तव में गहरी खुदाई करना शुरू करता है जब तक कि आप गणित के दर्शन में नींव पर सवाल नहीं उठाते हैं (ब्रूवर बनाम हिल्बर्ट की शैली में) ।
Artem Kaznatcheev

'विनिर्देशन' से मेरा तात्पर्य था औपचारिक विनिर्देश यानी औपचारिक सिद्धांत जो आप सिद्ध करते हैं। आप अभी भी अपनी पाठ्य आवश्यकताओं को प्रमेयों में बदलने में गलती कर सकते हैं। प्रमाणीकरण के साथ आपके द्वारा प्राप्त की जाने वाली एकमात्र चीजें आपके विश्वसनीय कोडबेस की कमी हैं (आपको केवल अपने प्रमेयों पर भरोसा करना चाहिए, न कि आपके कोड या प्रमाणों पर) और आपके प्रमेयों के साथ आपके कोड की स्थिरता।
23

यहाँ seL4 वेबसाइट का एक उद्धरण दिया गया है: 'seL4 microkernel का C कोड अपने अमूर्त विनिर्देश में वर्णित व्यवहार को सही ढंग से लागू करता है और इससे अधिक कुछ नहीं।'
नॉटेपेकॉप

2

आपके द्वारा पूछे गए सवाल वास्तव में काफी अलग हैं।

हालांकि, मुझे यकीन नहीं है कि यह वास्तविक दुनिया के कार्यक्रम पर लागू होता है जो ऑपरेटिंग सिस्टम पसंद करता है। क्या इस प्रकार के कार्यक्रमों को ट्यूरिंग पूर्णता की पूरी ताकत की आवश्यकता है?

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

क्या गणना के सरल मॉडल (जैसे पीआर) हैं जिसमें ये एप्लिकेशन लिखे जा सकते हैं? यदि हां, तो यह किस हद तक कार्यक्रम की शुद्धता को कम करने की अनुमति देता है?

यह पहचानना महत्वपूर्ण है कि हम अपने सॉफ़्टवेयर के मनमाने गुणों की जाँच नहीं करना चाहते हैं। बहुत विशिष्ट, संकीर्ण गुणों (कोई बफर ओवरफ्लो, कोई नल-पॉइंटर डेरेफेरेंस, कोई अनंत लूप, आदि) की जांच करने से सॉफ्टवेयर की गुणवत्ता और उपयोगिता में काफी सुधार होता है। सिद्धांत रूप में, ऐसी समस्याएं अभी भी अवांछनीय हैं। व्यवहार में, विशिष्ट गुणों पर ध्यान केंद्रित करने से हमें अपने कार्यक्रमों में संरचना की खोज करने की अनुमति मिलती है जो समस्या को हल करने के लिए हम अक्सर शोषण कर सकते हैं।

विशेष रूप से, आप अपने मूल प्रश्न को संशोधित कर सकते हैं

क्या मेरे सॉफ़्टवेयर का एक अमूर्त हिस्सा है जो मैं गैर-ट्यूरिंग पूर्ण मॉडल में कुशलता से विश्लेषण कर सकता हूं?

एक अमूर्त एक मॉडल है जिसमें मूल सॉफ़्टवेयर का व्यवहार और संभवतः कई अतिरिक्त व्यवहार शामिल हैं। एक-काउंटर मशीन या पुशडाउन सिस्टम जैसे मॉडल हैं जो ट्यूरिंग पूर्ण नहीं हैं और जिनका हम विश्लेषण कर सकते हैं। स्वचालित उपकरणों के साथ कार्यक्रम सत्यापन में मानक दृष्टिकोण इस तरह के एक मॉडल में एक अमूर्त का निर्माण करना है और इसे एल्गोरिदम की जांच करना है।

ऐसे एप्लिकेशन हैं जहां लोग अपने हार्डवेयर या सॉफ़्टवेयर के परिष्कृत गुणों की परवाह करते हैं। हार्डवेयर कंपनियां चाहती हैं कि उनके चिप्स अंकगणित एल्गोरिदम को सही ढंग से लागू करें, ऑटोमोटिव और एवियोनिक कंपनियां प्रमाणित रूप से सही सॉफ्टवेयर चाहती हैं। यदि यह महत्वपूर्ण है, तो आप एक (प्रशिक्षित) इंसान का उपयोग करने से बेहतर हैं।


मुझे लगता है कि आपने विपरीत प्रश्न का उत्तर दिया है, क्या किसी शब्द-प्रोसेसर के लिए ट्यूरिंग पूर्ण होना संभव है? रजिस्टरों के उचित संचालन के साथ, यह है। फिर भी, ट्यूरिंग पूर्णता को हराने के लिए रजिस्टर हेरफेर के नियमों को लागू करना संभव है। मेरा प्रश्न यह है कि आप इन संकीर्ण बाधाओं में व्यावहारिक रूप से कितना कार्यक्रम कर सकते हैं।
डेविड हैरिस

मैं इस सवाल का जवाब दे रहा था कि क्या ऑपरेटिंग सिस्टम और अन्य एप्लिकेशन सॉफ़्टवेयर को लिखने के लिए ट्यूरिंग पूरी प्रोग्रामिंग भाषा की आवश्यकता है। यदि आपको कई काउंटर या अनबाउंड डेटा संरचनाओं की आवश्यकता है, तो आपको ट्यूरिंग पूर्ण प्रोग्रामिंग भाषा की आवश्यकता होगी।
विजय डी।

@ विज: नहीं, यह सच नहीं है। बहुत सारे प्रकार के सिद्धांत हैं (उदाहरण के लिए, एजडा और कोक) जो दोनों अत्यंत अभिव्यंजक हैं और अनबिकेड पुनरावृत्ति की अनुमति नहीं देते हैं।
नील कृष्णास्वामी

@ नील: स्पष्ट करने के लिए, मैं केवल ट्यूरिंग पूर्णता के बारे में बात कर रहा हूं। क्या इन सिद्धांतों में ट्यूरिंग मशीन का अनुकरण करना संभव नहीं है?
विजय डी।

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