अल्प परिपथ निरूपण: Difference between revisions
No edit summary |
No edit summary |
||
Line 23: | Line 23: | ||
यद्यपि {{code|AND}} ऑपरेटर की प्राथमिकता लेता है {{code|OR}} कई भाषाओं में, यह अल्प परिपथ निरूपण की सार्वभौमिक संपत्ति नहीं है। पोसिक्स शेल का कमांड-लिस्ट सिंटैक्स समान प्राथमिकता लेने वाले और दूसरे के साथ बाएं-सहयोगी होने वाले दो ऑपरेटर का उदाहरण है।<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}} कई भाषाओं में, यह अल्प परिपथ निरूपण की सार्वभौमिक संपत्ति नहीं है। पोसिक्स शेल का कमांड-लिस्ट सिंटैक्स समान प्राथमिकता लेने वाले और दूसरे के साथ बाएं-सहयोगी होने वाले दो ऑपरेटर का उदाहरण है।<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|continue}} रखने के द्वारा {{code|AND}} ऊपर {{code|OR}} की प्राथमिकता को लागू करता है: | निम्नलिखित सरल बाएँ से दाएँ मूल्यांकनकर्ता एक {{code|continue}} रखने के द्वारा {{code|AND}} ऊपर {{code|OR}} की प्राथमिकता को लागू करता है:<syntaxhighlight lang="d"> | ||
function short-circuit-eval (operators, values) | |||
let result := True | |||
for each (op, val) in (operators, values): | |||
if op = "AND" && result = False | |||
continue | |||
else if op = "OR" && result = True | |||
return result | |||
else | |||
result := val | |||
return result | |||
</syntaxhighlight> | |||
=== औपचारिकता === | === औपचारिकता === |
Revision as of 13:53, 4 March 2023
Evaluation strategies |
---|
अल्प परिपथ निरूपण, न्यूनतम मूल्यांकन, या मैककार्थी मूल्यांकन (जॉन मैककार्थी (कंप्यूटर वैज्ञानिक) के बाद) कुछ प्रोग्रामिंग भाषाओं में कुछ बूलियन ऑपरेटरों का शब्दार्थ है जिसमें दूसरा तर्क केवल तभी निष्पादित या मूल्यांकन किया जाता है जब पहला तर्क निर्धारित करने के लिए पर्याप्त नहीं होता है। अभिव्यक्ति का मूल्य: जब AND
का पहला तर्क false
का मूल्यांकन करता है कुल मान false
होना चाहिए; और जब OR
का पहला तर्क true
का मूल्यांकन करता है, तो कुल मान true
होना चाहिए।
आलसी मूल्यांकन (लिस्प (प्रोग्रामिंग भाषा), पर्ल, हास्केल (प्रोग्रामिंग भाषा)) के साथ प्रोग्रामिंग भाषाओं में, सामान्य बूलियन ऑपरेटर अल्प परिपथ होते हैं। दूसरों में (एडा (प्रोग्रामिंग भाषा), जावा (प्रोग्रामिंग भाषा), डेल्फी (प्रोग्रामिंग भाषा)), अल्प परिपथ और मानक बूलियन ऑपरेटर दोनों उपलब्ध हैं। कुछ बूलियन ऑपरेशंस के लिए, जैसे एकमात्र (एक्सओआर), अल्प परिपथ करना संभव नहीं है, क्योंकि दोनों ऑपरेंड हमेशा परिणाम निर्धारित करने के लिए आवश्यक होते हैं।
अल्प परिपथ ऑपरेटर, प्रभाव में, सरल अंकगणितीय ऑपरेटरों के बजाय नियंत्रण संरचनाएं हैं, क्योंकि वे सख्त कार्य नहीं हैं। अनिवार्य भाषा के शब्दों में (विशेष रूप से सी (प्रोग्रामिंग भाषा) और सी ++), जहां दुष्प्रभाव महत्वपूर्ण, अल्प परिपथ ऑपरेटर अनुक्रम बिंदु प्रस्तुत करते हैं - वे वे दूसरे तर्क को संसाधित करने से पहले (वैकल्पिक रूप से) किसी भी दुष्प्रभाव (कंप्यूटर विज्ञान) सहित पहले तर्क का पूरी तरह से मूल्यांकन करते हैं। ऐल्गॉल 68 ने उपयोगकर्ता-परिभाषित अल्प परिपथ ऑपरेटरों और प्रक्रियाओं को प्राप्त करने के लिए प्रक्रिया का उपयोग किया था।
समस्यात्मक के रूप में अल्प परिपथ ऑपरेटरों के उपयोग की आलोचना की गई है:
सशर्त संयोजक — "cand" और "cor" संक्षेप में — ... कम निर्दोष हैं जितना वे पहली द्रष्टि में लग सकते हैं। उदाहरण के लिए, cor cand पर वितरित नहीं करता: तुलना करें
(A cand B) cor C साथ (A cor C) cand (B cor C);
¬A ∧ C के स्थिति में, दूसरी अभिव्यक्ति के लिए B को परिभाषित करने की आवश्यकता है, पहले वाले को को परिभाषित करने की आवश्यकता नही है। क्योंकि सशर्त संयोजक इस प्रकार प्रोग्रामों के बारे में औपचारिक तर्क को जटिल करते हैं, उन्हें उत्तम विधि से टाला जाता है।
— एडजर डब्ल्यू. डिज्कस्ट्रा<रेफरी>एडजर डब्ल्यू. दिज्क्स्ट्रा "कुछ सीमा तक निराशाजनक पत्राचार पर", ईडब्ल्यूडी1009-0, 25 मई 1987 /ewd10xx/EWD1009.PDF पूरा टेक्स्ट</ref>
परिभाषा
अल्प परिपथ निरूपण को लागू करने वाली किसी भी प्रोग्रामिंग भाषा में, अभिव्यक्ति 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
कई भाषाओं में, यह अल्प परिपथ निरूपण की सार्वभौमिक संपत्ति नहीं है। पोसिक्स शेल का कमांड-लिस्ट सिंटैक्स समान प्राथमिकता लेने वाले और दूसरे के साथ बाएं-सहयोगी होने वाले दो ऑपरेटर का उदाहरण है।[1]: §2.9.3
निम्नलिखित सरल बाएँ से दाएँ मूल्यांकनकर्ता एक continue
रखने के द्वारा AND
ऊपर OR
की प्राथमिकता को लागू करता है:
function short-circuit-eval (operators, values)
let result := True
for each (op, val) in (operators, values):
if op = "AND" && result = False
continue
else if op = "OR" && result = True
return result
else
result := val
return result
औपचारिकता
अल्प परिपथ लॉजिक, दुष्प्रभाव के साथ या बिना, होरे लॉजिक # सशर्त नियम के आधार पर औपचारिक रूप दिया गया है। होरे की सशर्त। नतीजा यह है कि गैर-शॉर्ट सर्किटिंग ऑपरेटरों को मूल्यांकन के समान अनुक्रम के लिए शॉर्ट सर्किट तर्क से परिभाषित किया जा सकता है।[2]
सामान्य प्रोग्रामिंग और स्क्रिप्टिंग भाषाओं में समर्थन
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 |
ऐल्गॉल 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 | && , || , ? [3]
|
int (&& ,|| ), opnd-dependent (? )
|
C++2 | none | && , || , ? [4]
|
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 , or 5,9
|
and_then , or_else 6,9
|
Boolean |
Perl | & , |
|
&& , and , || , or
|
Last value |
Ruby | and , or
|
&& , ||
|
Last value |
PHP | & , |
|
&& , and , || , or
|
Boolean |
पोसिक्स shell (command list) | none | && , ||
|
Last value (exit) |
PowerShell Scripting Language | none | -and , -or
|
Boolean |
Python | & , |
|
and , or
|
Last value |
Rust | & , |
|
&& , || [5]
|
Boolean |
Smalltalk | & , |
|
and: , or: 7
|
Boolean |
Standard ML | Unknown | andalso , orelse
|
Boolean |
TTCN-3 | none | and , or [6]
|
Boolean |
Beckhoff TwinCAT® (IEC 61131-3)10 | AND , OR
|
AND_THEN ,[7] OR_ELSE [8]
|
Boolean |
Visual Basic .NET | And , Or
|
AndAlso , OrElse
|
Boolean |
Visual Basic, Visual Basic for Applications (VBA) | And , Or
|
Select Case 8
|
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
.[9]
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
असत्य का मूल्यांकन करता है। यह सुविधा दो उपयोगी प्रोग्रामिंग निर्माणों की अनुमति देती है।
- यदि पहली उप-अभिव्यक्ति यह जाँचती है कि क्या महंगी संगणना की आवश्यकता है और जाँच असत्य का मूल्यांकन करती है, तो दूसरे तर्क में महंगी संगणना को समाप्त किया जा सकता है।
- यह निर्माण की अनुमति देता है जहां पहली अभिव्यक्ति ऐसी स्थिति की गारंटी देती है जिसके बिना दूसरी अभिव्यक्ति रन-टाइम त्रुटि का कारण बन सकती है।
दोनों को निम्नलिखित सी स्निपेट में चित्रित किया गया है जहां न्यूनतम मूल्यांकन शून्य सूचक विचलन और अतिरिक्त मेमोरी दोनों को रोकता है:
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
पोसिक्स शेल मुहावरे:[10]
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)
नहीं चलेगा, जिससे परेशानी हो सकती है। इस समस्या से बचने के लिए कुछ प्रोग्रामिंग भाषाओं, जैसे कि जावा (प्रोग्रामिंग लैंग्वेज) में दो ऑपरेटर होते हैं, जो न्यूनतम मूल्यांकन करता है और दूसरा जो नहीं करता है।
खराब प्रदर्शन वाले दुष्प्रभाव स्टेटमेंट की समस्याओं को उचित प्रोग्रामिंग शैली के साथ आसानी से हल किया जा सकता है, यानी, बूलियन स्टेटमेंट में दुष्प्रभावों का उपयोग नहीं करना, क्योंकि मूल्यांकन में दुष्प्रभाव वाले मूल्यों का उपयोग आम तौर पर कोड को अपारदर्शी और त्रुटि-प्रवण बनाता है।[11]
सीमित अनुकूलन के कारण कम दक्षता
अल्प परिपथिंग से आधुनिक सेंट्रल प्रोसेसिंग यूनिट (सीपीयू) पर शाखा भविष्यवाणी में त्रुटियां हो सकती हैं, और नाटकीय रूप से प्रदर्शन कम हो सकता है। उल्लेखनीय उदाहरण रे ट्रेसिंग (भौतिकी) में अक्ष संरेखित बॉक्स चौराहे कोड के साथ अत्यधिक अनुकूलित किरण है।[clarification needed] कुछ संकलक ऐसे मामलों का पता लगा सकते हैं और तेज़ कोड उत्सर्जित कर सकते हैं, लेकिन प्रोग्रामिंग भाषा शब्दार्थ इस तरह के अनुकूलन को बाधित कर सकता है।[citation needed]
ऐसे मामले के लिए अनुकूलन करने में असमर्थ कंपाइलर का उदाहरण जावा (प्रोग्रामिंग भाषा) का हॉटस्पॉट वीएम 2012 तक है।[12]
यह भी देखें
- परवाह न करने की स्थिति
संदर्भ
- ↑ "शेल कमांड लैंग्वेज". pubs.opengroup.org.
- ↑ Jan A. Bergstra, A. Ponse, D.J.C. Staudt (2010). "शॉर्ट-सर्किट तर्क". arXiv:1010.3674 [cs.LO].
{{cite arXiv}}
: CS1 maint: uses authors parameter (link) - ↑ ISO/IEC 9899 standard, section 6.5.13
- ↑ ISO/IEC IS 14882 draft.
- ↑ "std::ops - Rust". doc.rust-lang.org. Retrieved 2019-02-12.
- ↑ ETSI ES 201 873-1 V4.10.1, section 7.1.4
- ↑ "Beckhoff Information System - English". infosys.beckhoff.com. Retrieved 2021-08-16.
- ↑ "Beckhoff Information System - English". infosys.beckhoff.com. Retrieved 2021-08-16.
- ↑ "and_then - The GNU Pascal Manual". Gnu-pascal.de. Retrieved 2013-08-24.
- ↑ "What does || mean in bash?". stackexchange.com. Retrieved 2019-01-09.
- ↑ "संदर्भात्मक पारदर्शिता, निश्चितता और अनफोल्डेबिलिटी" (PDF). Itu.dk. Retrieved 2013-08-24.
- ↑ Wasserman, Louis. "java - ऐसे कौन से मामले हैं जिनमें बिना शर्त AND (& के बजाय &&) का उपयोग करना बेहतर है". Stack Overflow.