मैं औद्योगिक प्रोग्रामिंग पर हमारी
कंपनी के परिचयात्मक पाठ्यक्रम के अंश
जारी करना
जारी रखता
हूं ।
भाग तीन: सिंथेटिक चीनी या भाषा विकास इतिहास
इस भाग में, प्रोग्रामिंग भाषाओं के विकास का इतिहास बताया गया है, और ओओपी और कार्यात्मक प्रोग्रामिंग को भी सुलभ तरीके से समझाया गया है। अन्य भाग
यहां देखे जा सकते
हैं ।
सिन्थेटिक शुगर (सिन्थेटिक शुगर) - PL के वाक्य रचना में परिवर्धन के सामान्य पदनाम, जो भाषा के उपयोग को अधिक सुविधाजनक बनाते हैं, लेकिन इसमें नई सुविधाएँ नहीं जोड़ते हैं।
पीएल के विकास का पूरा इतिहास सिंथेटिक चीनी की मिठास बढ़ाने की कहानी है।
मशीनी भाषाएँ
यह सब मशीन पर निर्भर भाषाओं के साथ शुरू हुआ - ऐसी भाषाएँ जो कुछ कंप्यूटर प्लेटफार्मों की संरचना और विशेषताओं को ध्यान में रखती हैं। कैलकुलेटर पर प्रोग्राम करने वालों को याद है कि कैसे उन पर प्रोग्राम संकलित किए गए थे।
एक दर्जन रजिस्टर जहां गणनाओं के परिणाम लिखे गए थे (वे कहां हैं, ये गीगाबाइट्स रैम?), ऑफ़सेट रजिस्टरों की एक जोड़ी (ट्यूरिंग मशीन को याद रखें, हाँ, रजिस्टरों ने संकेत दिया कि अगला कमांड लेने के लिए कौन सा डेटा रजिस्टर है!), और कमांड का रजिस्टर जहां अगला है ऑपरेशन (मूल्य पढ़ें, मूल्य लिखें, दो मेमोरी रजिस्टरों का मूल्य जोड़ें, आदि)।
वॉन न्यूमैन वास्तुकला
यहां तक कि इन उपकरणों की वास्तुकला हमेशा वॉन न्यूमैन वास्तुकला के अनुरूप नहीं थी - आधुनिक कंप्यूटर के लिए मानक।
दरअसल, वॉन न्यूमैन आर्किटेक्चर में प्रोसेसर से मेमोरी को अलग करना और मेमोरी में म्यूटेबल प्रोग्राम्स को स्टोर करना शामिल है। कैलकुलेटर आमतौर पर निष्पादन योग्य कार्यक्रमों के एक निश्चित सेट के साथ उपकरण थे।
दरअसल, वॉन न्यूमैन आर्किटेक्चर के लिए संक्रमण ने बाहरी स्रोत से स्वचालित रूप से निष्पादित कार्यक्रमों को सेट करने की क्षमता को जन्म दिया - शुरू में छिद्रित टेप और छिद्रित कार्ड से।
लोगों ने इस तरह प्रोग्राम किया, कि एक निश्चित रजिस्टर के अनुरूप कार्ड में एक छेद, इस प्रकार उनमें बिट-बाय-बिट मान सेट करना। कई कहानियाँ इस बात से संबंधित हैं कि कैसे सैकड़ों छिद्रित कार्डों में एक कार्यक्रम चरमरा गया, जब अजीब तकनीशियनों ने कार्डबोर्ड के इन ढेरों को फर्श पर गिरा दिया।
कोडांतरक
मशीन कोड पर प्रोग्रामिंग बहुत सुविधाजनक नहीं थी, इसलिए पहले अवसर पर, कोडांतरक दिखाई दिया - एक भाषा जो मशीन संचालन को दोहराती है, लेकिन मानव-पठनीय निर्देशों और कागज पर कलम करने की क्षमता के साथ एल्गोरिथ्म का वर्णन करने के लिए बिट्स के सेट के रूप में नहीं, बल्कि कुछ और अधिक सार्थक पाठ के रूप में।
असेंबलर को मशीन की वास्तुकला से भी जोड़ा जाता है (चूंकि इसके कमांड प्रोसेसर के निर्देशों को दोहराते हैं), लेकिन रसातल में एक कदम पहले ही ले लिया गया है और चीनी के क्रिस्टल में भाषाएं अधिक से अधिक बढ़ने लगी हैं।
ढेर भाषाएँ
पहला संकेत डेटा स्टैक का उपयोग था। स्टैक दिखाई दिया मनमाना डेटा के अस्थायी भंडारण की समस्या को हल करने के लिए। बेशक, डेटा को रजिस्टर में संग्रहीत किया जा सकता है, लेकिन इस मामले में, आपको प्रत्येक रजिस्टर का नाम याद रखना होगा, जिस डेटा से आप प्राप्त करना चाहते हैं।
स्टैक की एक विशेषता इसकी से डेटा प्राप्त करने के लिए एक विशेष प्रक्रिया है: किसी भी समय, स्टैक में केवल शीर्ष तत्व उपलब्ध होता है, अर्थात। अंतिम आइटम स्टैक पर लोड किया गया। स्टैक से शीर्ष तत्व को उतारना एक स्वचालित सींग के साथ सादृश्य द्वारा अगले तत्व को उपलब्ध करता है - वहां पहला कारतूस जोर केवल अंतिम तक पहुंच सकता है।
अब यह बेतहाशा असहज लग सकता है, लेकिन इसने दिनचर्या बनाने की अनुमति दी है।
सबरूटीन को कॉल करने से पहले, हम डेटा के साथ एक विशेष रूप से नामित स्टैक को आबाद करते हैं। सबरूटीन, यह जानते हुए कि पैरामीटर को स्टैक पर किस क्रम में रखा गया है, उन्हें वहां से उठा सकते हैं और उन्हें अपने निष्पादन में उपयोग कर सकते हैं, और निष्पादन पर, उनके काम के परिणामों को उसी या दूसरे स्टैक पर डाल सकते हैं। इसके अलावा, मुख्य कार्यक्रम में उप-नियंत्रण पर नियंत्रण स्थानांतरित करने से पहले स्टैक पर अपने डेटा को बचाने की क्षमता है। नियंत्रण वापस करने के बाद, प्रोग्राम केवल स्टैक से अपने मूल्यों को पुनर्स्थापित करता है और इस तथ्य पर ध्यान नहीं देता है कि प्रोसेसर रजिस्टरों में मौजूद डेटा को सबरूटीन द्वारा मिटाया जा सकता है।
Macroassembler
अगला चरण मैक्रो असेंबलर था। एक मैक्रोसेम्बलर एक मैक्रो प्रोसेसर के लिए एक प्रोग्राम है, जो बदले में एक उच्च स्तर की भाषा (मैक्रो असेंबलर) से मशीन कोड में एक अनुवादक था। स्टैक का उपयोग करके, उदाहरण के लिए, अपनी खुद की कमांड बनाना संभव हो गया।
स्टैक कमांड (पुश, पॉप), डेटा स्टैक कॉपी करने के लिए कमांड पैदा होते हैं।
एक मैक्रोसेम्बलर उच्च-स्तरीय भाषाओं को जन्म देता है, जिसके लिए दर्जनों या सैकड़ों प्रोसेसर निर्देश हैं। FORT, ALGOL, BASIC ने अपनी यात्रा शुरू की ...
मॉड्यूलर भाषा
विस्तारित सिंटैक्स के निषिद्ध फल को चखने के बाद, प्रोग्रामर बंद नहीं हुए और वांछित प्रतिरूपकता: यह एक अलग से लिखित प्रोग्राम मॉड्यूल को कॉल करने के लिए बहुत सुविधाजनक है और इसके एल्गोरिथ्म में तल्लीन नहीं है। मुख्य बात यह जानना है कि यह इनपुट के रूप में डेटा कैसे प्राप्त करता है और यह परिणाम कैसे देता है।
कोडांतरक को कमांड के साथ फिर से भर दिया जाता है जो विभिन्न उपप्रोग्रामों को कॉल करते समय मॉड्यूल के नामकरण और कनेक्शन, स्थानांतरण और नियंत्रण की वापसी की सुविधा प्रदान करता है। डेटा विनिमय इंटरफेस विकसित किया जा रहा है। डेटा संरचना की अवधारणा उभर रही है।
प्रक्रियात्मक भाषाएँ
मॉड्यूलर भाषा के लिए एक तार्किक जोड़ एक प्रक्रिया या उपप्रोग्राम की अवधारणा थी। उपप्रोग्राम में दो महत्वपूर्ण विशेषताएं हैं:
1. यह नाम है, अर्थात् हम नाम से एक दिनचर्या कह सकते हैं
2. उपप्रोग्राम कहा जाता है, हम यह सुनिश्चित करने के लिए जानते हैं कि यह उसी स्थान पर नियंत्रण लौटाएगा जहां से इसे बुलाया गया था
उदाहरण के लिए, BASIC में, एक सबरूटीन को GOSUB: लेबल: कहा जाता था।
समारोह
केवल एक चीज गायब थी: मैं मूल कार्यक्रम के चर (जिसमें से सबरूटीन कहा जाता था) को खराब नहीं करना चाहता था। लेकिन यह कैसा था? वैश्विक अंतरिक्ष के सभी चर, यदि आप उन्हें उपप्रोग्राम में उपयोग करना शुरू करते हैं, तो यह उन्हें अधिलेखित कर देता है।
इसलिए एक फ़ंक्शन और स्थानीय चर की अवधारणा का आविष्कार किया गया था: हम नामित सबरूटीन कहते हैं और वहां कुछ मान पास करते हैं। दिनचर्या पारित मूल्यों को स्थानीय नामित चर के रूप में मानती है।
विकास के साथ, फ़ंक्शन ने परिणाम वापस करने की क्षमता प्राप्त की है: इससे पहले, क्योंकि, जैसा कि था, वापसी मूल्य वैश्विक चर में से एक में दर्ज किया गया था।
समारोह में निम्नलिखित विशेषताएं हैं:
1. उसका नाम है
2. मापदंडों को वहां स्थानांतरित किया जाता है
3. पारित पैरामीटर केवल फ़ंक्शन के अंदर नामित पैरामीटर के रूप में उपलब्ध हैं, वे फ़ंक्शन के बाहर दिखाई नहीं देते हैं
4. एक फ़ंक्शन अपने स्थानीय नामित मापदंडों का उपयोग कर सकता है जो इस फ़ंक्शन के बाहर दिखाई नहीं देते हैं
5. कार्य का परिणाम वापस कर सकता है
फ़ंक्शन सिंटैक्स का परिचय सामंजस्यपूर्ण रूप से प्रक्रियात्मक प्रोग्रामिंग भाषाओं को पूरक करता है।
क्रियात्मक भाषाएँ
स्वाभाविक इच्छा यह थी कि फ़ंक्शन को पैरेंट फ़ंक्शन के स्थानीय चर का निरीक्षण करने की क्षमता के साथ बुलाया जाए, जिसे कॉल किया जाता है।
गोधूलि मन की इस प्रतिभा को हल करने के लिए, वे निष्पादन के संदर्भ की अवधारणा को जन्म देते हैं: यह रनवे पर कार्यों के लिए उपलब्ध नामित चर का एक क्षेत्र है। इस डेटा क्षेत्र को अंतर्निहित-विस्तार योग्य बनाया जाता है: जब एक बच्चे के फ़ंक्शन को बुलाया जाता है, तो यह अपना स्वयं का संदर्भ बनाता है, जो बेटी फ़ंक्शन के अंदर घोषित चर द्वारा पूरक होता है। इसके अलावा, ये चर बेटी के कार्य के बाहर दिखाई नहीं देते हैं। लेकिन वे पोती समारोह, पोती समारोह, और इतने पर बुलाते समय उपलब्ध होंगे।
निष्पादन संदर्भ को विरासत में देने की क्षमता को बंद करना कहा जाता है।
निष्पादन संदर्भ के साथ पूरी तरह से काम करने की क्षमता कार्यात्मक प्रोग्रामिंग भाषाओं को उत्पन्न करती है।
अंत में, वे एक फ़ंक्शन को किसी अन्य फ़ंक्शन को कॉल करने के लिए एक पैरामीटर के रूप में पारित करने की क्षमता को जोड़कर पूरा किया जाता है, साथ ही एक फ़ंक्शन को एक सबरूटीन निष्पादित करने के परिणामस्वरूप वापस करता है।
डेटा प्रकार
उसी समय, प्रोग्रामर के विचार अभी भी खड़े नहीं हुए थे। प्रोग्रामर ने डेटा प्रकारों का आविष्कार किया।
प्रारंभ में, आखिरकार, जैसा कि यह था, डेटा विशेष रूप से द्विआधारी रूप में उपलब्ध था - शून्य, और एकल।
लोगों के लिए, व्यावहारिक समस्याओं को हल करने के लिए, उच्च स्तरों के सार के साथ काम करना अधिक सुविधाजनक है। तो पूर्णांक डेटा प्रकार यह इंगित करने की क्षमता के बिना दिखाई देते हैं कि वे नकारात्मक हैं या नहीं (बाइट, अहस्ताक्षरित पूर्णांक, अहस्ताक्षरित लंबे पूर्णांक, आदि)।
फिर, उनके विकास के रूप में - एक नकारात्मक संख्या रिकॉर्ड करने की क्षमता के साथ डेटा प्रकार (पहले बिट द्वारा एन्कोड किया गया, जिसके संबंध में असमानता की अजीब घटनाएं थीं +0 और -0)। इसके अलावा, एक फ़्लोटिंग पॉइंट के साथ अधिक सुविधाजनक कार्य के लिए, प्रकार फ़्लोट और डबल फ़्लोट उत्पन्न हुआ (जैसा कि आप अनुमान लगा सकते हैं, डबल फ़्लोट एक ही फ़्लोट है, लेकिन दशमलव बिंदु से पहले और बाद में दोनों और वर्ण लिखने की क्षमता के साथ)।
फ्लोट प्रकार का एक दिलचस्प बाइट प्रतिनिधित्व है, सिद्धांत रूप में, एक संख्या को पारित करने के लिए, हमें एक ऋणात्मक संख्या निर्दिष्ट करने की क्षमता के साथ एक ही पूर्णांक की आवश्यकता है या नहीं और यह इंगित करने के लिए कि अंक की शुरुआत से कितने अंक एक बिंदु लगाने के लिए आवश्यक हैं।
तार्किक संचालन के लिए, सिद्धांत रूप में, एक ही शून्य और एक पूरी तरह से पर्याप्त थे, लेकिन अधिक गहनता के लिए वे बूलियन प्रकार में दो मूल्यों के साथ लिपटे थे सच्चे और झूठे (जिसके द्वारा, वैसे, एक ही इकाई और शून्य थे)।
अगले प्रकार के प्रोग्रामर की बुरी तरह से जरूरत एक सरणी थी। डेटा ऐरे स्टैक से मौलिक रूप से भिन्न था, न केवल अंतिम पोप किए गए आइटम तक मुफ्त पहुंच की संभावना से, बल्कि आम तौर पर संख्या से किसी को भी। सरणी को प्रोग्रामर को चिपके कोशिकाओं के रूप में प्रस्तुत किया गया था, जिसके अंदर डेटा स्थित है, इसलिए सरणी को शुरू में एक निश्चित आकार में से एक पर सेट किया गया था और इस आकार को बदलना असंभव था।
लेकिन, आखिरकार, कोशिकाओं को जरूरी नहीं भरा जाता है? तो एक खाली सेल के पदनाम की आवश्यकता थी और प्रकार शून्य उत्पन्न होता है। वास्तव में, पहले यह कोड 0x0 के साथ एक प्रतीक था, जिसके कारण यह बहुत ही सेल में शून्य मान लिखने के लिए आवश्यक होने पर मजेदार घटनाएं होती थीं, और फिर इसे पढ़ें और इसे बिल्कुल शून्य के रूप में व्याख्या करें, और 0 के मान के साथ अहस्ताक्षरित पूर्णांक के रूप में नहीं।
सरणी घोषित करने के लिए, एक मेमोरी टुकड़ा (बफर) यह दर्शाता है कि इस टुकड़े में कितने सेल स्थित होंगे, साथ ही इसमें कौन से तत्व रखे जाएंगे। और रिची आपको टाइप इंट के एक सरणी में लंबे प्रकार का एक तत्व लिखने नहीं देता! सबसे अच्छे मामले में, इसके बाद के तत्व क्षतिग्रस्त हो गए, सबसे खराब स्थिति में, एक बफर अतिप्रवाह हुआ और आवंटित मेमोरी बफर के तुरंत बाद स्थित अन्य गैर-सरणी डेटा क्षतिग्रस्त हो सकते हैं।
स्ट्रिंग्स, वैसे, शुरू में पात्रों की सरणियों के रूप में दिखाई दिया (मुझे एक अन्य डेटा प्रकार - चार, जो अनिवार्य रूप से बाइट के अनुरूप था) को पेश करना था। इस वजह से, लाइनों की लंबाई पहले से घोषित की जानी थी।
चर-लंबाई के तारों का सामना करने के लिए, हम स्ट्रिंग के अंत को चिह्नित करने के लिए एक अशक्त मार्कर के साथ आए। यही है, पहले की तरह, स्ट्रिंग एक सरणी थी, लेकिन किसी भी स्ट्रिंग को समायोजित करने के लिए इस सरणी की लंबाई तुरंत बड़ी थी (640kb मेमोरी किसी भी प्रोग्राम के लिए पर्याप्त है, हाँ)। सरणी की शुरुआत में लाइन शुरू हुई, और इसके अंत को शून्य बाइट्स के रूप में चिह्नित किया गया था, नल के बाद जो आया उसे स्ट्रिंग नहीं माना गया।
करीब से निरीक्षण पर एक शून्य मार्कर के साथ एक पंक्ति के अंत को चिह्नित करने के लिए कागज पर एक अच्छा विचार भयानक निकला: कुछ भी हमें लाइन के बीच में नल जोड़ने और इसे से लुल्स का एक गुच्छा होने से नहीं रोका। इस प्रकार सी-स्ट्रिंग्स का युग शुरू हुआ।
संदर्भ
मेमोरी बफर के साथ डेटा के साथ काम करने वाले संगठन ने एक दिलचस्प अवसर को जन्म दिया जब एक फ़ंक्शन को कॉल करने के लिए वहां डेटा ही नहीं, बल्कि उनके लिए एक लिंक।
पहले, यह कैसा था? चरों के मानों को कार्यों में स्थानांतरित कर दिया गया था, मूल डेटा को नुकसान से बचाने के लिए इन मानों को फ़ंक्शन के नामित चर में कॉपी किया गया था।
लेकिन आप केवल फ़ंक्शन में आवंटित मेमोरी के टुकड़े के पते के मूल्य को पारित कर सकते हैं और फिर उसमें से किसी भी उपलब्ध डेटा प्रकार के चर को पढ़ सकते हैं! तो एक और डेटा प्रकार दिखाई दिया - लिंक।
एक लिंक एक चर के लिए एक लिंक है जिसके लिए मेमोरी का एक ब्लॉक आवंटित किया जाता है। चर के साथ काम करने के तरीके दोनों मूल्य (इस मेमोरी ब्लॉक के साथ सीधे दोनों) में दिखाई देते हैं और संदर्भ से (हम चर से सूचक को पढ़ते हैं, फिर इसका पालन करें और वहां स्मृति में मूल्य बदलें)।
डेटा संरचनाएं
ऐसा लगता है, जिसके लिए हम इसके लिए लड़े और इसमें भाग गए: हमने अलग-अलग चर-अर्क को फ़ंक्शन के अंदर रखा ताकि उन्हें खराब न करें, लेकिन अब हम एक बंदूक दे रहे हैं जिससे आप पैर में भी गोली मार सकते हैं!
लेकिन यह यहां नहीं था: संदर्भ के अनुसार चर को पार करने से सरल डेटा प्रकारों - डेटा संरचनाओं से संपूर्ण निर्माण करने का एक अनूठा अवसर प्रदान किया गया!
उदाहरण के लिए, सरणियों से लिंक की एक सरणी के लिए लिंक को व्यवस्थित करना संभव हो गया ... तो आप एक पूरे पेड़ का निर्माण कर सकते हैं!
स्वाभाविक रूप से, इस तरह के एक सरणी का कोई व्यावहारिक मूल्य नहीं है, क्योंकि यह सब सरल डेटा प्रकारों का उपयोग करके आयोजित किया जा सकता है, लेकिन यदि आप ऐडऑनोड जैसे फ़ंक्शन जोड़ते हैं, तो प्रोग्राम को पेड़ के साथ काम करने वाले को हटा दें और इन कार्यों में डेटा संरचना के लिए एक लिंक पास करें, फिर यह एक कामकाजी और बहुत ही आकर्षक डिजाइन निकला है।
संरचनात्मक भाषाएँ
तो यह पता चला कि प्रोग्रामर अपने प्रोग्राम के लिए अपने प्रकार के डेटा को सुविधाजनक बना सकता है - बस एक डेटा संरचना बनाएं और उनके साथ काम करने के कार्यों का वर्णन करें!
इस तरह से संरचनात्मक प्रोग्रामिंग भाषाएं दिखाई देती हैं। वे तुरंत एक नए डेटा प्रकार का वर्णन करने की क्षमता को जोड़ते हैं, किसी तरह इस प्रकार को नाम देने की क्षमता और इसके लिए कुछ संचालन सेट करते हैं।
उदाहरण के लिए, एक स्ट्रिंग को न केवल एक सरणी के रूप में दर्शाया जा सकता है, बल्कि + ऑपरेटर के माध्यम से संघटन कार्यों के साथ एक दोहरी लिंक की गई सूची के रूप में और [] ऑपरेटर के माध्यम से एक मनमाना चरित्र तक पहुंच प्राप्त कर सकता है।
निम्नलिखित विशेषताओं के साथ संरचनात्मक भाषाओं (पास्कल, सी) की त्वरित तीव्र वृद्धि शुरू होती है:
1. उनके पास डेटा संरचनाओं का वर्णन करने के लिए एक औपचारिक भाषा है (C में * .h फाइलें)
2. उनके पास वर्णित संरचना को एक नाम देने का अवसर है (बीट्री)
3. उनके पास इस डेटा संरचना के साथ संचालन को इंगित करने की क्षमता है
वस्तु
प्रोग्रामर में अपने स्वयं के डेटा प्रकार के उत्साह पैदा करने की क्षमता इस डेटा प्रकार के भीतर एक भावुक इच्छा है कि इसके साथ काम करने के लिए कार्य करें।
इन उज्ज्वल दिमागों की आकांक्षाओं की प्रतिक्रिया के रूप में, वस्तु की अवधारणा का जन्म होता है। ऑब्जेक्ट अब केवल एक डेटा प्रकार नहीं है, न केवल एक लिंक जो संरचित जानकारी संग्रहीत करता है, बल्कि इस जानकारी को संसाधित करने के लिए भी कार्य करता है जो उसी लिंक के माध्यम से उपलब्ध हैं।
इसके नीचे सार्वभौमिक दर्शन है:
"एक ऑब्जेक्ट वर्चुअल स्पेस में एक निश्चित इकाई है जिसमें एक निश्चित स्थिति और व्यवहार होता है, जिसने गुणों (विशेषताओं) और उनके (विधियों) पर संचालन के मूल्यों को दिया है।"
कैप्सूलीकरण
गहन दार्शनिक अध्ययनों से यह महसूस करना संभव हो जाता है कि किसी वस्तु में इनकैप्सुलेशन जैसी कोई संपत्ति होती है, जिसे डेटा के संयोजन और इस डेटा के साथ काम करने के तरीकों के रूप में परिभाषित किया जाता है। दार्शनिक आमतौर पर पुनरावर्ती परिभाषाओं से प्यार करते हैं।
एनकैप्सुलेशन का सार सरल है: एक वस्तु एक वस्तु नहीं है यदि उसका राज्य (यानी इसमें मौजूद डेटा) वस्तु के तरीकों का उपयोग किए बिना बदला जा सकता है। इसके अलावा, यह माना जाता है कि वस्तु के सार्वजनिक चर, परिवर्तन के लिए सभी के लिए और सब कुछ के लिए सुलभ, जैसे कि, इस वस्तु की आंतरिक स्थिति को बदलने के लिए तरीके थे।
दरअसल, $ वस्तु-> संपत्ति = 12345; इसे विधि $ ऑब्जेक्ट-> सेटप्रॉपर्टी (12345) के बराबर माना जाता है; क्योंकि ऑपरेशन में ऑब्जेक्ट $ ऑब्जेक्ट का नाम निर्दिष्ट किए बिना, आप सीधे $ संपत्ति चर का उपयोग नहीं कर सकते।
विरासत
ऑब्जेक्ट के दार्शनिकों से पहले भी, प्रोग्रामर, डेटा संरचनाओं के साथ काम करते समय, बहुत चाहते थे और यह पता लगाया कि डेटा संरचनाओं का विस्तार कैसे करें, क्यूब संरचना में मूल संरचना आरेख को विरासत में मिला।
एक ऑब्जेक्ट का निर्माण जो कार्यों के साथ डेटा को जोड़ता है, एक दिलचस्प इंजीनियरिंग कार्य को जन्म देता है, इस तरह से चकमा कैसे दिया जाता है: दोनों संरचना को प्राप्त करते हैं, कार्यों को विरासत में लेते हैं, और वारिस में नई सुविधाओं को जोड़ते हैं।
लेकिन बात यह है कि आपके पास पैरेंट ऑब्जेक्ट में एक फ़ंक्शन है, वारिस में एक फ़ंक्शन है, वे अलग-अलग चीजें करते हैं, लेकिन ताकि उनके नाम - अच्छी तरह से - समान हो। इस समस्या के समाधान को बहुरूपता कहा गया।
बहुरूपता
दार्शनिकों ने भी चारों ओर उपद्रव किया, परिभाषा देते हुए: "बहुरूपता एक ही विनिर्देश के साथ वस्तुओं की क्षमता है जिनके पास अलग-अलग कार्यान्वयन हैं।" यहाँ, विनिर्देशन से हमारा तात्पर्य किसी वस्तु (सार्वजनिक चर सहित) के साथ काम करने के तरीकों के नाम-हस्ताक्षरों से है।
बहुरूपता के कई अहसास हैं, उनमें से कुछ हैं:
- शुद्ध बहुरूपता (हस्ताक्षर बहुरूपता)
- पैरामीट्रिक बहुरूपता (विधि नाम से बहुरूपता)
- पुनर्वित्त (अमूर्त, अमूर्त वर्ग)
- अधिभार (वंश विधि द्वारा पूर्वज विधि का अधूरा प्रतिस्थापन)
सार संक्षेप
दार्शनिक चिंतन भी स्थिर नहीं हुआ। विरासत के गुणों का अध्ययन करने के बाद, दार्शनिकों ने महसूस किया कि इसे अमूर्तन द्वारा प्रतिस्थापित किया जा सकता है।
अमूर्त एक ऐसी बात है ... मैं कैसे समझाऊंगा? यहां आपके पास एक ऑब्जेक्ट है - उत्कृष्ट, यह कुछ सामग्री है। और इस बात का भी अंदाजा है कि यह वस्तु क्या हो सकती है: यह किन तरीकों से उजागर होनी चाहिए, इन तरीकों को क्या करना चाहिए, लेकिन बिना बारीकियों के, इसलिए सार (ग्राहकों को याद दिलाता है, है न?)। दरअसल, हमने सिर्फ एक वस्तु या सार पूर्वज के इंटरफ़ेस का वर्णन किया है जिसकी वाचा को कोड की वास्तविकता में डाला जा सकता है।
PLO
दरअसल, OOP ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग है। यह तीनों अवधारणाओं के भीतर वस्तुओं के साथ काम करने के लिए कुछ प्रोग्रामर की क्षमता है: इनकैप्सुलेशन, इनहेरिटेंस, और बहुरूपता। खैर, या एनकैप्सुलेशन, अमूर्त और बहुरूपता।
OOP प्रतिमान का MVC मॉडल (कुछ PHP प्रोग्रामर की राय के विपरीत) से कोई लेना-देना नहीं है। OOP केवल डेटा और डेटा प्रोसेसिंग विधियों के साथ काम कर रहा है, जैसा कि विरासत में मिली वस्तुओं के साथ।
प्रक्रियात्मक और संरचनात्मक प्रोग्रामिंग के प्रतिमान के विपरीत, जहां यदि ऑब्जेक्ट हैं, तो उन्हें विरासत में नहीं मिला है। खैर, या कोई वस्तु नहीं हैं, सभी डेटा सरणियों, संरचनाओं, आवंटित मेमोरी बफ़र्स में प्रेषित होते हैं।
कक्षा उन्मुख प्रोग्रामिंग
ऑब्जेक्ट प्रोग्रामिंग के लिए कई वस्तुओं के निर्माण की आवश्यकता होती है (विषम रूप से पर्याप्त)। तदनुसार, यह आवश्यक है कि किसी तरह वस्तुओं के पदानुक्रम को व्यवस्थित करने के लिए, किसी तरह उन्हें बोर करने के लिए।
इन आकांक्षाओं के जवाब में, वर्ग उदाहरण की अवधारणा विकसित की गई थी। कक्षा क्या है? एक वर्ग डेटा के बिना तरीकों और कार्यों का एक संग्रह है। अपने आप में एक वर्ग काम नहीं कर रहा है, आपको काम करने के लिए डेटा की आवश्यकता है। वास्तव में, एक कार्यशील वस्तु प्राप्त करने के लिए, आपको कक्षा को तुरंत करने की आवश्यकता है - कहते हैं "मुझे इस वर्ग में वर्णित कार्यों और उस डेटा के साथ एक ऑब्जेक्ट बनाएं जो मैं आपको अभी बताऊंगा।"
वास्तव में, एक वर्ग चीनी का एक ऐसा वाक्यविन्यास टुकड़ा है जो न केवल किसी वस्तु के एपीआई का वर्णन करने की अनुमति देता है (जैसा कि इंटरफ़ेस करता है), बल्कि डेटा प्रोसेसिंग के लिए फ़ंक्शन भी निर्धारित करता है।
वर्ग प्रणाली आपको किसी वस्तु के गुणों का औपचारिक रूप से वर्णन करने की अनुमति देती है, वस्तुओं के गुणों को विरासत में देने के नियम और वस्तु डेटा तक पहुंचने के नियम। कक्षाओं का उपयोग करना कक्षा-उन्मुख प्रोग्रामिंग के लिए प्रतिमान निर्धारित करता है।
एक वर्ग एक अच्छी बात है, लेकिन ओओपी के लिए आवश्यक नहीं है, क्योंकि ऑब्जेक्ट-उन्मुख भाषाएं हैं जो कक्षाओं के बिना अच्छी तरह से काम करती हैं।
प्रोटोटाइप प्रोग्रामिंग
वंशानुक्रम निर्दिष्ट करने का दूसरा तरीका प्रोटोटाइप है। प्रोटोटाइप प्रोग्रामिंग के साथ, वस्तुओं के कोई उदाहरण नहीं हैं; एक वस्तु एक अनोखे तरीके से मौजूद है। लेकिन प्रत्येक वस्तु के लिए, आप एक प्रोटोटाइप या प्रोटोटाइप निर्दिष्ट कर सकते हैं - उन वस्तुओं की एक सूची जिनके गुण और विधियां यह विरासत में मिलेंगी।ऐतिहासिक रूप से, जावास्क्रिप्ट जैसी भाषा द्वारा साझा किया गया प्रोटोटाइप वंशानुक्रम मॉडल वर्ग विवरण से अधिक पुराना है। लेकिन एपीआई और फ्रेमवर्क का वर्णन करने के लिए क्लास-ओरिएंटेड प्रोग्रामिंग अधिक सुविधाजनक हो गई (और जैसा कि आप जानते हैं, हर यौन परिपक्व जावा प्रोग्रामर को अपनी रूपरेखा लिखने की आवश्यकता होती है, जैसे कि पीएचपी प्रोग्रामर की परिपक्वता स्व-लिखित सीएमएस द्वारा निर्धारित की जाती है, यह अधिक सामान्य हो गया है।