अल्प परिपथ निरूपण: Difference between revisions

From Vigyanwiki
No edit summary
Line 1: Line 1:
{{Short description|Programming language construct}}
{{Short description|Programming language construct}}
{{distinguish|Short-circuit test}}
{{distinguish|Short-circuit test}}
{{More citations needed|date=August 2013}}
{{Programming evaluation}}
{{Programming evaluation}}
शॉर्ट-सर्किट मूल्यांकन, न्यूनतम मूल्यांकन, या मैकार्थी मूल्यांकन (जॉन मैककार्थी (कंप्यूटर वैज्ञानिक) के बाद) कुछ [[प्रोग्रामिंग भाषा]]ओं में कुछ [[तार्किक संयोजक]]ों का शब्दार्थ है जिसमें दूसरा तर्क केवल तभी निष्पादित या मूल्यांकन किया जाता है जब पहला तर्क निर्धारित करने के लिए पर्याप्त नहीं होता है। अभिव्यक्ति का मूल्य: जब का पहला तर्क <code>AND</code> समारोह का मूल्यांकन करता है <code>false</code>, कुल मान होना चाहिए <code>false</code>; और जब का पहला तर्क <code>OR</code> समारोह का मूल्यांकन करता है <code>true</code>, कुल मान होना चाहिए <code>true</code>.
शॉर्ट-सर्किट मूल्यांकन, न्यूनतम मूल्यांकन, या मैकार्थी मूल्यांकन (जॉन मैककार्थी (कंप्यूटर वैज्ञानिक) के बाद) कुछ [[प्रोग्रामिंग भाषा]]ओं में कुछ [[तार्किक संयोजक]]ों का शब्दार्थ है जिसमें दूसरा तर्क केवल तभी निष्पादित या मूल्यांकन किया जाता है जब पहला तर्क निर्धारित करने के लिए पर्याप्त नहीं होता है। अभिव्यक्ति का मूल्य: जब का पहला तर्क <code>AND</code> समारोह का मूल्यांकन करता है <code>false</code>, कुल मान होना चाहिए <code>false</code>; और जब का पहला तर्क <code>OR</code> समारोह का मूल्यांकन करता है <code>true</code>, कुल मान होना चाहिए <code>true</code>.
Line 7: Line 6:
[[आलसी मूल्यांकन]] ([[लिस्प (प्रोग्रामिंग भाषा)]], [[पर्ल]], [[हास्केल (प्रोग्रामिंग भाषा)]]) के साथ प्रोग्रामिंग भाषाओं में, सामान्य बूलियन ऑपरेटर शॉर्ट-सर्किट होते हैं। दूसरों में ([[एडा (प्रोग्रामिंग भाषा)]], [[जावा (प्रोग्रामिंग भाषा)]], [[डेल्फी (प्रोग्रामिंग भाषा)]]), शॉर्ट-सर्किट और मानक बूलियन ऑपरेटर दोनों उपलब्ध हैं। कुछ बूलियन ऑपरेशंस के लिए, जैसे [[एकमात्र]] (XOR), शॉर्ट-सर्किट करना संभव नहीं है, क्योंकि दोनों ऑपरेंड हमेशा परिणाम निर्धारित करने के लिए आवश्यक होते हैं।
[[आलसी मूल्यांकन]] ([[लिस्प (प्रोग्रामिंग भाषा)]], [[पर्ल]], [[हास्केल (प्रोग्रामिंग भाषा)]]) के साथ प्रोग्रामिंग भाषाओं में, सामान्य बूलियन ऑपरेटर शॉर्ट-सर्किट होते हैं। दूसरों में ([[एडा (प्रोग्रामिंग भाषा)]], [[जावा (प्रोग्रामिंग भाषा)]], [[डेल्फी (प्रोग्रामिंग भाषा)]]), शॉर्ट-सर्किट और मानक बूलियन ऑपरेटर दोनों उपलब्ध हैं। कुछ बूलियन ऑपरेशंस के लिए, जैसे [[एकमात्र]] (XOR), शॉर्ट-सर्किट करना संभव नहीं है, क्योंकि दोनों ऑपरेंड हमेशा परिणाम निर्धारित करने के लिए आवश्यक होते हैं।


शॉर्ट-सर्किट ऑपरेटर, प्रभाव में, सरल अंकगणितीय ऑपरेटरों के बजाय [[नियंत्रण संरचना]]एं हैं, क्योंकि वे सख्त कार्य नहीं हैं। [[अनिवार्य भाषा]] के शब्दों में (विशेष रूप से [[सी (प्रोग्रामिंग भाषा)]] और [[सी ++]]), जहां साइड इफेक्ट महत्वपूर्ण हैं, शॉर्ट-सर्किट ऑपरेटर एक [[अनुक्रम बिंदु]] पेश करते हैं - वे किसी भी [[साइड इफेक्ट (कंप्यूटर विज्ञान)]] सहित पहले तर्क का पूरी तरह से मूल्यांकन करते हैं, इससे पहले (वैकल्पिक रूप से) दूसरा तर्क संसाधित करना। [[ALGOL 68]] ने उपयोगकर्ता-परिभाषित शॉर्ट-सर्किट ऑपरेटरों और प्रक्रियाओं को प्राप्त करने के लिए प्रक्रिया का उपयोग किया।
शॉर्ट-सर्किट ऑपरेटर, प्रभाव में, सरल अंकगणितीय ऑपरेटरों के बजाय [[नियंत्रण संरचना]]एं हैं, क्योंकि वे सख्त कार्य नहीं हैं। [[अनिवार्य भाषा]] के शब्दों में (विशेष रूप से [[सी (प्रोग्रामिंग भाषा)]] और [[सी ++]]), जहां साइड इफेक्ट महत्वपूर्ण हैं, शॉर्ट-सर्किट ऑपरेटर [[अनुक्रम बिंदु]] पेश करते हैं - वे किसी भी [[साइड इफेक्ट (कंप्यूटर विज्ञान)]] सहित पहले तर्क का पूरी तरह से मूल्यांकन करते हैं, इससे पहले (वैकल्पिक रूप से) दूसरा तर्क संसाधित करना। [[ALGOL 68]] ने उपयोगकर्ता-परिभाषित शॉर्ट-सर्किट ऑपरेटरों और प्रक्रियाओं को प्राप्त करने के लिए प्रक्रिया का उपयोग किया।


समस्यात्मक के रूप में शॉर्ट-सर्किट ऑपरेटरों के उपयोग की आलोचना की गई है:
समस्यात्मक के रूप में शॉर्ट-सर्किट ऑपरेटरों के उपयोग की आलोचना की गई है:
Line 17: Line 16:


== परिभाषा ==
== परिभाषा ==
किसी भी प्रोग्रामिंग भाषा में जो शॉर्ट-सर्किट मूल्यांकन लागू करता है, अभिव्यक्ति <code>''x'' and ''y''</code> [[सशर्त (प्रोग्रामिंग)]] के बराबर है <code>if ''x'' then ''y'' else ''x''</code>, और अभिव्यक्ति <code>''x'' or ''y''</code> के बराबर है <code>if ''x'' then ''x'' else ''y''</code>. किसी भी स्थिति में, x का मूल्यांकन केवल एक बार किया जाता है।
किसी भी प्रोग्रामिंग भाषा में जो शॉर्ट-सर्किट मूल्यांकन लागू करता है, अभिव्यक्ति <code>''x'' and ''y''</code> [[सशर्त (प्रोग्रामिंग)]] के बराबर है <code>if ''x'' then ''y'' else ''x''</code>, और अभिव्यक्ति <code>''x'' or ''y''</code> के बराबर है <code>if ''x'' then ''x'' else ''y''</code>. किसी भी स्थिति में, x का मूल्यांकन केवल बार किया जाता है।


ऊपर दी गई सामान्यीकृत परिभाषा दो से अधिक सत्य-मूल्यों वाली ढीली टाइप की गई भाषाओं को समायोजित करती है <code>True</code> और <code>False</code>, जहां शॉर्ट-सर्किट ऑपरेटर अंतिम मूल्यांकन किए गए सबएक्सप्रेशन को वापस कर सकते हैं। इसे नीचे दी गई तालिका में अंतिम मान कहा जाता है। सख्ती से टाइप की गई भाषा के लिए, अभिव्यक्ति को सरल बनाया गया है <code>if ''x'' then ''y'' else '''false'''</code> और <code>if ''x'' then '''true''' else ''y''</code> क्रमशः बूलियन मामले के लिए।
ऊपर दी गई सामान्यीकृत परिभाषा दो से अधिक सत्य-मूल्यों वाली ढीली टाइप की गई भाषाओं को समायोजित करती है <code>True</code> और <code>False</code>, जहां शॉर्ट-सर्किट ऑपरेटर अंतिम मूल्यांकन किए गए सबएक्सप्रेशन को वापस कर सकते हैं। इसे नीचे दी गई तालिका में अंतिम मान कहा जाता है। सख्ती से टाइप की गई भाषा के लिए, अभिव्यक्ति को सरल बनाया गया है <code>if ''x'' then ''y'' else '''false'''</code> और <code>if ''x'' then '''true''' else ''y''</code> क्रमशः बूलियन मामले के लिए।


=== वरीयता ===
=== वरीयता ===
यद्यपि {{code|AND}} ऑपरेटर की प्राथमिकता लेता है {{code|OR}} कई भाषाओं में, यह शॉर्ट-सर्किट मूल्यांकन की सार्वभौमिक संपत्ति नहीं है। POSIX शेल का कमांड-लिस्ट सिंटैक्स समान प्राथमिकता लेने वाले और एक दूसरे के साथ बाएं-सहयोगी होने वाले दो ऑपरेटर का एक उदाहरण है।<ref>{{cite web |title=शेल कमांड लैंग्वेज|url=https://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html |website=pubs.opengroup.org}}</ref>{{rp|at=§2.9.3}}
यद्यपि {{code|AND}} ऑपरेटर की प्राथमिकता लेता है {{code|OR}} कई भाषाओं में, यह शॉर्ट-सर्किट मूल्यांकन की सार्वभौमिक संपत्ति नहीं है। POSIX शेल का कमांड-लिस्ट सिंटैक्स समान प्राथमिकता लेने वाले और दूसरे के साथ बाएं-सहयोगी होने वाले दो ऑपरेटर का उदाहरण है।<ref>{{cite web |title=शेल कमांड लैंग्वेज|url=https://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html |website=pubs.opengroup.org}}</ref>{{rp|at=§2.9.3}}


निम्नलिखित सरल बाएँ से दाएँ मूल्यांकनकर्ता की एक पूर्वता को लागू करता है {{code|AND}} ऊपर {{code|OR}} द्वारा ए {{code|continue}}:
निम्नलिखित सरल बाएँ से दाएँ मूल्यांकनकर्ता की पूर्वता को लागू करता है {{code|AND}} ऊपर {{code|OR}} द्वारा ए {{code|continue}}:


  फंक्शन शॉर्ट-सर्किट-इवल (''ऑपरेटर्स'', ''वैल्यू'')
  फंक्शन शॉर्ट-सर्किट-इवल (''ऑपरेटर्स'', ''वैल्यू'')
Line 252: Line 251:
<sup>5</sup> पास्कल (प्रोग्रामिंग भाषा)#ISO/IEC 10206:1990 विस्तारित पास्कल|ISO/IEC 10206:1990 विस्तारित पास्कल शॉर्ट-सर्किटिंग की अनुमति देता है, लेकिन इसकी आवश्यकता नहीं है।<br/>
<sup>5</sup> पास्कल (प्रोग्रामिंग भाषा)#ISO/IEC 10206:1990 विस्तारित पास्कल|ISO/IEC 10206:1990 विस्तारित पास्कल शॉर्ट-सर्किटिंग की अनुमति देता है, लेकिन इसकी आवश्यकता नहीं है।<br/>
<sup>6</sup> ISO/IEC 10206:1990 एक्सटेंडेड पास्कल सपोर्ट करता है <code>and_then</code> और <code>or_else</code>.<ref>{{cite web|url=http://www.gnu-pascal.de/gpc/and_005fthen.html#and_005fthen#GNU |title=and_then - The GNU Pascal Manual |publisher=Gnu-pascal.de |access-date=2013-08-24}}</ref><br>
<sup>6</sup> ISO/IEC 10206:1990 एक्सटेंडेड पास्कल सपोर्ट करता है <code>and_then</code> और <code>or_else</code>.<ref>{{cite web|url=http://www.gnu-pascal.de/gpc/and_005fthen.html#and_005fthen#GNU |title=and_then - The GNU Pascal Manual |publisher=Gnu-pascal.de |access-date=2013-08-24}}</ref><br>
<sup>7</sup> स्मॉलटाक तर्क के रूप में लंबे समय तक शॉर्ट-सर्किट शब्दार्थ का उपयोग करता है <code>and:</code> एक ब्लॉक है (उदाहरण के लिए, <code>false and: [Transcript show: 'Wont see me']</code>).<br>
<sup>7</sup> स्मॉलटाक तर्क के रूप में लंबे समय तक शॉर्ट-सर्किट शब्दार्थ का उपयोग करता है <code>and:</code> ब्लॉक है (उदाहरण के लिए, <code>false and: [Transcript show: 'Wont see me']</code>).<br>
<sup>8</sup> CASE कथनों का समर्थन करने वाली [[बुनियादी]] भाषाएं सशर्त मूल्यांकन प्रणाली का उपयोग करके ऐसा करती हैं, न कि स्थिर लेबलों तक सीमित जंप टेबल के रूप में।<br>
<sup>8</sup> CASE कथनों का समर्थन करने वाली [[बुनियादी]] भाषाएं सशर्त मूल्यांकन प्रणाली का उपयोग करके ऐसा करती हैं, न कि स्थिर लेबलों तक सीमित जंप टेबल के रूप में।<br>
<sup>9</sup> डेल्फी (प्रोग्रामिंग भाषा) और शॉर्ट सर्किट मूल्यांकन के लिए [[ फ़्री पास्कल ]] डिफॉल्ट। इसे कंपाइलर विकल्पों द्वारा बदला जा सकता है लेकिन व्यापक रूप से उपयोग नहीं किया जाता है।<br>
<sup>9</sup> डेल्फी (प्रोग्रामिंग भाषा) और शॉर्ट सर्किट मूल्यांकन के लिए [[ फ़्री पास्कल ]] डिफॉल्ट। इसे कंपाइलर विकल्पों द्वारा बदला जा सकता है लेकिन व्यापक रूप से उपयोग नहीं किया जाता है।<br>
Line 278: Line 277:
इस उदाहरण में, शॉर्ट-सर्किट मूल्यांकन इसकी गारंटी देता है <code>myfunc(b)</code> कभी नहीं बुलाया जाता है। यह है क्योंकि <code>a != 0</code> असत्य का मूल्यांकन करता है। यह सुविधा दो उपयोगी प्रोग्रामिंग निर्माणों की अनुमति देती है।
इस उदाहरण में, शॉर्ट-सर्किट मूल्यांकन इसकी गारंटी देता है <code>myfunc(b)</code> कभी नहीं बुलाया जाता है। यह है क्योंकि <code>a != 0</code> असत्य का मूल्यांकन करता है। यह सुविधा दो उपयोगी प्रोग्रामिंग निर्माणों की अनुमति देती है।


# यदि पहली उप-अभिव्यक्ति यह जाँचती है कि क्या एक महंगी संगणना की आवश्यकता है और जाँच असत्य का मूल्यांकन करती है, तो दूसरे तर्क में महंगी संगणना को समाप्त किया जा सकता है।
# यदि पहली उप-अभिव्यक्ति यह जाँचती है कि क्या महंगी संगणना की आवश्यकता है और जाँच असत्य का मूल्यांकन करती है, तो दूसरे तर्क में महंगी संगणना को समाप्त किया जा सकता है।
# यह एक निर्माण की अनुमति देता है जहां पहली अभिव्यक्ति ऐसी स्थिति की गारंटी देती है जिसके बिना दूसरी अभिव्यक्ति रन-टाइम त्रुटि का कारण बन सकती है।
# यह निर्माण की अनुमति देता है जहां पहली अभिव्यक्ति ऐसी स्थिति की गारंटी देती है जिसके बिना दूसरी अभिव्यक्ति रन-टाइम त्रुटि का कारण बन सकती है।


दोनों को निम्नलिखित सी स्निपेट में चित्रित किया गया है जहां न्यूनतम मूल्यांकन शून्य सूचक विचलन और अतिरिक्त मेमोरी दोनों को रोकता है:
दोनों को निम्नलिखित सी स्निपेट में चित्रित किया गया है जहां न्यूनतम मूल्यांकन शून्य सूचक विचलन और अतिरिक्त मेमोरी दोनों को रोकता है:
Line 297: Line 296:
=== मुहावरेदार सशर्त निर्माण ===
=== मुहावरेदार सशर्त निर्माण ===


चूंकि न्यूनतम मूल्यांकन एक ऑपरेटर की सिमेंटिक परिभाषा का हिस्सा है और एक वैकल्पिक [[संकलक अनुकूलन]] नहीं है, इसलिए कई कोडिंग मुहावरे एक संक्षिप्त सशर्त निर्माण के रूप में इस पर भरोसा करते हैं। उदाहरणों में शामिल:
चूंकि न्यूनतम मूल्यांकन ऑपरेटर की सिमेंटिक परिभाषा का हिस्सा है और वैकल्पिक [[संकलक अनुकूलन]] नहीं है, इसलिए कई कोडिंग मुहावरे संक्षिप्त सशर्त निर्माण के रूप में इस पर भरोसा करते हैं। उदाहरणों में शामिल:


पर्ल मुहावरे:
पर्ल मुहावरे:
Line 319: Line 318:
}
}
</syntaxhighlight>
</syntaxhighlight>
अगर <code>myfunc(b)</code> इस पर ध्यान दिए बिना कुछ आवश्यक संचालन करने वाला है <code>do_something()</code> निष्पादित किया जाता है, जैसे कि सिस्टम संसाधनों का आवंटन, और <code>expressionA</code> तब असत्य के रूप में मूल्यांकन करता है <code>myfunc(b)</code> नहीं चलेगा, जिससे परेशानी हो सकती है। इस समस्या से बचने के लिए कुछ प्रोग्रामिंग भाषाओं, जैसे कि जावा (प्रोग्रामिंग लैंग्वेज) में दो ऑपरेटर होते हैं, एक जो न्यूनतम मूल्यांकन करता है और दूसरा जो नहीं करता है।
अगर <code>myfunc(b)</code> इस पर ध्यान दिए बिना कुछ आवश्यक संचालन करने वाला है <code>do_something()</code> निष्पादित किया जाता है, जैसे कि सिस्टम संसाधनों का आवंटन, और <code>expressionA</code> तब असत्य के रूप में मूल्यांकन करता है <code>myfunc(b)</code> नहीं चलेगा, जिससे परेशानी हो सकती है। इस समस्या से बचने के लिए कुछ प्रोग्रामिंग भाषाओं, जैसे कि जावा (प्रोग्रामिंग लैंग्वेज) में दो ऑपरेटर होते हैं, जो न्यूनतम मूल्यांकन करता है और दूसरा जो नहीं करता है।


खराब प्रदर्शन वाले साइड इफेक्ट स्टेटमेंट की समस्याओं को उचित प्रोग्रामिंग शैली के साथ आसानी से हल किया जा सकता है, यानी, बूलियन स्टेटमेंट में साइड इफेक्ट्स का उपयोग नहीं करना, क्योंकि मूल्यांकन में साइड इफेक्ट वाले मूल्यों का उपयोग आम तौर पर कोड को अपारदर्शी और त्रुटि-प्रवण बनाता है।<ref>{{cite web |url=http://www.itu.dk/people/sestoft/papers/SondergaardSestoft1990.pdf |title=संदर्भात्मक पारदर्शिता, निश्चितता और अनफोल्डेबिलिटी|publisher=Itu.dk |access-date=2013-08-24}}</ref>
खराब प्रदर्शन वाले साइड इफेक्ट स्टेटमेंट की समस्याओं को उचित प्रोग्रामिंग शैली के साथ आसानी से हल किया जा सकता है, यानी, बूलियन स्टेटमेंट में साइड इफेक्ट्स का उपयोग नहीं करना, क्योंकि मूल्यांकन में साइड इफेक्ट वाले मूल्यों का उपयोग आम तौर पर कोड को अपारदर्शी और त्रुटि-प्रवण बनाता है।<ref>{{cite web |url=http://www.itu.dk/people/sestoft/papers/SondergaardSestoft1990.pdf |title=संदर्भात्मक पारदर्शिता, निश्चितता और अनफोल्डेबिलिटी|publisher=Itu.dk |access-date=2013-08-24}}</ref>
Line 326: Line 325:
=== सीमित अनुकूलन के कारण कम दक्षता ===
=== सीमित अनुकूलन के कारण कम दक्षता ===


शॉर्ट-सर्किटिंग से आधुनिक [[सेंट्रल प्रोसेसिंग यूनिट]] (सीपीयू) पर [[शाखा भविष्यवाणी]] में त्रुटियां हो सकती हैं, और नाटकीय रूप से प्रदर्शन कम हो सकता है। एक उल्लेखनीय उदाहरण रे ट्रेसिंग (भौतिकी) में अक्ष संरेखित बॉक्स चौराहे कोड के साथ अत्यधिक अनुकूलित किरण है।{{clarify|date=November 2010}} कुछ संकलक ऐसे मामलों का पता लगा सकते हैं और तेज़ कोड उत्सर्जित कर सकते हैं, लेकिन प्रोग्रामिंग भाषा शब्दार्थ इस तरह के अनुकूलन को बाधित कर सकता है।{{citation needed|date=October 2016}}
शॉर्ट-सर्किटिंग से आधुनिक [[सेंट्रल प्रोसेसिंग यूनिट]] (सीपीयू) पर [[शाखा भविष्यवाणी]] में त्रुटियां हो सकती हैं, और नाटकीय रूप से प्रदर्शन कम हो सकता है। उल्लेखनीय उदाहरण रे ट्रेसिंग (भौतिकी) में अक्ष संरेखित बॉक्स चौराहे कोड के साथ अत्यधिक अनुकूलित किरण है।{{clarify|date=November 2010}} कुछ संकलक ऐसे मामलों का पता लगा सकते हैं और तेज़ कोड उत्सर्जित कर सकते हैं, लेकिन प्रोग्रामिंग भाषा शब्दार्थ इस तरह के अनुकूलन को बाधित कर सकता है।{{citation needed|date=October 2016}}


ऐसे मामले के लिए अनुकूलन करने में असमर्थ एक कंपाइलर का एक उदाहरण जावा (प्रोग्रामिंग भाषा) का हॉटस्पॉट वीएम 2012 तक है।<ref>{{cite web |last1=Wasserman |first1=Louis |title=java - ऐसे कौन से मामले हैं जिनमें बिना शर्त AND (& के बजाय &&) का उपयोग करना बेहतर है|url=https://stackoverflow.com/a/11412121 |website=Stack Overflow}}</ref>
ऐसे मामले के लिए अनुकूलन करने में असमर्थ कंपाइलर का उदाहरण जावा (प्रोग्रामिंग भाषा) का हॉटस्पॉट वीएम 2012 तक है।<ref>{{cite web |last1=Wasserman |first1=Louis |title=java - ऐसे कौन से मामले हैं जिनमें बिना शर्त AND (& के बजाय &&) का उपयोग करना बेहतर है|url=https://stackoverflow.com/a/11412121 |website=Stack Overflow}}</ref>





Revision as of 13:19, 4 March 2023

शॉर्ट-सर्किट मूल्यांकन, न्यूनतम मूल्यांकन, या मैकार्थी मूल्यांकन (जॉन मैककार्थी (कंप्यूटर वैज्ञानिक) के बाद) कुछ प्रोग्रामिंग भाषाओं में कुछ तार्किक संयोजकों का शब्दार्थ है जिसमें दूसरा तर्क केवल तभी निष्पादित या मूल्यांकन किया जाता है जब पहला तर्क निर्धारित करने के लिए पर्याप्त नहीं होता है। अभिव्यक्ति का मूल्य: जब का पहला तर्क AND समारोह का मूल्यांकन करता है false, कुल मान होना चाहिए false; और जब का पहला तर्क OR समारोह का मूल्यांकन करता है true, कुल मान होना चाहिए true.

आलसी मूल्यांकन (लिस्प (प्रोग्रामिंग भाषा), पर्ल, हास्केल (प्रोग्रामिंग भाषा)) के साथ प्रोग्रामिंग भाषाओं में, सामान्य बूलियन ऑपरेटर शॉर्ट-सर्किट होते हैं। दूसरों में (एडा (प्रोग्रामिंग भाषा), जावा (प्रोग्रामिंग भाषा), डेल्फी (प्रोग्रामिंग भाषा)), शॉर्ट-सर्किट और मानक बूलियन ऑपरेटर दोनों उपलब्ध हैं। कुछ बूलियन ऑपरेशंस के लिए, जैसे एकमात्र (XOR), शॉर्ट-सर्किट करना संभव नहीं है, क्योंकि दोनों ऑपरेंड हमेशा परिणाम निर्धारित करने के लिए आवश्यक होते हैं।

शॉर्ट-सर्किट ऑपरेटर, प्रभाव में, सरल अंकगणितीय ऑपरेटरों के बजाय नियंत्रण संरचनाएं हैं, क्योंकि वे सख्त कार्य नहीं हैं। अनिवार्य भाषा के शब्दों में (विशेष रूप से सी (प्रोग्रामिंग भाषा) और सी ++), जहां साइड इफेक्ट महत्वपूर्ण हैं, शॉर्ट-सर्किट ऑपरेटर अनुक्रम बिंदु पेश करते हैं - वे किसी भी साइड इफेक्ट (कंप्यूटर विज्ञान) सहित पहले तर्क का पूरी तरह से मूल्यांकन करते हैं, इससे पहले (वैकल्पिक रूप से) दूसरा तर्क संसाधित करना। ALGOL 68 ने उपयोगकर्ता-परिभाषित शॉर्ट-सर्किट ऑपरेटरों और प्रक्रियाओं को प्राप्त करने के लिए प्रक्रिया का उपयोग किया।

समस्यात्मक के रूप में शॉर्ट-सर्किट ऑपरेटरों के उपयोग की आलोचना की गई है:

The conditional connectives — "cand" and "cor" for short — are ... less innocent than they might seem at first sight. For instance, cor does not distribute over cand: compare

(A cand B) cor C with (A cor C) cand (B cor C);

in the case ¬A ∧ C , the second expression requires B to be defined, the first one does not. Because the conditional connectives thus complicate the formal reasoning about programs, they are better avoided.

परिभाषा

किसी भी प्रोग्रामिंग भाषा में जो शॉर्ट-सर्किट मूल्यांकन लागू करता है, अभिव्यक्ति x and y सशर्त (प्रोग्रामिंग) के बराबर है if x then y else x, और अभिव्यक्ति x or y के बराबर है if x then x else y. किसी भी स्थिति में, x का मूल्यांकन केवल बार किया जाता है।

ऊपर दी गई सामान्यीकृत परिभाषा दो से अधिक सत्य-मूल्यों वाली ढीली टाइप की गई भाषाओं को समायोजित करती है True और False, जहां शॉर्ट-सर्किट ऑपरेटर अंतिम मूल्यांकन किए गए सबएक्सप्रेशन को वापस कर सकते हैं। इसे नीचे दी गई तालिका में अंतिम मान कहा जाता है। सख्ती से टाइप की गई भाषा के लिए, अभिव्यक्ति को सरल बनाया गया है if x then y else false और if x then true else y क्रमशः बूलियन मामले के लिए।

वरीयता

यद्यपि AND ऑपरेटर की प्राथमिकता लेता है OR कई भाषाओं में, यह शॉर्ट-सर्किट मूल्यांकन की सार्वभौमिक संपत्ति नहीं है। POSIX शेल का कमांड-लिस्ट सिंटैक्स समान प्राथमिकता लेने वाले और दूसरे के साथ बाएं-सहयोगी होने वाले दो ऑपरेटर का उदाहरण है।[2]: §2.9.3 

निम्नलिखित सरल बाएँ से दाएँ मूल्यांकनकर्ता की पूर्वता को लागू करता है AND ऊपर OR द्वारा ए continue:

फंक्शन शॉर्ट-सर्किट-इवल (ऑपरेटर्स, वैल्यू)
    चलो परिणाम := सच
    प्रत्येक के लिए (op, val) in (ऑपरेटर्स, मान):
        if op = AND && result = False
            जारी रखना
        और अगर op = OR && result = True
            वापसी परिणाम
        अन्य
            परिणाम := वैल
    वापसी परिणाम

औपचारिकता

शॉर्ट-सर्किट लॉजिक, साइड-इफेक्ट्स के साथ या बिना, होरे लॉजिक # सशर्त नियम के आधार पर औपचारिक रूप दिया गया है। होरे की सशर्त। नतीजा यह है कि गैर-शॉर्ट सर्किटिंग ऑपरेटरों को मूल्यांकन के समान अनुक्रम के लिए शॉर्ट सर्किट तर्क से परिभाषित किया जा सकता है।[3]


सामान्य प्रोग्रामिंग और स्क्रिप्टिंग भाषाओं में समर्थन

Boolean operators in various languages
Language Eager operators Short-circuit operators Result type
Advanced Business Application Programming (ABAP) none and, or Boolean1
Ada and, or and then, or else Boolean
ALGOL 68 and, &, ∧ ; or, ∨ andf , orf (both user defined) Boolean
APL , , (nand), (nor), etc. :AndIf, :OrIf Boolean1
awk none &&, || Boolean
Bash none &&, || Boolean
C, Objective-C none &&, ||, ?[4] int (&&,||), opnd-dependent (?)
C++2 none &&, ||, ?[5] Boolean (&&,||), opnd-dependent (?)
C# &, | &&, ||, ?, ?? Boolean (&&,||), opnd-dependent (?, ??)
ColdFusion Markup Language (CFML) none AND, OR, &&, || Boolean
D3 &, | &&, ||, ? Boolean (&&,||), opnd-dependent (?)
Eiffel and, or and then, or else Boolean
Erlang and, or andalso, orelse Boolean
Fortran4 .and., .or. .and., .or. Boolean
Go, Haskell, OCaml none &&, || Boolean
Java, MATLAB, R, Swift &, | &&, || Boolean
JavaScript, Julia &, | &&, || Last value
Lasso none and, or, &&, || Last value
Kotlin and, or &&, || Boolean
Lisp, Lua, Scheme none and, or Last value
MUMPS (M) &, ! none Numeric
Modula-2 none AND, OR Boolean
Oberon none &, OR Boolean
OCaml none &&, || Boolean
Pascal and, or5,9 and_then, or_else6,9 Boolean
Perl &, | &&, and, ||, or Last value
Ruby and, or &&, || Last value
PHP &, | &&, and, ||, or Boolean
POSIX shell (command list) none &&, || Last value (exit)
PowerShell Scripting Language none -and, -or Boolean
Python &, | and, or Last value
Rust &, | &&, ||[6] Boolean
Smalltalk &, | and:, or:7 Boolean
Standard ML Un­known andalso, orelse Boolean
TTCN-3 none and, or[7] Boolean
Beckhoff TwinCAT® (IEC 61131-3)10 AND, OR AND_THEN,[8] OR_ELSE[9] Boolean
Visual Basic .NET And, Or AndAlso, OrElse Boolean
Visual Basic, Visual Basic for Applications (VBA) And, Or Select Case8 Numeric
Wolfram Language And @@ {...}, Or @@ {...} And, Or, &&, || Boolean
ZTT &, | none Boolean

1 ABAP और APL का कोई विशिष्ट बूलियन प्रकार नहीं है।
2 जब ऑपरेटर ओवरलोडिंग करता है, तो ऑपरेटर्स && और || उत्सुक हैं और किसी भी प्रकार का रिटर्न दे सकते हैं।
3 यह केवल रनटाइम-मूल्यांकित एक्सप्रेशन पर लागू होता है, static if और static assert. स्टेटिक इनिशियलाइज़र्स या मेनिफ़ेस्ट कांस्टेंट में एक्सप्रेशन उत्सुक मूल्यांकन का उपयोग करते हैं।
4 फोरट्रान ऑपरेटर न तो शॉर्ट-सर्किट हैं और न ही उत्सुक: भाषा विनिर्देश संकलक को अनुकूलन के लिए विधि का चयन करने की अनुमति देता है।
5 पास्कल (प्रोग्रामिंग भाषा)#ISO/IEC 10206:1990 विस्तारित पास्कल|ISO/IEC 10206:1990 विस्तारित पास्कल शॉर्ट-सर्किटिंग की अनुमति देता है, लेकिन इसकी आवश्यकता नहीं है।
6 ISO/IEC 10206:1990 एक्सटेंडेड पास्कल सपोर्ट करता है and_then और or_else.[10]
7 स्मॉलटाक तर्क के रूप में लंबे समय तक शॉर्ट-सर्किट शब्दार्थ का उपयोग करता है and: ब्लॉक है (उदाहरण के लिए, false and: [Transcript show: 'Wont see me']).
8 CASE कथनों का समर्थन करने वाली बुनियादी भाषाएं सशर्त मूल्यांकन प्रणाली का उपयोग करके ऐसा करती हैं, न कि स्थिर लेबलों तक सीमित जंप टेबल के रूप में।
9 डेल्फी (प्रोग्रामिंग भाषा) और शॉर्ट सर्किट मूल्यांकन के लिए फ़्री पास्कल डिफॉल्ट। इसे कंपाइलर विकल्पों द्वारा बदला जा सकता है लेकिन व्यापक रूप से उपयोग नहीं किया जाता है।
10 मानक IEC 61131-3 वास्तव में यदि परिभाषित नहीं करता है AND और OR शॉर्ट-सर्किट मूल्यांकन का उपयोग करें और यह ऑपरेटरों को परिभाषित नहीं करता है AND_THEN और OR_ELSE. तालिका में प्रविष्टियाँ दिखाती हैं कि यह बेकहॉफ़ ट्विनकैट® के लिए कैसे काम करता है।

सामान्य उपयोग

दूसरे तर्क के अवांछित दुष्प्रभावों से बचना

C (प्रोग्रामिंग भाषा)|C-आधारित भाषा का उपयोग करते हुए सामान्य उदाहरण:

int denom = 0;
if (denom != 0 && num / denom)
{
    ... // ensures that calculating num/denom never results in divide-by-zero error   
}

निम्नलिखित उदाहरण पर विचार करें:

int a = 0;
if (a != 0 && myfunc(b))
{
    do_something();
}

इस उदाहरण में, शॉर्ट-सर्किट मूल्यांकन इसकी गारंटी देता है myfunc(b) कभी नहीं बुलाया जाता है। यह है क्योंकि a != 0 असत्य का मूल्यांकन करता है। यह सुविधा दो उपयोगी प्रोग्रामिंग निर्माणों की अनुमति देती है।

  1. यदि पहली उप-अभिव्यक्ति यह जाँचती है कि क्या महंगी संगणना की आवश्यकता है और जाँच असत्य का मूल्यांकन करती है, तो दूसरे तर्क में महंगी संगणना को समाप्त किया जा सकता है।
  2. यह निर्माण की अनुमति देता है जहां पहली अभिव्यक्ति ऐसी स्थिति की गारंटी देती है जिसके बिना दूसरी अभिव्यक्ति रन-टाइम त्रुटि का कारण बन सकती है।

दोनों को निम्नलिखित सी स्निपेट में चित्रित किया गया है जहां न्यूनतम मूल्यांकन शून्य सूचक विचलन और अतिरिक्त मेमोरी दोनों को रोकता है:

bool is_first_char_valid_alpha_unsafe(const char *p)
{
    return isalpha(p[0]); // SEGFAULT highly possible with p == NULL
}

bool is_first_char_valid_alpha(const char *p)
{
    return p != NULL && isalpha(p[0]); // 1) no unneeded isalpha() execution with p == NULL, 2) no SEGFAULT risk
}


मुहावरेदार सशर्त निर्माण

चूंकि न्यूनतम मूल्यांकन ऑपरेटर की सिमेंटिक परिभाषा का हिस्सा है और वैकल्पिक संकलक अनुकूलन नहीं है, इसलिए कई कोडिंग मुहावरे संक्षिप्त सशर्त निर्माण के रूप में इस पर भरोसा करते हैं। उदाहरणों में शामिल:

पर्ल मुहावरे:

some_condition or die;    # Abort execution if some_condition is false
some_condition and die;   # Abort execution if some_condition is true

POSIX शेल मुहावरे:[11]

modprobe -q some_module && echo "some_module installed" || echo "some_module not installed"

यह मुहावरा ऐसा मानता है echo विफल नहीं हो सकता।

संभावित समस्याएं

=== अनुपचारित दूसरी स्थिति अकुशल साइड इफेक्ट === की ओर ले जाती है इन लाभों के बावजूद, न्यूनतम मूल्यांकन उन प्रोग्रामरों के लिए समस्याएँ पैदा कर सकता है जो यह नहीं समझते (या भूल जाते हैं) कि यह हो रहा है। उदाहरण के लिए, कोड में

if (expressionA && myfunc(b)) {
    do_something();
}

अगर myfunc(b) इस पर ध्यान दिए बिना कुछ आवश्यक संचालन करने वाला है do_something() निष्पादित किया जाता है, जैसे कि सिस्टम संसाधनों का आवंटन, और expressionA तब असत्य के रूप में मूल्यांकन करता है myfunc(b) नहीं चलेगा, जिससे परेशानी हो सकती है। इस समस्या से बचने के लिए कुछ प्रोग्रामिंग भाषाओं, जैसे कि जावा (प्रोग्रामिंग लैंग्वेज) में दो ऑपरेटर होते हैं, जो न्यूनतम मूल्यांकन करता है और दूसरा जो नहीं करता है।

खराब प्रदर्शन वाले साइड इफेक्ट स्टेटमेंट की समस्याओं को उचित प्रोग्रामिंग शैली के साथ आसानी से हल किया जा सकता है, यानी, बूलियन स्टेटमेंट में साइड इफेक्ट्स का उपयोग नहीं करना, क्योंकि मूल्यांकन में साइड इफेक्ट वाले मूल्यों का उपयोग आम तौर पर कोड को अपारदर्शी और त्रुटि-प्रवण बनाता है।[12]


सीमित अनुकूलन के कारण कम दक्षता

शॉर्ट-सर्किटिंग से आधुनिक सेंट्रल प्रोसेसिंग यूनिट (सीपीयू) पर शाखा भविष्यवाणी में त्रुटियां हो सकती हैं, और नाटकीय रूप से प्रदर्शन कम हो सकता है। उल्लेखनीय उदाहरण रे ट्रेसिंग (भौतिकी) में अक्ष संरेखित बॉक्स चौराहे कोड के साथ अत्यधिक अनुकूलित किरण है।[clarification needed] कुछ संकलक ऐसे मामलों का पता लगा सकते हैं और तेज़ कोड उत्सर्जित कर सकते हैं, लेकिन प्रोग्रामिंग भाषा शब्दार्थ इस तरह के अनुकूलन को बाधित कर सकता है।[citation needed]

ऐसे मामले के लिए अनुकूलन करने में असमर्थ कंपाइलर का उदाहरण जावा (प्रोग्रामिंग भाषा) का हॉटस्पॉट वीएम 2012 तक है।[13]


यह भी देखें

  • परवाह न करने की स्थिति

संदर्भ

  1. Edsger W. Dijkstra "On a somewhat disappointing correspondence", EWD1009-0, 25 May 1987 full text
  2. "शेल कमांड लैंग्वेज". pubs.opengroup.org.
  3. Jan A. Bergstra, A. Ponse, D.J.C. Staudt (2010). "शॉर्ट-सर्किट तर्क". arXiv:1010.3674 [cs.LO].{{cite arXiv}}: CS1 maint: uses authors parameter (link)
  4. ISO/IEC 9899 standard, section 6.5.13
  5. ISO/IEC IS 14882 draft.
  6. "std::ops - Rust". doc.rust-lang.org. Retrieved 2019-02-12.
  7. ETSI ES 201 873-1 V4.10.1, section 7.1.4
  8. "Beckhoff Information System - English". infosys.beckhoff.com. Retrieved 2021-08-16.
  9. "Beckhoff Information System - English". infosys.beckhoff.com. Retrieved 2021-08-16.
  10. "and_then - The GNU Pascal Manual". Gnu-pascal.de. Retrieved 2013-08-24.
  11. "What does || mean in bash?". stackexchange.com. Retrieved 2019-01-09.
  12. "संदर्भात्मक पारदर्शिता, निश्चितता और अनफोल्डेबिलिटी" (PDF). Itu.dk. Retrieved 2013-08-24.
  13. Wasserman, Louis. "java - ऐसे कौन से मामले हैं जिनमें बिना शर्त AND (& के बजाय &&) का उपयोग करना बेहतर है". Stack Overflow.