क्या कोड के शुद्धता प्रमाण कभी मुख्यधारा में आएंगे? [बन्द है]


14

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

जवाबों:


8

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

इसके अलावा अनुबंध करने के लिए प्रोग्रामिंग सहायक हो सकता है। Microsoft कोड अनुबंध देखें


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

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

14

सभी लेकिन सबसे तुच्छ कार्यक्रम

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

यहाँ मुझे इस विषय पर एक अच्छा लेख मिला:

http://www.encyclopedia.com/doc/1O11-programcorrectnessproof.html


राइट - किसी भी प्रोग्रामिंग प्रोजेक्ट के लिए समस्या का एक अनौपचारिक विवरण से एक औपचारिक एक (आम तौर पर, आज, एक कार्यक्रम के रूप में) में संक्रमण होता है, और वह दूर नहीं जा रहा है।
डेविड थॉर्नले

astree.ens.fr Astrée का औद्योगिक अनुप्रयोग यहाँ देखें
zw324

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

10

औपचारिक प्रमाणों के साथ समस्या यह है कि यह समस्या को केवल एक कदम पीछे ले जाता है।

यह कहना कि एक कार्यक्रम सही है, यह कहने के बराबर है कि एक कार्यक्रम वह करता है जो उसे करना चाहिए। आप कैसे परिभाषित करते हैं कि कार्यक्रम क्या करना चाहिए? आप इसे निर्दिष्ट करें। और आप कैसे परिभाषित करते हैं कि किनारे के मामलों में कार्यक्रम को क्या करना चाहिए जो कल्पना को कवर नहीं करता है? ठीक है, तो आपको कल्पना को और अधिक विस्तृत करना होगा।

तो चलिए बताते हैं कि आखिरकार आपकी कल्पना पूरे कार्यक्रम के हर पहलू के सही व्यवहार का वर्णन करने के लिए पर्याप्त विस्तृत हो जाती है। अब आपको अपने प्रमाण साधनों को समझने के लिए एक तरीका चाहिए। तो आपको ऐनक को किसी प्रकार की औपचारिक भाषा में अनुवाद करना होगा जिसे प्रूफ टूल समझ सके ... अरे, एक मिनट रुकिए!


2
इसके अलावा .. "उपरोक्त कोड में बग से सावधान रहें; मैंने केवल इसे सही साबित किया है, इसे आजमाया नहीं है।" - डोनाल्ड नथ
ब्रेंडन

8

औपचारिक सत्यापन एक लंबा रास्ता तय कर चुका है, लेकिन आमतौर पर उद्योग / व्यापक रूप से उपयोग किए गए उपकरण नवीनतम शोध से पीछे हैं। इस दिशा में हाल के कुछ प्रयास इस प्रकार हैं:

कल्पना # http://research.microsoft.com/en-us/projects/specsharp/ यह C # का एक एक्सटेंशन है जो कोड कॉन्ट्रैक्ट्स (पूर्व / पोस्ट की शर्तों और आक्रमणकारियों) का समर्थन करता है और विभिन्न प्रकार के स्थैतिक विश्लेषण करने के लिए इन अनुबंधों का उपयोग कर सकता है ।

इसी तरह की परियोजनाएं अन्य भाषाओं के लिए मौजूद हैं, जैसे जावा के लिए जेएमएल, और एफिल में यह बहुत अधिक अंतर्निहित है।

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

मुझे विश्वास है कि हम भविष्य में प्रयोग की जाने वाली इन तकनीकों में से बहुत कुछ देखेंगे। मुख्य बाधा यह है कि प्रोग्राम इनवेरिएंट्स मैनुअल एनोटेशन के बिना अनुमान लगाना मुश्किल है, और प्रोग्रामर आमतौर पर इन एनोटेशन प्रदान करने के लिए तैयार नहीं हैं क्योंकि ऐसा करना बहुत थकाऊ / समय लेने वाला है।


4

तब तक नहीं जब तक कि व्यापक डेवलपर कार्य के बिना कोड को स्वचालित रूप से साबित करने की एक विधि उत्पन्न न हो।


आर्थिक तर्क पर विचार करें: शायद डेवलपर्स के लिए सॉफ़्टवेयर त्रुटियों के कारण पैसे खोने की तुलना में शुद्धता प्रमाणों के साथ "समय बर्बाद" करना बेहतर है।
एंड्रेस एफ।

मैं फिशटोस्टर से सहमत हूं, जब तक कि यह बहुत कम संसाधन गहन नहीं हो जाता है कि नियमित रूप से व्यापार सॉफ्टवेयर का एक बड़ा सौदा सिर्फ शुद्धता / स्तर के समर्थन के लिए लागत / लाभ नहीं होने वाला है। एक बंदी दर्शकों के लिए एक लोब ऐप में कभी-कभी बग रिपोर्ट के बारे में लागत के लिए सबसे अधिक व्यापार लाभ डॉक्स को एक पंक्ति जोड़ रहा है जो कहता है कि "ऐसा मत करो"
बिल

3

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

कुछ क्षेत्रों में, इस तरह के औपचारिक तरीके संभव हैं, जैसे कि नागरिक विमान में महत्वपूर्ण सॉफ्टवेयर के लिए DO-178C । तो कुछ मामलों में, ऐसे दृष्टिकोण संभव और सहायक हैं।

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


3

मैं इस सवाल पर अड़ गया, और मुझे लगता है कि यह लिंक दिलचस्प हो सकता है:

Astrée के औद्योगिक अनुप्रयोग

2003 में कोड के 130K से अधिक लाइनों के साथ एयरबस द्वारा उपयोग किए जाने वाले सिस्टम में RTE की अनुपस्थिति को साबित करना बुरा नहीं लगता है, और मुझे आश्चर्य है कि कोई भी व्यक्ति यह कहेगा कि यह वास्तविक दुनिया नहीं है।


2

इसके लिए सामान्य कहावत है, "सिद्धांत, सिद्धांत और व्यवहार में समान हैं। व्यवहार में, नहीं।"

एक बहुत ही सरल उदाहरण: टाइपोस।

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

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


3
गलत। कोई भी इकाई परीक्षण कभी भी संभव मापदंडों की पूरी श्रृंखला को कवर करने में सक्षम नहीं होगा। इस तरह से एक संकलक "यूनिट परीक्षण" की कल्पना करें, यह सुनिश्चित करते हुए कि कोई पास परिवर्तन शब्दार्थ नहीं है।
एसके-तर्क

3
इकाई परीक्षण पवित्र
कब्र

1
@ आइंस्टीन इवर्ट, सत्यापित कंपाइलर (और कई और सत्यापित असेंबलर) हैं। और हार्डवेयर औपचारिक रूप से बहुत अधिक बार सत्यापित किया जाता है फिर सॉफ्टवेयर। यहां देखें: gallium.inria.fr/~xleroy/publi/compiler-certif.pdf
SK-logic

1
@ एसके-लॉजिक, हाँ अकादमिक उद्देश्यों के लिए खिलौना संकलक सही साबित हुए हैं। लेकिन कंपाइलर लोगों के बारे में क्या वास्तव में उपयोग करते हैं? मुझे संदेह है कि अधिकांश कंपाइलरों को स्वचालित परीक्षण के विभिन्न रूपों का उपयोग करके जांचा जाता है और लगभग कोई औपचारिक सही प्रमाण नहीं दिया जाता है।
विंस्टन इर्वर्ट

1
@ आइंस्टीन इवर्ट, शुद्धता प्रमाण व्यावहारिक हैं और वास्तविक जीवन में व्यापक रूप से उपयोग किए जाते हैं । जो बहुत व्यावहारिक नहीं है वह आधुनिक मुख्यधारा की अधिकांश भाषाएं हैं। मुझे आशा है कि वे सभी मर जाएंगे, इसलिए भविष्य में शुद्धता प्रमाणों के मूल्य में वृद्धि होगी।
एसके-लॉजिक

1

मुझे लगता है कि रुकने की समस्या के कारण शुद्धता प्रमाणों पर लगाई गई सीमाएँ मुख्यधारा के प्रमाण बनने में शुद्धता के लिए सबसे बड़ी बाधा हो सकती हैं।


8
रुकने की समस्या कहती है कि हम निर्धारित नहीं कर सकते कि कोई भी मनमाना कार्यक्रम रुके। ये कार्यक्रम अजीब चीजें कर सकते हैं, जैसे कि प्रत्येक पूर्णांक का परीक्षण करें कि क्या यह मेरसेन प्राइम है। हम सामान्य कार्यक्रमों में ऐसा नहीं करते हैं!
केसबश

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

1

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


C ++ में साइड इफेक्ट्स के बारे में थोड़ा होने के साथ, क्या आप कांस्टेंट शुद्धता की बात कर रहे हैं?
विंस्टन इर्वर्ट

हाँ, const + const सदस्य फ़ंक्शन। यदि आपके सभी सदस्य फ़ंक्शंस कॉन्स्टेबल हैं, तो ऑब्जेक्ट्स का सभी डेटा नॉन-मोडिफ़ेबल है।
tp1

यदि आप उपयोग करते हैं mutableया वे अभी भी परिवर्तनीय हैं const_cast। मैं निश्चित रूप से आपके द्वारा खींचे गए कनेक्शन को देखता हूं, लेकिन दो दृष्टिकोणों का स्वाद मुझे अलग लगता है।
विंस्टन इर्वर्ट

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