मेरी कोडिंग यात्रा में औपचारिक तरीकों की शक्ति को गले लगाना: मैं कैसे एक डैफनी इंजीलवादी बन गया

ब्लॉग 1NewsDevelopersEnterpriseBlockchain समझाया और सम्मेलनसमाचार

हमारे न्यूज़लेटर की सदस्यता लें.

ईमेल पता

हम आपकी निजता का सम्मान करते हैं

HomeBlogDevelopers

मेरी कोडिंग यात्रा में औपचारिक तरीकों की शक्ति को गले लगाना: मैं कैसे एक डैफनी इंजीलवादी बन गया

22 दिसंबर, 2020 को कॉनसेनसाइड 22, 2020 द्वारा पोस्ट किया गया

स्क्रीन शॉट 2020 12 15 पर 6 46 32 बजे 1


जोआन फुलर द्वारा

मैं यह कहते हुए शुरुआत करना चाहता हूं कि मैं इस ब्लॉग पोस्ट को इस उम्मीद में लिख रहा हूं कि अन्य लोग उस अधिगम के क्षण का अनुभव कर सकें जो मैंने सीखा था डैफनी मेरे अन्वेषण के भाग के रूप में औपचारिक तरीके. इसके अलावा, यह मेरी आशा है कि यह पोस्ट दूसरों के लिए एक उत्प्रेरक के रूप में कार्य करेगा, जो किसी को भी कोड लिखने के शस्त्रागार के भीतर एक महत्वपूर्ण और आवश्यक कौशल के रूप में औपचारिक तरीकों पर विचार करेगा। जैसे किसी का हिस्सा आर के भीतर स्वचालित सत्यापन टीम&D, कंसेंसे में, मैं Ethereum 2 चरण 0 विनिर्देशन के औपचारिक सत्यापन में डैफनी का उपयोग कर रहा हूं, और मुझे यह उपयोगी क्यों लगता है यह साझा करना चाहता हूं.

मेरी पृष्ठभूमि

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

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

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

मेरी पृष्ठभूमि इसलिए कहानी का हिस्सा है, क्योंकि मैं खुद कुछ हैरान हूं कि मैंने पहले औपचारिक तरीके नहीं खोजे। मैं खुद को एक गणितज्ञ मानता हूं; मुझे गणित, एल्गोरिदम और तर्क पसंद हैं। अब यह अधूरा परीक्षण पर भरोसा करने के लिए पागल लगता है, लेकिन यह भी किसी के लिए भी पागल लगता है जो प्रोग्राम को कम से कम कुछ औपचारिक तरीकों की पेशकश कर सकते हैं और बग के लापता होने के संभावित परिणामों की सराहना करते हैं, जिसमें कंप्यूटर प्रोग्राम कई तरीके हैं हमारे जीवन में एकीकृत। औपचारिक तरीके हमें परीक्षण से परे जाने की अनुमति देते हैं, यह साबित करने के लिए कि एक कार्यक्रम विनिर्देश के खिलाफ सही है जिसमें पूर्व और बाद की स्थिति शामिल हैं. 

पहला डैफनी उदाहरण

एक साधारण उदाहरण के रूप में एक सकारात्मक भाजक द्वारा गैर-नकारात्मक लाभांश एन के पूर्णांक विभाजन पर विचार करें; 

एन / डी

नीचे दिखाया गया है:

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

यह उदाहरण डैफनी का उपयोग करते हुए लिखा गया है: “कार्यात्मक शुद्धता के लिए एक भाषा और कार्यक्रम सत्यापनकर्ता” और मुझे मेरे अगले बिंदु पर लाता है, यही कारण है कि मैं डैफनी का ऐसा प्रशंसक हूं। मुझे लगता है कि यह कहना उचित है कि कई प्रोग्रामरों के लिए, प्रोग्राम की शुद्धता को सत्यापित करने के लिए “औपचारिक तरीकों” का उपयोग करने का विचार कुछ डरावना है और अक्सर इसे “बहुत” कठोर माना जाता है। क्या यह तकनीकों के संपर्क में कमी, लाभों की सराहना की कमी या इस क्षेत्र में प्रशिक्षण की कमी के कारण है; जो भी कारण हो सकते हैं, मेरा मानना ​​है कि डैफी किसी भी प्रोग्रामर को अपने काम में औपचारिक तरीकों को लागू करने में सफलता प्राप्त करने की अनुमति देने की क्षमता रखता है। ऊपर दिए गए कोड स्निपेट को देखते हुए, मुझे उम्मीद है कि कुछ प्रोग्रामिंग ज्ञान वाले लोग इस डैफनी कोड को पढ़ने में सक्षम होंगे; डैफनी एक प्रोग्रामर फ्रेंडली भाषा है। एक बार जब आप थोड़ा सा डैफी सीख लेते हैं तो प्रयोग शुरू करना बहुत आसान हो जाता है और फिर मूल रूप से सीखते हैं जैसे आप जाते हैं। और अगर आप डैफनी सीखने में रुचि रखते हैं, तो शुरुआत करने के लिए एक शानदार जगह है ट्यूटोरियल श्रृंखला Microsoft द्वारा। साइट में एक ऑनलाइन संपादक भी शामिल है, इसलिए ट्यूटोरियल उदाहरणों को आज़माना बहुत आसान है। सत्यापन कॉर्नर YouTube चैनल उपयोगी संदर्भों का एक अन्य स्रोत है.

मेरा समयानुकूल क्षण

अंत में जब मैं डैफनी सीख रहा था तब से मैं अपने एपिफनी पल को साझा करना चाहता था। मैंने निश्चित रूप से बड़ी प्रतिष्ठित कंपनियों से, कोड के छोटे और सरल टुकड़ों के बारे में कहानियाँ सुनी हैं, जिनमें बग्स छूट गए थे और अंततः कई मिलियन डॉलर खर्च हुए थे; लेकिन मुझे लगता है कि यह केवल तब होता है जब आप खुद को महसूस करते हैं कि अनजाने में एक साधारण फ़ंक्शन में बग बनाना कितना आसान होगा कि यह सब समझ में आता है! जिस समय आप खुद से कहते हैं, “ओह, यह गलती करना इतना आसान होगा!”

मेरा एक पल देखते हुए आया सत्यापन कॉर्नर वीडियो

इस ट्यूटोरियल में रस्टेन लेइनो एक SumMax विधि से गुजरता है जो क्रमशः दो पूर्णांक, x और y लेता है और योग और अधिकतम, s और m को क्रमशः लौटाता है। यह उदाहरण अपेक्षाकृत सीधा है और डैफनी कोड नीचे दिखाया गया है.

टाइपिंग के माध्यम से इनपुट x और y को पूर्णांक के रूप में निर्दिष्ट किया गया है और किसी अन्य पूर्व शर्त की आवश्यकता नहीं है। तीन पोस्ट स्थितियां चेक प्रदान करती हैं कि आउटपुट वास्तव में विनिर्देशों को पूरा करता है, अर्थात् जो कि x + y के बराबर है, और वह मीटर x या y के बराबर है और वह m x और y से अधिक नहीं है। SumMaxBackwards पद्धति को एक अभ्यास के रूप में प्रस्तुत किया गया है और यह वह जगह है जहाँ यह अधिक दिलचस्प हो जाता है। विनिर्देश सुमैक्स का उल्टा है, यानी दी गई राशि और अधिकतम रिटर्न पूर्णांक x और y। ठीक है, इसलिए पहला प्रयास समान पोस्टकंडिशन के साथ हो सकता है; इनपुट और आउटपुट के बीच संबंध अभी भी बने हुए हैं। अगर हम x को अधिकतम होने दें तो बीजगणित का एक त्वरित बिट हमें बताता है कि y का योग शून्य से अधिकतम के बराबर होना चाहिए। इसे ऑनलाइन एडिटर में डालने से निम्नलिखित जानकारी मिलती है.

स्क्रीन शॉट 2020 12 15 पर 6 38 37 बजे 1 स्क्रीन शॉट 2020 12 16 शाम 5 35 22 बजे

यह सत्यापित नहीं करता है। तो क्या गलत हुआ? हमें बताया जाता है कि पोस्टकंडिशन में पकड़ नहीं होती है और विशेष रूप से लाइन 3 पर पोस्टकंडिशन (एक्स सुनिश्चित करता है)<= एम && य <= m) पकड़ नहीं हो सकता है। अधिक बारीकी से देखने पर हम देखते हैं कि यह पोस्ट स्थिति उस एक्स को निर्दिष्ट करती है <= म और य <= एम। वैसे, हम जानते हैं कि x, m के बराबर या उससे कम है क्योंकि हम x को m के बराबर सेट करते हैं, तो इसका मतलब है कि y <= m भाग सत्यापित नहीं करता है। ये केसे हो सकता हे? हमारे बीजगणित ने हमें बताया कि y: = s – m। मान लें कि s 5 है और m 3 है, तो y = 5 – 3 = 2 जो y सुनिश्चित करता है <= एम; लेकिन मान लें कि हम इस पद्धति को 5 के बराबर और मी के बराबर 1 कहते हैं। कुछ भी हमें इन इनपुट मापदंडों के साथ पद्धति को कॉल करने से नहीं रोकेगा, लेकिन ऐसा करने से y = 5 – 1 = 4 और फिर y जैसी समस्या उत्पन्न होगी > म। मूल रूप से जो हम यहां देख रहे हैं, वह यह है कि भले ही इनपुट पैरामीटर अधिकतम दो पूर्णांकों का हो, जो सम राशि बनाता है, लेकिन हमें उस इनपुट के साथ विधि को कॉल करने की कोशिश करने से रोकने के लिए कुछ भी नहीं है जो मान्य नहीं है। जब तक किसी पूर्व शर्त को पूर्णांकों के लिए s और m के इनपुट को प्रतिबंधित करने के लिए शामिल नहीं किया जाता है जिसके परिणामस्वरूप आउटपुट x और y जो विनिर्देश को पूरा करते हैं, तब हमारी विधि गलत परिणाम उत्पन्न कर सकती है। मान्य इनपुट प्रदान करने के लिए हमें s और m के बीच किस संबंध की आवश्यकता है? थोड़ा और बीजगणित हमें दिखाता है कि एस <= m * 2 के लिए x और y का एक वैध समाधान होना चाहिए। यदि हम इसे एक पूर्व शर्त के रूप में जोड़ते हैं, तो डैफनी अब नीचे दिखाए अनुसार कोड को सत्यापित करने में सक्षम है. 

स्क्रीन शॉट 2020 12 15 पर 6 46 32 बजे 1 स्क्रीन शॉट 2020 12 16 शाम 5 37 39 बजे

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

मैं अभी क्या काम कर रहा हूं

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

न्यूज़लैटर नवीनतम न्यूज़रेम समाचार, एंटरप्राइज़ समाधान, डेवलपर संसाधनों, और अधिक के लिए हमारे न्यूज़लेटर को सदस्यता लें। ईमेल पता

Mike Owergreen Administrator
Sorry! The Author has not filled his profile.
follow me