शॉर्ट-सर्किट मूल्यांकन

From alpha
Jump to navigation Jump to search

शॉर्ट-सर्किट मूल्यांकन, न्यूनतम मूल्यांकन, या मैक्कार्थी मूल्यांकन (जॉन मैक्कार्थी (कंप्यूटर वैज्ञानिक) के बाद) कुछ प्रोग्रामिंग भाषाओं में कुछ तार्किक संयोजक का शब्दार्थ है जिसमें दूसरा तर्क केवल तभी निष्पादित या मूल्यांकन किया जाता है जब पहला तर्क निर्धारित करने के लिए पर्याप्त नहीं होता है अभिव्यक्ति का मूल्य: जब का पहला तर्क 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) के लिए (ऑपरेटर, मान):
        यदि op = AND && परिणाम = गलत
            जारी रखना
        अन्यथा यदि op = OR && परिणाम = सत्य है
            वापसी परिणाम
        अन्य
            परिणाम := वैल्यू
    वापसी परिणाम

औपचारिकीकरण

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


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

Boolean operators in various languages
Language Eager operators Short-circuit operators Result type
Advanced Business Application Programming (ABAP) none and, or Boolean[lower-alpha 1]
Ada and, or and then, or else Boolean
ALGOL 68 and, &, ∧ ; or, ∨ andf , orf (both user defined) Boolean
APL , , (nand), (nor), etc. :AndIf, :OrIf Boolean[lower-alpha 1]
awk none &&, || Boolean
Bash none &&, || Boolean
C, Objective-C &, |[lower-alpha 2] &&, ||, ?[5] int (&, |, &&,||), opnd-dependent (?)
C++[lower-alpha 3] none &&, ||, ?[6] Boolean (&&,||), opnd-dependent (?)
C# &, | &&, ||, ?, ?? Boolean (&&,||), opnd-dependent (?, ??)
ColdFusion Markup Language (CFML) none AND, OR, &&, || Boolean
D[lower-alpha 4] &, | &&, ||, ? Boolean (&&,||), opnd-dependent (?)
Eiffel and, or and then, or else Boolean
Erlang and, or andalso, orelse Boolean
Fortran[lower-alpha 5] .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 land, lor[7] &&, || Boolean
Pascal and, or[lower-alpha 6][lower-alpha 7] and_then, or_else[lower-alpha 7] 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 &, | &&, ||[8] Boolean
Smalltalk &, | and:, or:[lower-alpha 8] Boolean
Standard ML Un­known andalso, orelse Boolean
TTCN-3 none and, or[9] Boolean
Beckhoff TwinCAT® (IEC 61131-3)[lower-alpha 9] AND, OR AND_THEN,[10] OR_ELSE[11] Boolean
Visual Basic .NET And, Or AndAlso, OrElse Boolean
Visual Basic, Visual Basic for Applications (VBA) And, Or Select Case[lower-alpha 10] Numeric
Wolfram Language And @@ {...}, Or @@ {...} And, Or, &&, || Boolean
ZTT &, | none Boolean
  1. 1.0 1.1 ABAP and APL have no distinct boolean type.
  2. The bitwise operators behave like boolean operators when both arguments are of type bool and/or take only the values 0 or 1.[4]
  3. When overloaded, the operators && and || are eager and can return any type.
  4. This only applies to runtime-evaluated expressions, static if and static assert. Expressions in static initializers or manifest constants use eager evaluation.
  5. Fortran operators are neither short-circuit nor eager: the language specification allows the compiler to select the method for optimization.
  6. ISO/IEC 10206:1990 Extended Pascal allows, but does not require, short-circuiting.
  7. 7.0 7.1 Delphi and Free Pascal default to short circuit evaluation. This may be changed by compiler options but does not seem to be used widely.
  8. Smalltalk uses short-circuit semantics as long as the argument to and: is a block (e.g., false and: [Transcript show: 'Wont see me']).
  9. The norm IEC 61131-3 doesn't actually define if AND and OR use short-circuit evaluation and it doesn't define the operators AND_THEN and OR_ELSE. The entries in the table show how it works for Beckhoff TwinCAT®.
  10. BASIC languages that supported CASE statements did so by using the conditional evaluation system, rather than as jump tables limited to fixed labels.

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

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

सामान्य उदाहरण, 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 शेल मुहावरे:[12]

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) निष्पादित नहीं होगा, जिससे समस्याएँ उत्पन्न हो सकती हैं। इस समस्या से बचने के लिए कुछ प्रोग्रामिंग भाषाओं, जैसे जावा (प्रोग्रामिंग भाषा) में दो ऑपरेटर होते हैं, एक जो न्यूनतम मूल्यांकन करता है और एक जो नहीं करता है।

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


बाधापूर्ण अनुकूलन के कारण कम दक्षता

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

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


यह भी देखें

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

संदर्भ

  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, sections 6.2.5, 6.3.1.2, 6.5 and 7.16.
  5. ISO/IEC 9899 standard, section 6.5.13
  6. ISO/IEC IS 14882 draft.
  7. https://v2.ocaml.org/manual/expr.html#ss:expr-operators
  8. "std::ops - Rust". doc.rust-lang.org. Retrieved 2019-02-12.
  9. ETSI ES 201 873-1 V4.10.1, section 7.1.4
  10. "Beckhoff Information System - English". infosys.beckhoff.com. Retrieved 2021-08-16.
  11. "Beckhoff Information System - English". infosys.beckhoff.com. Retrieved 2021-08-16.
  12. "What does || mean in bash?". stackexchange.com. Retrieved 2019-01-09.
  13. "संदर्भात्मक पारदर्शिता, निश्चितता और खुलापन" (PDF). Itu.dk. Retrieved 2013-08-24.
  14. Wasserman, Louis. "जावा - ऐसे कौन से मामले हैं जिनमें बिना शर्त AND (&& के बजाय &) का उपयोग करना बेहतर है". Stack Overflow.