सभी को नमस्कार। मैं औद्योगिक प्रोग्रामिंग पर हमारी
कंपनी के परिचयात्मक पाठ्यक्रम के अंश प्रकाशित करता हूं। यदि अंश हाबोल-समुदाय के लिए दिलचस्प लगते हैं, तो मैं
अन्य टुकड़ों को प्रकाशित करना जारी रखूंगा।
यह पाठ्यक्रम मुख्य रूप से जूनियर डेवलपर्स के लिए है और आपको "क्यों PHP (जावा, पर्ल, बैश)" इस विषय पर होलीवर्स में तर्क के स्तर को बढ़ाने की अनुमति देता है।
इस कोर्स में, हम ट्यूरिंग कंप्यूटर, आधुनिक भाषाओं के उद्भव के इतिहास और उनकी प्रयोज्यता के क्षेत्र के आधार पर एक स्ट्रीम प्रोग्रामिंग मॉडल पर विचार करते हैं। और यह भी ओओपी और कार्यात्मक प्रोग्रामिंग क्या है स्पष्ट रूप से और स्पष्ट रूप से समझाया गया है।
भाग एक: भाषाएं कैसे और क्यों प्रकट हुईं
भाग दो: कार्यक्षमता बनाए रखने का सिद्धांतभाग तीन: सिंथेटिक चीनी या भाषा विकास इतिहासभाषाएं कैसे और क्यों प्रकट हुईं
डेटा को संसाधित करने और एक या दूसरे रूप में प्रसंस्करण के परिणाम को प्रस्तुत करने के लिए एक भाषा की आवश्यकता होती है।
कंप्यूटर में हमेशा डेटा स्रोत और डेटा सिंक होता है। द्वारा और बड़े, एक कंप्यूटर बस कई स्रोतों से जानकारी को कई सिंक तक पुनर्निर्देशित करता है, रास्ते में रूपांतरण बनाता है।
एक प्रोग्रामिंग भाषा एक ऐसी भाषा है जिसके द्वारा हम सूचना को अपने लिए या एक कंप्यूटर के लिए सुविधाजनक रूप में परिवर्तित करने के नियम निर्धारित करते हैं और इससे अधिक कुछ नहीं। वास्तव में, सभी प्रोग्रामिंग भाषाओं को ट्यूरिंग मशीन पर एक ऑपरेशन में कम किया जा सकता है।
ट्यूरिंग मशीन
ट्यूरिंग मशीन एक अंतहीन चुंबकीय टेप है (वर्षों को याद रखें जब ट्यूरिंग ने काम किया था - चुंबकीय टेप तब एक बहुत प्रगतिशील उपकरण था)। टेप को तार्किक कोशिकाओं में विभाजित किया जाता है - टेप के लगातार सेगमेंट जिस पर एक या किसी अन्य सिग्नल को रिकॉर्ड किया जा सकता है (उदाहरण के लिए, ASCII वर्ण)।
मशीन एक सेल द्वारा टेप को बाएं या दाएं ले जा सकती है, वर्तमान सेगमेंट को पढ़ सकती है या वर्तमान सेगमेंट को कुछ लिख सकती है। प्रत्येक ऑपरेशन मशीन के वर्तमान सेल के मूल्य को पढ़ने के साथ शुरू होता है, यह जांचता है कि संक्रमण तालिका के अनुसार इस मूल्य का क्या मतलब है और दो क्रियाएं करना: एक ही सेल में एक नया चरित्र लिखना और एक सेल को बाईं ओर शिफ्ट करना या एक सेल को दाईं ओर शिफ्ट करना।
इन दो क्रियाओं को करने के बाद, चक्र दोहराता है, चक्रों के बीच डेटा संचारित नहीं होता है। प्रत्येक विशेष चक्र में, मशीन केवल उस चरित्र को संसाधित करती है जिसे वह वर्तमान सेल से पढ़ता है। एक बार फिर - सेल से प्रतीक जिसे उसने आखिरी बार गिना, मशीन को याद नहीं है।
ट्यूरिंग मशीन पर प्रोग्राम एक संक्रमण तालिका के रूप में सेट किया गया है: यदि प्रतीक A बाईं ओर शिफ्ट है, यदि B दाईं ओर शिफ्ट है, यदि C सेल D को लिखा गया है और बाईं ओर ले जाता है, यदि E स्टॉप ऑपरेशन है (और इसी तरह, जब तक कि वर्ण बाहर न निकल जाएं। )।
ट्यूरिंग मशीन द्वारा दी गई मुख्य परिभाषाओं में से एक निष्पादन संदर्भ है:
कार्यक्रम निष्पादन का संदर्भ उन सभी आंकड़ों की समग्रता है जो इसके व्यवहार को निर्धारित करते हैं।
नियम स्थापित करने के लिए प्रतिमान
जैसा कि ट्यूरिंग मशीन के उदाहरण से देखा जा सकता है, पीएल डेटा में हेरफेर नहीं करते हैं, लेकिन डेटा रूपांतरण। लेकिन प्रसंस्करण के नियमों को किसी तरह प्रस्तुत और परिभाषित किया जाना चाहिए। फिलहाल, प्रसंस्करण के लिए नियमों को परिभाषित करने के लिए दो तरीके पाए गए हैं - ये रिकॉर्डिंग नियमों के अनिवार्य और घोषित रूप हैं।
घोषणात्मक रूप
पहले रूप को घोषणात्मक कहा जाता है। परिवर्तनों के इस प्रकार के विवरण का एक अच्छा उदाहरण एक बीजीय संकेतन है: खंड [बी, सी] (हम इस तथ्य को पोस्ट करते हैं) के अंतर्गत आता है, डी लाइन (ए, बी) के अंतर्गत आता है अगर हालत डी = एफ (ए, बी) पूरी हो गई है (हम इस तथ्य को भी रेखांकित करते हैं) ।
आपको घोषित पीएल के लिए अच्छी तरह से जाना जाता है, पृष्ठ HTML और सीएसएस का वर्णन करने के लिए नियम हैं। उदाहरण के लिए उत्तरार्द्ध में, यह पोस्ट किया जा सकता है कि यदि कोई तत्व किसी विशेष वर्ग का है, तो उसे लाल रंग में रंगना आवश्यक है।
एक घोषणात्मक भाषा उन चरणों का वर्णन नहीं करती है जिन्हें परिणाम प्राप्त करने के लिए आवश्यक है, लेकिन परिणामस्वरूप परिणाम प्राप्त करने की आवश्यकता है।Declarative PLs इनपुट डेटा और प्रोग्राम के अंतिम परिणाम पर विशेष ध्यान देते हैं। डेटा रूपांतरण प्रक्रिया पर कम ध्यान दिया जाता है।
इंपीरियल रूप
नियमों की प्रस्तुति का दूसरा रूप अनिवार्य कहा जाता है। ट्यूरिंग मशीन अनिवार्य प्रोग्रामिंग के लिए सैद्धांतिक मॉडल के रूप में कार्य करती है।
इंपीरियल फॉर्म: यह अनिवार्यता में व्यक्त आदेशों की एक सूची है। उदाहरण के लिए, (cb) / 2 का मान निर्दिष्ट करें। या यदि कोई बी के बराबर है, तो निम्नलिखित आदेशों के निष्पादन के लिए आगे बढ़ें अन्यथा - अन्य आदेश। एक अनिवार्य रूप में ध्यान डेटा को ही नहीं दिया जाता है, बल्कि इस डेटा को संसाधित करने की प्रक्रिया को दिया जाता है।
अनिवार्य भाषा बदलती जानकारी की प्रक्रिया के विवरण पर केंद्रित है, न कि रूपांतरण के परिणाम पर।स्रोत डेटा में परिणाम में परिवर्तित करने के लिए प्रोग्राम निष्पादन को बयानों के क्रमिक निष्पादन तक कम किया जाता है।
यह दिलचस्प है कि अनिवार्य भाषाओं के लिए नियम एक घोषणात्मक रूप में निर्धारित किए गए हैं: यहां, वे कहते हैं, हमारे पास संक्रमण और सूचना प्रसंस्करण के लिए ऐसे नियम हैं।
सूचना प्रसंस्करण प्रतिमान
नियमों को स्थापित करने की विधि के अलावा, पीएल भी संसाधित डेटा के लिए उनके दृष्टिकोण की विधि में भिन्न होता है। यदि आप ध्यान से पीएल को बदलने वाली जानकारी को देखते हैं, तो आप देख सकते हैं कि यह दो प्रकार की है: असतत और निरंतर।
असतत घटना मॉडल
जानकारी का असतत प्रतिनिधित्व का एक क्लासिक उदाहरण एक ही ट्यूरिंग मशीन है। सभी जानकारी, दोनों इसे प्रस्तुत की गई, और प्रसंस्करण के परिणाम को समान टुकड़ों में विभाजित किया गया है।
असतत प्रतिनिधित्व का एक और उदाहरण डिजिटल ऑडियो डेटा की एक आने वाली धारा का प्रसंस्करण है। इस तरह की धारा को पढ़ने के लिए, समय-समय पर आबादी वाले सरणी का उपयोग किया जाता है - एक डेटा बफर, जिसे तब संसाधित और परिवर्तित किया जाता है।
यह देखना आसान है कि जानकारी की असतत प्रस्तुति के साथ, कार्यक्रम की चक्रीय प्रकृति इनपुट विधि द्वारा स्वयं निर्धारित की जाती है: बाइट पढ़ें - प्रसंस्करण करें - परिणाम को थूक दें।
लेकिन अगर जानकारी के टुकड़े आकार में संरेखित नहीं होते हैं तो क्या होता है? उदाहरण के लिए, एक लंबा पाठ कार्यक्रम के इनपुट को खिलाया जाता है, और कार्यक्रम को अक्षरों, प्रतीकों के साथ नहीं, बल्कि शब्दों के साथ संचालित करना चाहिए?
ऐसी समस्याओं को हल करने के लिए, एक घटना की अवधारणा पेश की जाती है। डेटा स्रोत से पढ़े गए किसी भी मान्यता प्राप्त अनुक्रम के जवाब में एक घटना होती है।
यदि हम पाठ और शब्दों के साथ एक उदाहरण पर विचार करते हैं, तो हम बाइट द्वारा डेटा बाइट पढ़ते हैं और मेमोरी बफर को फिर से भरने के लिए लिखते हैं। और हम ऐसा तब तक करते हैं जब तक कि डेटा स्ट्रीम में हम एक स्पेस या एक पीरियड नहीं पढ़ लेते, जिसका मतलब होगा कि घटना "शब्द का अंत" है।
घटना "शब्द के अंत" की घटना के बाद, हम यह सुनिश्चित कर सकते हैं कि हमारे पास पूरा शब्द बफर में है। अब हम इसका विश्लेषण कर सकते हैं, समझ सकते हैं कि इसका क्या अर्थ है, निर्दिष्ट प्रसंस्करण नियमों को लागू करें, अगले शब्द को पढ़ने के लिए एक नया बफर तैयार करें, आदि।
सूचना प्रसंस्करण के लिए असतत-घटना दृष्टिकोण में, सिस्टम के कामकाज को घटनाओं के कालानुक्रमिक अनुक्रम के रूप में प्रस्तुत किया जाता है। एक घटना एक निश्चित समय पर होती है और सिस्टम की स्थिति को बदल देती है।एक घटना की घटना कार्यक्रम के लिए एक बहुत महत्वपूर्ण कार्रवाई का मतलब है: कार्यक्रम अपने स्वयं के राज्य (निष्पादन संदर्भ) को बदलता है। एक घटना की घटना के बाद, कार्यक्रम इस ज्ञान के आधार पर काम कर सकता है कि यह घटना हुई है। उदाहरण के लिए, यदि हमें "अबीरवेलग" शब्द मिला है, तो अब हम इस ज्ञान का उपयोग कर सकते हैं कि यह काम के दौरान आगे मौजूद है।
सतत डेटा मॉडल
प्रोग्रामिंग दृष्टिकोण - "घटनाएं होती हैं और हमें इसका जवाब देना चाहिए" सर्वव्यापी है और अब कुछ स्वाभाविक प्रतीत होता है, लेकिन यह बिल्कुल भी नहीं है। निरंतर डेटा में कई चीजें अधिक स्वाभाविक रूप से वर्णित हैं।
उदाहरण के लिए, पूर्व निर्धारित अंतराल पर पानी के साथ एक पूल भरने का शास्त्रीय स्कूल कार्य (एक पूल जिसमें एक पाइप पानी डालता है और दूसरा पानी लेता है) बीजीय घोषणात्मक भाषाओं का उपयोग करके हल करना बहुत आसान है, क्योंकि पानी इनलेट और आउटलेट के कार्यों के समाधान में अंतर है।
साथ ही, निरंतर डेटा का उपयोग करते समय, वेक्टर ग्राफिक्स से संबंधित कार्य हल करने में बहुत आसान होते हैं। उदाहरण के लिए, असतत डेटा प्रोसेसिंग का उपयोग करके स्क्रीन पर एक सर्कल खींचने के लिए, पिक्सेल के साथ काम करना और प्रत्येक पिक्सेल की स्थिति की गणना करना आवश्यक है जो सर्कल की स्थिति को संतुष्ट करता है। इस मामले में सर्कल को पिक्सेल की एक सरणी के रूप में दर्शाया गया है। वेक्टर डेटा के साथ काम करने वाली प्रोग्रामिंग भाषा का उपयोग करने के मामले में, यह सर्कल के कार्य और इसके लिए मापदंडों को इंगित करने के लिए पर्याप्त है।
निरंतर डेटा का उपयोग करना, हम एक घटना की अवधारणा को खो देते हैं।जहां हमें घटनाओं और डेटा के टुकड़ों पर कार्रवाई करने की प्रक्रिया की आवश्यकता होती है, प्रसंस्करण के लिए असतत-घटना दृष्टिकोण लागू करना सबसे सुविधाजनक है। ये उपयोगकर्ता से घटनाओं का जवाब देने, आने वाली डेटा स्ट्रीम से घटनाओं की व्याख्या और अलग करने, क्रमिक रूप से सूचना के टुकड़ों को परिवर्तित करने के कार्य हैं।
उसी स्थान पर जहां हमें "सामान्य रूप से" एक चित्र की आवश्यकता होती है, विश्लेषणात्मक भाषाओं का दृष्टिकोण सबसे सुविधाजनक है: यह डेटा स्लाइस प्राप्त कर रहा है, डेटा संरचनाओं का वर्णन कर रहा है, गणितीय कार्यों को हल कर रहा है, ग्राफिक्स का वर्णन कर रहा है, और लगातार एक आने वाली धारा को दूसरे में बदल रहा है।