सारांश
यह पाठ आठवीं इकाई को, और उसके साथ पाठ्यक्रम को, समाप्त करता है। यह इकाई के तीन पाठों की उपलब्धियों को एकत्र करता है; उस अवधारणा-शृंखला को फिर से गढ़ता है जो किसी मॉड्यूल के इंटरफ़ेस से विधि के रूप में डिबगिंग तक जाती है; इसमें से जो किसी भी भाषा में लागू होता है उसे C++ की अपनी विशेषताओं से अलग करता है; एक परिभाषा नियम के उस उल्लंघन को दिखाता है जिसका निदान कोई नहीं करता, और पाठ्यक्रम के समूचे अपरिभाषित व्यवहार को एक सूची में इकट्ठा करता है, साथ में यह कि हर स्थिति को क्या पकड़ता है; अपने समापन मूल्यांकन में प्रवेश मूल्यांकन के कौशल दोहराता है; इकाई को जोड़ने वाली छह चुनौतियाँ प्रस्तुत करता है; और पाठ्यक्रम की अंतिम परियोजना के साथ समाप्त होता है, जिसका विनिर्देश सटीक है, जिसके साथ रूब्रिक है, जो चार चरणों में है और जिसके हर चरण का एक जाँचा हुआ संदर्भ समाधान है।
अधिगम उद्देश्य
- किसी प्रोग्राम को हेडर, इन्क्लूड गार्ड और अनुबंधों वाले कई मॉड्यूलों में संगठित करना, उसे पृथक रूप से कंपाइल करना और लिंकर के संदेशों का निदान करना।
- किसी मॉड्यूल का परीक्षण उसके विनिर्देश से करना: डिटेक्टरों के अंतर्गत चलने वाला स्वचालित परीक्षणों का प्रोग्राम लिखना, और जो घटित नहीं हो सकता उसे अभिकथनों से जाँचना।
- किसी दोष को एक विधि (पुनरुत्पादित करना, छोटा करना, परिकल्पनाएँ बनाना, द्विभाजन) और डिबगर से ढूँढ़ना, और जाँच-पड़ताल को दर्ज करना।
- पाठ्यक्रम में दिखाए गए अपरिभाषित व्यवहार को, हर स्थिति को क्या पकड़ता है इसके साथ, और एक परिभाषा नियम के उस उल्लंघन को पहचानना जिसका निदान कोई नहीं करता।
- पूरे पाठ्यक्रम को एक परियोजना में समेटना: सारणीबद्ध डेटा के प्रबंधन के एक प्रोग्राम का विनिर्देश बनाना, उसका विघटन करना, उसे बनाना, उसका परीक्षण करना, उसकी लागत मापना और उसे डिबग करना।
इकाई की उपलब्धियाँ
इकाई का उद्देश्य ऐसे प्रोग्रामों को संगठित करना, सत्यापित करना और डिबग करना सिखाना था जो अब न एक फ़ाइल में समाते हैं, न दिमाग़ में। यह उद्देश्य उस आधार पर पूरा हुआ जिसे परिचय ने पहले से ज्ञात माना था: घोषणा और परिभाषा, कंपाइलेशन और लिंकिंग, अनुबंध, निश्चर और द्विआधारी खोज। पुस्तकों के कैटलॉग का वह प्रोग्राम जिससे इकाई खुली थी, एक फ़ाइल में समा जाता था, parseInt की एक और प्रति बनाता था, और जहाँ विनिर्देश “दोनों सिरे शामिल” कहता था वहाँ < लिखने के कारण “एकांत के सौ वर्ष” को चुपचाप छोड़ देता था; इस पाठ के अंतिम भाग में उसे अंतिम परियोजना के रूप में फिर से लिखा गया है: अनुबंधों वाले चार मॉड्यूल, आदेशों का उत्तर देने वाला एक मुख्य प्रोग्राम, और पच्चीस मामलों वाला एक परीक्षण प्रोग्राम। इनमें से दो मामले, “बीच, सीमाएँ” और “बीच, एक वर्ष”, आरंभिक प्रोग्राम की शर्त के साथ विफल होते हैं, और इसलिए वह त्रुटि किसी के ध्यान में आए बिना नहीं लौटेगी।
कई फ़ाइलें और अपनी लाइब्रेरी
कई फ़ाइलें और अपनी लाइब्रेरी पाठ ने एक प्रोग्राम को घोषणा करने वाले हेडर, परिभाषा करने वाली कार्यान्वयन फ़ाइल और उपयोग करने वाली main.cpp में बाँटा। उसने इन्क्लूड गार्ड प्रस्तुत किए, जो एक ट्रांसलेशन यूनिट के भीतर दोहरे इन्क्लूड को रोकते हैं; एक परिभाषा नियम, जो “multiple definition” और “undefined reference” को समझाता है और inline को अनुमति का उसका आज का अर्थ देता है; -c के साथ पृथक कंपाइलेशन, जो केवल उन्हीं ऑब्जेक्टों को दोबारा कंपाइल करता है जिनके स्रोत या हेडर बदले; और पहले के पाठों के फ़ंक्शनों से बनी अपनी लाइब्रेरी।
प्रोग्रामों का परीक्षण
प्रोग्रामों का परीक्षण पाठ ने सिखाया: विनिर्देश से मामले निकालना, प्रदेशों, सीमाओं और विशेष स्थितियों के अनुसार, और अपेक्षित परिणाम को किसी दूसरे रास्ते से निकालना; स्वचालित परीक्षणों का ऐसा प्रोग्राम लिखना जो केवल विफलताओं की सूचना दे और कोड 0 या 1 के साथ समाप्त हो; जो घटित नहीं हो सकता उसके लिए assert का उपयोग करना, यह जानते हुए कि -DNDEBUG उसे उसकी शर्त समेत मिटा देता है; static_assert और constexpr से कंपाइल-समय पर परीक्षण करना; और परीक्षणों को डिटेक्टरों (मेमोरी त्रुटियों का डिटेक्टर, AddressSanitizer, और अपरिभाषित व्यवहार का डिटेक्टर, UndefinedBehaviorSanitizer) के साथ चलाना। यह सब डाइक्स्ट्रा की चेतावनी पर टिका है: परीक्षण त्रुटियों की उपस्थिति दिखाता है, उनकी अनुपस्थिति कभी नहीं।
प्रोग्रामों की डिबगिंग
प्रोग्रामों की डिबगिंग पाठ ने डिबगिंग को एक प्रायोगिक विधि के रूप में प्रस्तुत किया: विफलता को पुनरुत्पादित करना, मिथ्याकरणीय परिकल्पनाएँ बनाना, प्रयोगों से उनके बीच निर्णय करना और संदिग्ध हिस्से का द्विभाजन करना। उसने उपकरण को विस्तार से समझाया (ऑप्टिमाइज़ेशन के बिना -g, तीनों सिस्टमों में Visual Studio Code का कॉन्फ़िगरेशन, GDB का एक वास्तविक सत्र, साधारण और सशर्त ब्रेकपॉइंट, एक-एक कदम का निष्पादन और कॉल स्टैक) और उन रणनीतियों को भी जो उपकरण से अधिक मूल्यवान हैं: मामले को छोटा करना, अभिकथनों से अंतिम सही बिंदु ढूँढ़ना, और डिटेक्टर की रिपोर्ट के पहले अपने फ़्रेम से शुरू करना।
सामग्री लोड हो रही है…