आप जिस बारे में बात कर रहे हैं वह संरचना की तुलना में कम वाक्य रचना है । आपके पास वास्तव में केवल एक कथन हो सकता है जैसे कि एक प्रणाली जो तर्क की एक सीमित मात्रा को निष्पादित करती है, फिर कथनों को निष्पादित करती है, फिर एक अनंत लूप में जारी रहती है और फिर से तर्क को निष्पादित करती है।when
when
उदाहरण के लिए विंडोज प्रोग्रामिंग आम तौर पर "ईवेंट आधारित" है। एक बटन की Click
घटना के लिए सब्सक्राइब करना अनिवार्य रूप से "क्लिक किए जाने पर ऐसा करना" है। हालांकि, हुड के नीचे क्या हो रहा है एक संदेश प्रसंस्करण लूप है। उपयोगकर्ता द्वारा बटन क्लिक करने पर विंडोज एप्लिकेशन को संदेश भेजता है, और अनुप्रयोग में संदेश प्रसंस्करण लूप उपयुक्त ईवेंट हैंडलर चलाता है।
यदि आप उदाहरण के लिए, C # में घटनाओं का उपयोग करते हैं, तो आप इसे संदेश लूप के बिना भी कर सकते हैं, लेकिन सीमा यह है कि आपको समय से पहले घटना की घोषणा करनी होगी, इसलिए आप when
किसी भी तरह के घड़ियों के लिए आर्टवर्क स्टेटमेंट नहीं लिख सकते हैं राज्य। आपको किसी विशिष्ट घटना की प्रतीक्षा करनी होगी।
वॉन न्यूमैन आर्किटेक्चर में इस व्यवहार को प्राप्त करने के लिए आपको किसी प्रकार के अनंत लूप को चलाना होगा जो हर बार लूप के माध्यम से सभी परिस्थितियों की जांच करता है कि क्या उपयुक्त कोड चल रहा है। आंतरिक रूप से आपको बस if
/ then
या switch
बयानों की एक बड़ी सूची मिलती है । अधिकांश डेस्कटॉप एप्लिकेशन और वेब प्रोग्रामर उल्टी कर देंगे अगर उन्होंने ऐसा निर्माण देखा है तो यह वास्तव में केवल तालमेल है यदि आप इसे विंडोज इवेंट मॉडल (भले ही यह हुड के नीचे चल रहा हो) की तरह किसी प्रकार के सिंथेटिक चीनी में लपेटते हैं।
दूसरी ओर, यदि आप एम्बेडेड फर्मवेयर विकास, वास्तविक समय के अधिकारियों, या औद्योगिक नियंत्रकों के क्षेत्र को देखते हैं, तो प्रोग्रामिंग का यह मॉडल बहुत आम है। उदाहरण के लिए, यदि आपके पास एक वास्तविक समय कार्यक्रम है, तो आप व्यक्त करना चाहते हैं:
outputA = input1 && input2
कोड समझने के लिए सीधा है (क्योंकि यह घोषणात्मक है)। हालांकि, इसे काम करने के लिए आपको इसे एक तंग लूप में निष्पादित करना होगा। आप outputA
लूप के माध्यम से हर बार पुनर्मूल्यांकन करते हैं। बहुत सारे डेस्कटॉप या वेब प्रोग्रामर इसे पसंद नहीं करेंगे क्योंकि यह अक्षम है। उनके लिए, आपके द्वारा पुनर्मूल्यांकन करने का एकमात्र समय outputA
तब होता है जब input1
या input2
बदल जाता है। वे कुछ और देखना चाहेंगे जैसे आप वर्णन कर रहे हैं:
when input1 changes
evaluateOutputA()
when input2 changes
evaluateOutputA()
evaluateOutputA()
outputA = input1 && input2
अब अगर यह आप चाहते हैं (और व्यक्तिगत रूप से मैं इस विचार को पसंद नहीं करता हूं), और आपका लक्ष्य दक्षता है, तो आपको अभी भी अपने आप से पूछना होगा कि प्रोसेसर हुड के नीचे क्या कर रहा है। जाहिर है कि अभी भी कुछ प्रकार के लूप चल रहे हैं जो हर बार इनपुट राज्यों की तुलना पिछले इनपुट राज्यों से करते हैं, और जब भी कोई परिवर्तन होता है तो उपयुक्त कोड निष्पादित करता है। तो वास्तव में यह कम कुशल है और इसे पढ़ना कठिन है और बनाए रखना कठिन है।
दूसरी ओर, यदि input1
परिवर्तन के महत्वपूर्ण होने पर आपको जो काम करना है, तो आपके when
खंड का अर्थ हो सकता है। पीएलसी में इस प्रकार के निर्देश को "बढ़ती बढ़त का पता लगाने" कहा जाता है। यह input1
लूप के माध्यम से अंतिम समय पर स्थिति को बचाता है , इस समय के मूल्य से तुलना करता है, और तर्क को निष्पादित करता है यदि अंतिम स्थिति झूठी थी और यह राज्य सत्य है।
यदि आपके पास वॉन न्यूमैन आर्किटेक्चर नहीं है, तो खेल बदल जाता है। उदाहरण के लिए यदि आप VHDL में FPGA की प्रोग्रामिंग कर रहे हैं , तो जब आप लिखते हैं:
outputA = input1 && input2
(... या जो भी उपयुक्त VHDL सिंटेक्स होगा) तो FPGA वास्तव में ऐसे ही तार-तार हो जाता है input1
और input2
उन्हें AND गेट के इनपुट से तार दिया जाता है , और AND गेट के आउटपुट को वायर्ड कर दिया जाता है outputA
। इसलिए, न केवल कोड को समझना आसान है, इसे अन्य सभी तर्क के साथ समानांतर में भी निष्पादित किया जाता है, और यह कुशल है।
जब आप एक पीएलसी या पीएसी जैसे औद्योगिक नियंत्रक के बारे में बात कर रहे हैं, तो पांच IEC-61131-3 भाषाओं में से एक में प्रोग्राम किया गया है, विशिष्ट मामला इस तरह की व्यवस्था है:
- मेमोरी में इनपुट और स्टोर पढ़ें
- मुख्य कार्यक्रम निष्पादित करें
- मेमोरी से वास्तविक आउटपुट तक आउटपुट लिखें
- चरण 1 पर जाएं
यह सिस्टम की वास्तुकला में बनाया गया है, इसलिए यह उम्मीद है कि आप बस लिखेंगे:
outputA = input1 && input2
... और इसे एक सतत लूप में निष्पादित किया जाएगा।
इन मशीनों में इंटरप्ट रूटीन भी हैं। ये उस when
ऑपरेटर के लिए हार्डवेयर स्तर के समर्थन की तरह हैं, जिसके बारे में आप बात कर रहे हैं। हार्डवेयर बाधा एक बाहरी घटना के बारे में कुछ कोड को क्रियान्वित करने का एक साधन है। उदाहरण के लिए, जब कोई नेटवर्क कार्ड कहता है कि उसके पास डेटा प्रतीक्षा है, तो प्रोसेसर को सामान्य रूप से उस डेटा को तुरंत पढ़ना होगा या आप बफर स्थान से बाहर चले जाएंगे। हालाँकि, जितनी बार आपको एक वास्तविक हार्डवेयर व्यवधान को हुक करने की आवश्यकता होती है, मुझे संदेह है कि इसके लिए एक भाषा कीवर्ड भी शामिल है। आप CPU इनपुट पिन तक सीमित रहेंगे, और ऐसा लगता है कि आप आंतरिक प्रोग्राम स्थिति का परीक्षण करना चाहते हैं।
तो, एक पारंपरिक भाषा में (एक तंग लूप के बिना जो असीम रूप से चलती है) आपको सवाल पूछना होगा, "मूल्यांकन कोड कब चलता है"?
यदि आप लिखते हैं:
when A do
launchNukes()
... और मान A
लेना एक मनमाना बूलियन अभिव्यक्ति है, आप कैसे जानते हैं कि उस अभिव्यक्ति का पुनर्मूल्यांकन कब करना है? एक अनुभवहीन कार्यान्वयन का मतलब होगा कि आपको हर एक मेमोरी लिखने के बाद इसका पुनर्मूल्यांकन करना होगा। आप सोच सकते हैं कि आप इसे कम कर सकते हैं, लेकिन इस पर विचार करें:
when systemTime > actionTime do
launchNukes()
सूचना जो systemTime
हमेशा बदलती रहती है (हर बार जब आप इसे पढ़ते हैं, तो आपको एक अलग संख्या मिलेगी)। इसका अर्थ है कि आपके सभी when
खंडों के सशर्त भाग का लगातार मूल्यांकन किया जाना है। यह लगभग असंभव है (और बस एक सेकंड के लिए विचार करें कि क्या होता है यदि आपकी सशर्त अभिव्यक्ति के दुष्प्रभाव होते हैं!)
निष्कर्ष
आपके when
पास एक अनंत लूप के आसपास की वास्तुकला में एक बयान (जैसे कि आप वर्णन कर रहे हैं) हो सकता है जो मुख्य कार्यक्रम को चलाता है, फिर उन when
बयानों को निष्पादित करता है यदि इस लूप पर स्थितियां झूठी से सच तक चली गईं। हालांकि यह वास्तुकला एम्बेडेड और औद्योगिक उपकरणों में आम है, यह सामान्य प्रयोजन प्रोग्रामिंग भाषाओं में आम नहीं है।
select case table1.col1 when 1 then 'Y' else 'N' end as col1_yn from ...
:। इसके अलावा: msdn.microsoft.com/en-us/library/dd233249.aspx मूल रूप से मैं Google कोड खोज का उपयोग करके "जब" खोज करूंगा।