अल्प परिपथ निरूपण
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]
सामान्य प्रोग्रामिंग और स्क्रिप्टिंग भाषाओं में समर्थन
भाषा | इच्छुक संचालक | अल्प-परिपथ संचालक | परिणाम प्रकार |
---|---|---|---|
उन्नत व्यापार अनुप्रयोग प्रोग्रामिंग (एबीएपी) | none | and , or
|
बूलियन1 |
एडीए | and , or
|
and then , or else
|
बूलियन |
ऐल्गॉल 68 | and, &, ∧ ; or, ∨ | andf , orf (both user defined) | बूलियन |
एपीएल | ∧ , ∨ , ⍲ (nand), ⍱ (nor), etc.
|
:AndIf , :OrIf
|
बूलियन1 |
एडब्लूके | none | && , ||
|
बूलियन |
बश | none | && , ||
|
बूलियन |
सी, उद्देश्य-सी | none | && , || , ? [3]
|
int (&& ,|| ), ऑपंड-निर्भर (? )
|
सी++2 | none | && , || , ? [4]
|
बूलियन (&& ,|| ), ऑपंड-निर्भर (? )
|
सी# | & , |
|
&& , || , ? , ??
|
बूलियन (&& ,|| ), ऑपंड-निर्भर (? , ?? )
|
कोल्डफ्यूजन मार्कअप भाषा (सीएफएमएल) | none | AND , OR , && , ||
|
बूलियन |
डी3 | & , |
|
&& , || , ?
|
बूलियन (&& ,|| ), ऑपंड-निर्भर (? )
|
एफिल | and , or
|
and then , or else
|
बूलियन |
एर्लांगन | and , or
|
andalso , orelse
|
बूलियन |
फोरट्रान4 | .and. , .or.
|
.and. , .or.
|
बूलियन |
गो, हास्केल, ओकैमल | none | && , ||
|
बूलियन |
जावा, मतलब, आर, स्विफ्ट | & , |
|
&& , ||
|
बूलियन |
जावास्क्रिप्ट, जूलिया | & , |
|
&& , ||
|
अंतिम मान |
लेस्सो | none | and , or , && , ||
|
अंतिम मान |
कोटलिन | and , or
|
&& , ||
|
बूलियन |
लिस्प, लुआ, स्कीम | none | and , or
|
अंतिम मान |
मम्प्स (एम) | & , !
|
none | संख्यात्मक |
मोडुला -2 | none | AND , OR
|
बूलियन |
ओबेरॉन | none | & , OR
|
बूलियन |
ओकैमल | none | && , ||
|
बूलियन |
पास्कल | and , or 5,9
|
and_then , or_else 6,9
|
बूलियन |
पर्ल | & , |
|
&& , and , || , or
|
अंतिम मान |
रूबी | and , or
|
&& , ||
|
अंतिम मान |
पीएचपी | & , |
|
&& , and , || , or
|
बूलियन |
पोसिक्स शेल (कमांड सूची) | none | && , ||
|
अंतिम मान (प्रस्थान) |
पॉवरशेल स्क्रिप्टिंग भाषा | none | -and , -or
|
बूलियन |
पायथन | & , |
|
and , or
|
अंतिम मान |
रस्ट | & , |
|
&& , || [5]
|
बूलियन |
स्मालटाक | & , |
|
and: , or: 7
|
बूलियन |
स्टैंडर्ड एमएल | Unknown | andalso , orelse
|
बूलियन |
टीटीसीएन-3 | none | and , or [6]
|
बूलियन |
बेकहॉफ़ ट्विनकैट® (आईईसी 61131-3)10 | AND , OR
|
AND_THEN ,[7] OR_ELSE [8]
|
बूलियन |
विजुअल बेसिक .नेट | And , Or
|
AndAlso , OrElse
|
बूलियन |
विजुअल बेसिक, एप्लीकेशन के लिए विजुअल बेसिक (वीबीए) | And , Or
|
Select Case 8
|
संख्यात्मक |
वोल्फ्राम भाषा | And @@ {...} , Or @@ {...}
|
And , Or , && , ||
|
बूलियन |
जेडटीटी | & , |
|
none | बूलियन |
1 एबीएपी और एपीएल का कोई विशिष्ट बूलियन प्रकार नहीं है।
2 जब ऑपरेटर ओवरलोडिंग करता है, तो ऑपरेटर्स &&
और ||
उत्सुक हैं और किसी भी प्रकार का रिटर्न दे सकते हैं।
3 यह केवल रनटाइम-मूल्यांकित एक्सप्रेशन, static if
और static assert
पर लागू होता हैं। स्टेटिक इनिशियलाइज़र्स या मेनिफ़ेस्ट कांस्टेंट में एक्सप्रेशन उत्सुक मूल्यांकन का उपयोग करते हैं।
4 फोरट्रान ऑपरेटर न तो अल्प परिपथ हैं और न ही उत्सुक: भाषा विनिर्देश संकलक को अनुकूलन के लिए विधि का चयन करने की अनुमति देता है।
5 पास्कल (प्रोग्रामिंग भाषा) आईएसओ/आईईसी 10206:1990 विस्तारित पास्कल आईएसओ/आईईसी 10206:1990 विस्तारित पास्कल अल्प परिपथिंग की अनुमति देता है, किन्तु इसकी आवश्यकता नहीं है।
6 आईएसओ/आईईसी 10206:1990 एक्सटेंडेड पास्कल सपोर्ट करता है and_then
और or_else
.[9]
7 स्मॉलटाक तर्क के रूप में लंबे समय तक अल्प परिपथ शब्दार्थ का उपयोग करता है and:
ब्लॉक (उदाहरण के लिए, false and: [Transcript show: 'Wont see me']
) है।
8 सीएएसई कथनों का समर्थन करने वाली मूलभूत भाषाएं सशर्त मूल्यांकन प्रणाली का उपयोग करके, न कि स्थिर लेबलों तक सीमित जंप टेबल के रूप में ऐसा करती हैं।
9 डेल्फी (प्रोग्रामिंग भाषा) और अल्प परिपथ मूल्यांकन के लिए फ़्री पास्कल डिफॉल्ट होता हैं। इसे कंपाइलर विकल्पों द्वारा बदला जा सकता है किन्तु व्यापक रूप से उपयोग नहीं किया जाता है।
10 मानक आईईसी 61131-3 वास्तव में यदि परिभाषित नहीं करता है कि क्या AND
और OR
अल्प परिपथ निरूपण का उपयोग करते हैं और यह ऑपरेटरों AND_THEN
और OR_ELSE
को परिभाषित नहीं करता है। तालिका में प्रविष्टियाँ दिखाती हैं कि यह बेकहॉफ़ ट्विनकैट® के लिए कैसे काम करता है।
सामान्य उपयोग
दूसरे तर्क के अवांछित दुष्प्रभावों से बचना
सी-आधारित भाषा का उपयोग करते हुए सामान्य उदाहरण:
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.