language agnostic क्षेत्र में रोकना बंद




language-agnostic field (11)

जब आप कभी व्यक्तिगत रूप से क्षेत्र में रोकथाम की समस्या पर आते हैं? यह तब हो सकता है जब एक सहकर्मी / मालिक ने एक समाधान का सुझाव दिया जो गणना की मौलिक सीमाओं का उल्लंघन करेगा, या जब आप स्वयं को महसूस करेंगे कि एक समस्या जिसे आप हल करने की कोशिश कर रहे थे, वास्तव में, हल करना असंभव था।

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


मुझे सचमुच रोकथाम की समस्या सौंपी गई है, जैसा कि "एक मॉनीटर प्लगइन लिखना है कि यह निर्धारित करने के लिए कि कोई मेजबान स्थायी रूप से नीचे है या नहीं"। गंभीरता से? ठीक है, तो मैं इसे सिर्फ एक सीमा दे दूंगा। "नहीं, क्योंकि यह बाद में वापस आ सकता है।"

बहुत सैद्धांतिक प्रदर्शनी शुरू हुई।


पर्ल की परीक्षण प्रणाली एक परीक्षण काउंटर रखती है। आप या तो प्रोग्राम के शीर्ष पर चलने वाले परीक्षणों की संख्या डालते हैं, या आप घोषणा करते हैं कि आप इसे ट्रैक नहीं करेंगे। यह परीक्षण आपके परीक्षण के खिलाफ समय से बाहर निकलने के खिलाफ है, लेकिन अन्य गार्ड हैं इसलिए यह इतना महत्वपूर्ण नहीं है।

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

यहां एक विशेष रूप से विस्तृत उदाहरण दिया गया है।


मैं एक बार एटीएम (स्वचालित टेलर मशीन) डोमेन में एकीकरण परियोजना पर काम कर रहा था। ग्राहक ने मुझे अपने सिस्टम से देश के स्विच द्वारा भेजे गए लेनदेन के लिए एक रिपोर्ट तैयार करने का अनुरोध किया जो मेरे सिस्टम द्वारा प्राप्त नहीं किया गया !!


"आप मुझे कैसे आश्वस्त कर सकते हैं कि आपका कोड 100% बग से मुक्त है?"


परिष्कृत स्थिर कोड विश्लेषण रोक समस्या में भाग सकता है।

उदाहरण के लिए, यदि जावा वर्चुअल मशीन साबित कर सकती है कि कोड का एक टुकड़ा किसी भी सरणी अनुक्रमणिका को कभी भी एक्सेस नहीं करेगा, तो यह जांच कर सकता है और तेज़ी से चला सकता है। कुछ कोड के लिए यह संभव है; क्योंकि यह अधिक जटिल हो जाता है यह रोक समस्या बन जाता है।


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

लॉकिंग (अधिग्रहण के परिभाषित आदेश की तरह) पर एक और परत लगाकर जटिल प्रणाली में आंशिक रूप से "हल" करने के तरीके हैं, लेकिन ये विधियां हमेशा लागू नहीं होती हैं।

यह रोकथाम की समस्या के बराबर क्यों है:

कल्पना करें कि आपके पास दो ताले, ए और बी, और दो धागे, एक्स और वाई हैं। यदि थ्रेड एक्स में लॉक ए है, और लॉक बी भी चाहता है, और थ्रेड वाई ने लॉक बी लिया है और ए भी चाहता है, तो आपके पास डेडलॉक है।

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

लेकिन, प्रत्येक थ्रेड को कोड के माध्यम से ले जा सकने वाले सभी संभावित पथ निर्धारित करना (सामान्य मामले में) रोकथाम की समस्या के बराबर है।


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

समीक्षक यह समझने के लिए पर्याप्त समझदार था कि उस कार्यक्रम के लिए सभी मामलों में काम करने के लिए, इसे रोकने की समस्या को हल करना होगा और गणितीय प्रमाण प्रदान करना होगा कि यह सभी मामलों में क्यों काम नहीं कर सका।

अगले अंक में, उन्होंने एक कंपनी के प्रतिनिधि से एक पत्र प्रकाशित किया जिसमें यह समझाया गया कि समस्या अगले रिलीज में तय की जाएगी।

अद्यतन: मैं imgur पर आलेख की एक छवि भर में भाग गया। मुझे गलत पत्रिका याद आई। यह क्रिएटिव कंप्यूटिंग था, बाइट नहीं। अन्यथा, यह बहुत याद है क्योंकि मुझे याद आया।

आप imgur पर इसका एक हाय-रेज संस्करण देख सकते हैं।


मुझे बर्कले पेपर मिला: लूपर: रनटाइम पर अनंत लूप का लाइटवेट डिटेक्शन http://www.eecs.berkeley.edu/~jburnim/pubs/BurnimJalbertStergiouSen-ASE09.pdf

लूपर उपयोगी हो सकता है क्योंकि अधिकांश अनंत लूप छोटी त्रुटियां हैं। हालांकि, इस पेपर में रोक लगाने की समस्या का भी उल्लेख नहीं है!

वे अपनी सीमाओं के बारे में क्या कहते हैं?

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

दूसरे शब्दों में, "समस्या अगले रिलीज में तय की जाएगी"।


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

इस एप्लिकेशन को नियंत्रित करने के लिए कोई एपीआई नहीं है कि चालक को किस प्रकार व्यवहार करना चाहिए या टाइमआउट या कुछ सेट करना चाहिए, और निश्चित रूप से ड्राइवर को यह बताने का कोई तरीका नहीं है कि आपका शेडर खत्म हो रहा है या नहीं।

मुझे नहीं पता कि हाल ही में इस स्थिति में सुधार हुआ है, लेकिन मैं जानना चाहता हूं।


(ग्रहण) के कार्यात्मक अवलोकन से विजुअल संपादक :

ग्रहण दृश्य संपादक (वीई) का उपयोग किसी भी .java फ़ाइल को खोलने के लिए किया जा सकता है। इसके बाद यह दृश्य स्रोतों की तलाश में जावा स्रोत कोड का विश्लेषण करता है। ...

कुछ दृश्य संपादन उपकरण केवल कोड का दृश्य मॉडल प्रदान करेंगे जो कि विशेष दृश्य उपकरण स्वयं उत्पन्न हुआ है। स्रोत कोड के बाद के प्रत्यक्ष संपादन से दृश्य उपकरण को कोड को पार्स करने और मॉडल बनाने से रोका जा सकता है।

ग्रहण वीई, हालांकि, ... या तो स्क्रूच से जीयूआई को संपादित करने के लिए या जावा फाइलों से संपादित किया जा सकता है जिन्हें 'हार्डकोडेड' किया गया है या एक अलग दृश्य उपकरण में बनाया गया है। स्रोत फ़ाइल को या तो ग्राफ़िकल व्यूअर, जावाबीन्स ट्री या प्रॉपर्टी व्यू का उपयोग करके अपडेट किया जा सकता है या इसे सीधे स्रोत संपादक द्वारा संपादित किया जा सकता है

शायद मुझे अब Matisse के साथ रहना चाहिए।

असंबंधित, यहां कोई व्यक्ति ग्रहण के भीतर रोक समस्या के लिए पूछ रहा है

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


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

इस परियोजना के बारे में दिलचस्प क्या है कि, भले ही आप सभी स्थितियों में उन प्रश्नों का उत्तर नहीं दे सकते हैं, फिर भी आप स्मार्ट समाधान ढूंढ सकते हैं जो 90% समय की समस्या का समाधान करते हैं, जो इस डोमेन के लिए वास्तव में बहुत अच्छा है।

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





halting-problem