मूल स्तर:
आइए चीजों को सबसे सरल और सबसे बुनियादी स्तर पर देखें।
गणित के लिए, हमारे पास:
2 + 3 = 5 है
मुझे इस बारे में पता चला कि जब मैं बहुत छोटी थी, तब बहुत छोटी थी। मैं सबसे बुनियादी तत्वों को देख सकता हूं: दो वस्तुएं, और तीन वस्तुएं। महान।
कंप्यूटर प्रोग्रामिंग के लिए, अधिकांश लोग उच्च-स्तरीय भाषा का उपयोग करते हैं। कुछ उच्च-स्तरीय भाषाओं को भी निम्न उच्च-स्तरीय भाषाओं में से एक में "संकलित" किया जा सकता है, जैसे सी। सी। तब असेंबली भाषा में अनुवादित किया जा सकता है। विधानसभा भाषा तब मशीन कोड में परिवर्तित हो जाती है। बहुत सारे लोग सोचते हैं कि जटिलता वहां समाप्त हो जाती है, लेकिन ऐसा नहीं है: आधुनिक सीपीयू मशीन कोड को निर्देश के रूप में लेते हैं, लेकिन फिर वास्तव में उन निर्देशों को निष्पादित करने के लिए "माइक्रो कोड" चलाते हैं।
इसका मतलब है कि, सबसे बुनियादी स्तर पर (संरचनाओं के सरलतम से निपटने), हम अब माइक्रो-कोड से निपट रहे हैं, जो हार्डवेयर में एम्बेडेड है और जो अधिकांश प्रोग्रामर सीधे उपयोग नहीं करते हैं, न ही अपडेट करते हैं। वास्तव में, न केवल अधिकांश प्रोग्रामर माइक्रो कोड (माइक्रो कोड से 0 स्तर अधिक) को नहीं छूते हैं, अधिकांश प्रोग्रामर मशीन कोड (माइक्रो कोड से 1 स्तर अधिक) को नहीं छूते हैं, न ही असेंबली (माइक्रो कोड से 2 स्तर अधिक) ( को छोड़कर, शायद, कॉलेज के दौरान कुछ औपचारिक प्रशिक्षण के लिए)। अधिकांश प्रोग्रामर केवल 3 या अधिक स्तरों पर समय बिताएंगे।
इसके अलावा, अगर हम असेंबली को देखते हैं (जो आमतौर पर लोगों के समान निम्न स्तर का होता है), प्रत्येक व्यक्तिगत कदम को आमतौर पर उन लोगों द्वारा समझा जा सकता है जिन्हें प्रशिक्षित किया गया है और उनके पास उस कदम की व्याख्या करने के लिए संसाधन हैं। इस अर्थ में, उच्च स्तरीय भाषा की तुलना में असेंबली बहुत सरल है। हालांकि, असेंबली इतनी सरल है कि जटिल कार्य, या यहां तक कि औसत दर्जे का कार्य करना, बहुत थकाऊ है। ऊपरी स्तर की भाषाएँ हमें इससे मुक्त करती हैं।
"रिवर्स इंजीनियरिंग" के बारे में एक कानून में, एक न्यायाधीश ने घोषणा की कि भले ही कोड सैद्धांतिक रूप से एक बार में एक बाइट को संभाला जा सकता है, आधुनिक कार्यक्रमों में लाखों बाइट्स शामिल हैं, इसलिए कुछ प्रकार के रिकॉर्ड (जैसे कोड की प्रतियां) केवल इस तरह के लिए बनाए जाने चाहिए संभव होने का प्रयास। (इसलिए आंतरिक विकास को कॉपीराइट कानून के सामान्यीकृत "नो मेकिंग कॉप्स" नियम का उल्लंघन माना गया।) (मैं शायद अनधिकृत सेगा जेनेसिस कारतूस बनाने के बारे में सोच रहा हूं, लेकिन गेम जिनी केस के दौरान कुछ कहा जा सकता है। )
आधुनिकीकरण:
क्या आप 286 के लिए कोड चलाते हैं? या आप 64-बिट कोड चलाते हैं?
गणित उन मूल सिद्धांतों का उपयोग करता है जो सहस्राब्दी के लिए वापस आते हैं। कंप्यूटर के साथ, लोग आमतौर पर दो दशकों पुराने निवेश को बेकार का साधन मानते हैं। इसका मतलब है कि गणित एक बहुत अधिक अच्छी तरह से परीक्षण किया जा सकता है।
प्रयुक्त उपकरणों के मानक:
मुझे सिखाया गया था (एक ऐसे दोस्त द्वारा जिसे खुद से ज्यादा औपचारिक कंप्यूटर प्रोग्रामिंग प्रशिक्षण था) कि बग-मुक्त सी कंपाइलर जैसी कोई चीज नहीं है जो सी विनिर्देशों से मिलती है। इसका कारण यह है कि सी भाषा मूल रूप से एक स्टैक के उद्देश्य के लिए अनंत स्मृति का उपयोग करने की संभावना मानती है। जाहिर है, इस तरह की असंभव आवश्यकता को तब से भटकना पड़ा जब लोगों ने उपयोग करने योग्य संकलक बनाने की कोशिश की जो वास्तविक मशीनों के साथ काम करते थे जो प्रकृति में थोड़ा अधिक परिमित हैं।
व्यवहार में, मैंने पाया है कि विंडोज स्क्रिप्ट होस्ट में JScript के साथ, मैं ऑब्जेक्ट्स का उपयोग करके बहुत कुछ पूरा करने में सक्षम रहा हूं। (मुझे पर्यावरण पसंद है क्योंकि नए कोड को आज़माने के लिए आवश्यक टूलसेट को Microsoft Windows के आधुनिक संस्करणों में बनाया गया है।) इस वातावरण का उपयोग करते समय, मैंने पाया है कि कभी-कभी वस्तु कैसे काम करती है, इस पर आसानी से पता लगाने योग्य प्रलेखन नहीं है। हालांकि, ऑब्जेक्ट का उपयोग करना इतना फायदेमंद है, कि मैं वैसे भी ऐसा करता हूं। तो मैं क्या करूँगा कोड लिखना है, जो एक सींग के घोंसले के रूप में छोटी गाड़ी हो सकती है, और एक अच्छी तरह से सैंडबॉक्स वाले वातावरण में ऐसा करें जहां मैं प्रभाव देख सकता हूं, और इसके साथ बातचीत करते समय ऑब्जेक्ट के व्यवहार के बारे में जान सकता हूं।
अन्य मामलों में, कभी-कभी केवल यह पता लगाने के बाद कि कोई वस्तु कैसे व्यवहार करती है, मैंने पाया है कि ऑब्जेक्ट (ऑपरेटिंग सिस्टम के साथ बंडल) छोटी गाड़ी है, और यह एक ज्ञात मुद्दा है कि Microsoft ने जानबूझकर तय नहीं किया जाएगा ।
ऐसे परिदृश्य में, क्या मैं OpenBSD पर भरोसा करता हूं, जो कि 10+ वर्षों में "केवल दो दूरस्थ छेद" के प्रसिद्ध सुरक्षा रिकॉर्ड के साथ, एक नियमित आधार पर (एक वर्ष में दो बार) नए मास्टर-शेड्यूल बनाने वाले मास्टरफुल प्रोग्रामर्स द्वारा बनाया गया है? (यहां तक कि उनके पास कम गंभीर मुद्दों के लिए इरेटा पैच है।) नहीं, किसी भी तरह से नहीं। मैं इस तरह के उच्च गुणवत्ता वाले उत्पाद पर भरोसा नहीं करता, क्योंकि मैं ऐसे व्यवसाय के लिए काम कर रहा हूं जो उन व्यवसायों का समर्थन करता है जो उन मशीनों के साथ लोगों की आपूर्ति करते हैं जो माइक्रोसॉफ्ट विंडोज का उपयोग करते हैं, इसलिए मेरे कोड को काम करने की आवश्यकता है।
व्यावहारिकता / उपयोगिता की आवश्यकता है कि मैं उन प्लेटफार्मों पर काम करता हूं जो लोगों को उपयोगी लगते हैं, और यह एक ऐसा मंच है जो सुरक्षा के लिए प्रसिद्ध है (भले ही सहस्राब्दी के शुरुआती दिनों से जबरदस्त सुधार किए गए हैं जो एक ही कंपनी के उत्पाद बहुत खराब थे) ।
सारांश
कंप्यूटर प्रोग्रामिंग में त्रुटि होने के कई कारण हैं, और यह कंप्यूटर उपयोगकर्ताओं के समुदाय द्वारा स्वीकार किया जाता है। वास्तव में, अधिकांश कोड उन वातावरणों में लिखे गए हैं जो त्रुटि-मुक्त प्रयासों को सहन नहीं करेंगे। (कुछ अपवादों, जैसे कि सुरक्षा प्रोटोकॉल विकसित करना, इस संबंध में थोड़ा और प्रयास प्राप्त कर सकते हैं।) इसके अलावा व्यवसायों के कारणों के बारे में सोचा गया था कि वे अधिक पैसा निवेश नहीं करना चाहते हैं, और ग्राहकों को खुश करने के लिए कृत्रिम समय सीमा को याद करते हैं, का प्रभाव है। प्रौद्योगिकी का मार्च जो केवल कहता है कि यदि आप बहुत अधिक समय बिताते हैं, तो आप एक अप्रचलित मंच पर काम करेंगे क्योंकि एक दशक के भीतर चीजें काफी बदल जाती हैं।
ऑफहैंड, मुझे याद आ रहा है कि कुछ बहुत ही उपयोगी और लोकप्रिय कार्य कितने कम थे, जब मैंने स्ट्रलेन और स्ट्रैपी के लिए कुछ स्रोत कोड देखे। उदाहरण के लिए, स्ट्रलेन कुछ ऐसा हो सकता है जैसे "int strlen (char * x) {char y = x; जबकि ( (y ++)); return (yx) -1;};"
हालाँकि, सामान्य कंप्यूटर प्रोग्राम इससे अधिक लंबे होते हैं। इसके अलावा, बहुत सारे आधुनिक प्रोग्रामिंग अन्य कोड का उपयोग करेंगे जो कम अच्छी तरह से परीक्षण किया जा सकता है, या यहां तक कि छोटी गाड़ी के रूप में भी जाना जाता है। आज की प्रणालियाँ इस बात की तुलना में अधिक विस्तृत हैं कि आसानी से किस माध्यम से सोचा जा सकता है, सिवाय हाथ-पांव के बहुत सारे मिनुतिया को छोड़कर "निचले स्तरों द्वारा संकलित विवरण" के रूप में।
यह अनिवार्य जटिलता, और जटिल और यहां तक कि गलत प्रणालियों के साथ काम करने की निश्चितता, कंप्यूटर प्रोग्रामिंग को बहुत सारे गणित की तुलना में सत्यापित करने के लिए बहुत सारे हार्डवेयर बनाता है जहां चीजें बहुत सरल स्तरों तक उबालने के लिए होती हैं।
जब आप गणित में चीजों को तोड़ते हैं, तो आपको व्यक्तिगत टुकड़े मिलते हैं जिन्हें बच्चे समझ सकते हैं। ज्यादातर लोग गणित पर भरोसा करते हैं; कम से कम बुनियादी अंकगणित (या, कम से कम, गिनती)।
जब आप वास्तव में कंप्यूटर प्रोग्रामिंग को तोड़ते हैं, तो यह देखने के लिए कि हुड के नीचे क्या हो रहा है, आप अंत में इलेक्ट्रॉनिक रूप से निष्पादित मानकों और कोड के टूटे हुए कार्यान्वयन के साथ समाप्त होते हैं, और यह कि भौतिक कार्यान्वयन माइक्रोकोड से केवल एक कदम नीचे है, जो कि अधिकांश विश्वविद्यालय-प्रशिक्षित कंप्यूटर वैज्ञानिक डॉन करते हैं 'स्पर्श की हिम्मत (अगर वे इसके बारे में जानते हैं)।
मैंने कुछ प्रोग्रामर्स के साथ बात की है जो कॉलेज में हैं या हाल ही में ग्रेजुएट हैं, जो इस धारणा पर एकमुश्त आपत्ति जताते हैं कि बग-फ्री कोड लिखा जा सकता है। उन्होंने संभावना को लिखा है, और हालांकि वे स्वीकार करते हैं कि कुछ प्रभावशाली उदाहरण (जो मैं दिखाने में सक्षम थे) कुछ ठोस तर्क हैं, वे ऐसे नमूनों को अप्रमाणिक दुर्लभ flukes मानते हैं, और अभी भी गिनती करने में सक्षम होने की संभावना को खारिज करते हैं ऐसे उच्च स्तर होने पर। (हम गणित में बहुत अधिक भरोसेमंद नींव की तुलना में बहुत अधिक अलग दृष्टिकोण रखते हैं।)