हम संकलन समय की गारंटी पर अधिक शोध क्यों नहीं कर रहे हैं?


12

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

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

अब, मुझे आश्चर्य है: यदि मजबूत स्थैतिक गारंटी देता है, तो उस कोड की ओर जाता है जो अधिक प्रलेखित और सुरक्षित है, तो हम उस दिशा में अधिक शोध क्यों नहीं कर रहे हैं?

ऐसा प्रतीत होता है कि कुछ याद आ रहा है, एक ऐसी भाषा होगी जो एक सामान्य को परिभाषित करने के बजाय एक भाषा होगी int प्रकार जिसमें अंतर्निहित आर्किटेक्चर के बिट्स की संख्या द्वारा निर्धारित सीमा होती है, कोई भी रेंज हो सकती है (निम्नलिखित उदाहरण Int [a..b]में एक पूर्णांक प्रकार का वर्णन किया गया है ए और बी शामिल):

a : Int [1..24]
b : Int [1..12]
a + b : Int [2..36]
a - b : Int [-11..23]
b - a : Int [-23..11]

या (एडा से इसे लेकर):

a : Int [mod 24]
b : Int [mod 24]
a + b : Int [mod 24]

यह भाषा श्रेणी के लिए सर्वश्रेष्ठ अंतर्निहित प्रकार का चयन करेगी और अभिव्यक्तियों पर संकलन समय की जाँच करेगी। उदाहरण के लिए, इसलिए:

a : Int [-3..24]
b : Int [3..10]

फिर:

a / b

कभी परिभाषित नहीं किया जाएगा।

यह सिर्फ एक उदाहरण है, लेकिन मुझे लगता है कि बहुत अधिक है जो हम संकलन समय पर लागू कर सकते हैं। तो, इस पर इतना कम शोध क्यों लगता है? इस विचार का वर्णन करने वाले तकनीकी शब्द क्या हैं (ताकि मैं इस विषय पर अधिक जानकारी पा सकूँ)? सीमाएं क्या हैं?


2
पास्कल के पूर्णांक प्रकार (यानी, 1960) हैं, लेकिन दुर्भाग्य से अधिकांश कार्यान्वयन केवल रनटाइम पर उन्हें जांचते हैं (int (-1..4) संकलन समय पर int (100..200) के साथ संगत असाइनमेंट है)। उस से सीमित लाभ होते हैं, और अनुबंध आधारित प्रोग्रामिंग एक बेहतर दिशा (उदाहरण के लिए एफिल) में विचार का विस्तार करता है। C # जैसी भाषाएं उन विशेषताओं के साथ कुछ लाभ प्राप्त करने की कोशिश करती हैं, मैंने उनका उपयोग नहीं किया है इसलिए यह सुनिश्चित नहीं है कि वे व्यवहार में कितने उपयोगी हैं।

1
@ @: C # में विशेषताएँ सिर्फ मेटाडेटा वर्ग हैं, इसलिए रनटाइम के दौरान कोई भी डेटा सत्यापन होगा।
रॉबर्ट हार्वे

8
आप कैसे जानते हैं कि इस पर बहुत कम शोध है? गुगली करने की कोशिश करो dependent typeया refinement type
फिल

3
मैं मानता हूं कि आधार त्रुटिपूर्ण प्रतीत होता है; यह निश्चित रूप से एक सक्रिय अनुसंधान क्षेत्र है। काम कभी नहीं होता है । इसलिए, मैं यह नहीं देखता कि इस प्रश्न का उत्तर कैसे दिया जा सकता है।
राफेल

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

जवाबों:


11

मैं एक स्थिति बताने के लिए कितना में नहीं हूँ और अधिक शोध विषय पर किया जाना चाहिए, लेकिन वहाँ है कि मैं आपको बता सकता है शोध किया जा रहा है, उदाहरण के लिए Verisoft एक्सटी जर्मन सरकार द्वारा वित्त पोषित कार्यक्रम।

जिन अवधारणाओं के बारे में आपको लगता है कि आप औपचारिक सत्यापन और अनुबंध आधारित प्रोग्रामिंग कहलाते हैं , जहां बाद वाला प्रोग्राम करने का पहला तरीका है। कॉन्ट्रैक्ट-आधारित प्रोग्रामिंग में आप पहले अपना कोड सामान्य लिखते हैं और फिर तथाकथित कॉन्ट्रैक्ट्स को कोड में डालते हैं। एक आसानी से प्रयोग करने योग्य भाषा जो इस प्रतिमान पर आधारित है Microsoft रिसर्च द्वारा Spec # है, और C # के लिए कार्यात्मक समान लेकिन थोड़े कम सुंदर कोड कॉन्ट्रैक्ट्स एक्सटेंशन जो आप दोनों ऑनलाइन आज़मा सकते हैं (उनके पास अन्य भाषाओं के समान उपकरण भी हैं, वृद्धि 4fun देखें )। आपके द्वारा उल्लिखित "प्रकार के साथ int" एक फ़ंक्शन में दो अनुबंधों द्वारा परिलक्षित होगा:

Contract.Requires(-3 <= a && a <= 24);
Contract.Requires( 3 <= b && b <= 10);

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

P(x1,x2,...,xn)nP सभी संभव चर असाइनमेंट के लिए सही है, तो प्रोग्राम को सही माना जाता है। यह जांचने के लिए कि क्या यह मामला है या नहीं, एसएमटी प्रोवरप्रयोग किया जाता है। सीएस की ओर से, वे दो प्रक्रिया के महत्वपूर्ण भाग हैं - सत्यापन की शर्तों की पीढ़ी मुश्किल है और एसएमटी या तो एनपी-पूर्ण या अनिर्दिष्ट समस्या है, जो कि सिद्धांतों पर निर्भर करती है। यहां तक ​​कि एसएमटी सॉल्वरों के लिए एक प्रतियोगिता भी है , इसलिए निश्चित रूप से इसमें कुछ शोध किया जाता है। इसके अतिरिक्त, औपचारिक सत्यापन के लिए एसएमटी का उपयोग करने के लिए वैकल्पिक दृष्टिकोण हैं जैसे कि राज्य अंतरिक्ष गणना, प्रतीकात्मक मॉडल की जाँच, बाध्य मॉडल की जाँच और कई और जो शोध भी किए जा रहे हैं, यद्यपि एसएमटी, afaik है, वर्तमान में सबसे "आधुनिक" दृष्टिकोण है।

सामान्य विचार की सीमा के बारे में:

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

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


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