ऑफ-साइड नियम: Difference between revisions

From Vigyanwiki
No edit summary
Line 3: Line 3:
प्रोग्रामिंग भाषा सिंटैक्स सुविधा||ऑफसाइड (बहुविकल्पी)}}
प्रोग्रामिंग भाषा सिंटैक्स सुविधा||ऑफसाइड (बहुविकल्पी)}}


यदि किसी कंप्यूटर [[प्रोग्रामिंग भाषा]] में ब्लॉक को उसके इंडेंटेशन द्वारा व्यक्त किया जाता है,<ref name=":0">
एक कंप्यूटर [[प्रोग्रामिंग भाषा|प्रोग्रामिंग लैंग्वेज]] को सिंटैक्स के '''ऑफ-साइड नियम''' का पालन करने के लिए कहा जाता है, यदि उस लैंग्वेज में ब्लॉक उनके इंडेंटेशन द्वारा व्यक्त किए जाता हैं। इस शब्द का प्रयोग [[पीटर लैंडिन]] ने संभवतः [[फ़ुटबॉल संघ|फ़ुटबॉल]] के ऑफ़साइड नियम पर विचारशीलता के लिए एक मज़ाक के रूप में किया था। इसके विपरीत, फ्री-फॉर्म लैंग्वेजो, विशेष रूप से कर्ली-कोष्ठक प्रोग्रामिंग लैंग्वेजो के साथ, इंडेंटेशन का कोई गणनात्मक अर्थ नहीं होता है और इंडेंटेशन की शैली केवल कोडिंग संबंधी सामग्री और फॉर्मेटिंग के रूप में संदर्भित होते हैं। साथ ही, ऑफ-साइड-नियम लैंग्वेजो को भी महत्वपूर्ण इंडेंटेशन वाली लैंग्वेजो के रूप में वर्णित किया जाता है।
{{cite conference
| first= G.
| last= Hutton
| editor-first= Kei
| editor-last= Davis
| editor2-first= John
| editor2-last= Hughes
| title= Parsing Using Combinators
| book-title= Functional Programming: Proceedings of the 1989 Glasgow Workshop 21–23 August 1989, Fraserburgh, Scotland
| pages= 362–364
| publisher= Springer Science & Business Media
| date= Dec 6, 2012
| isbn= 9781447131663
| url= https://books.google.com/books?id=GiLjBwAAQBAJ&dq=offside+rule+programming&pg=PA363
| access-date= September 3, 2015}}
</ref> तो उस भाषा का सिंटेक्स, '''ऑफ-साइड नियम''' का पालन करता है। इस शब्द का प्रयोग [[पीटर लैंडिन]] ने संभवतः [[फ़ुटबॉल संघ|फ़ुटबॉल]] के ऑफ़साइड नियम पर विचारशीलता के लिए एक मज़ाक के रूप में किया था। इसके विपरीत, फ्री-फॉर्म भाषाओं, विशेष रूप से कर्ली-कोष्ठक प्रोग्रामिंग भाषाओं के साथ, इंडेंटेशन का कोई गणनात्मक अर्थ नहीं होता है और इंडेंटेशन की शैली केवल कोडिंग संबंधी सामग्री और फॉर्मेटिंग के रूप में संदर्भित होते हैं। साथ ही, ऑफ-साइड-नियम भाषाओं को भी महत्वपूर्ण इंडेंटेशन वाली भाषाओ के रूप में वर्णित किया जाता है।


==परिभाषा==
==परिभाषा==
पीटर लैंडिन ने अपने 1966 के लेख [[अगली 700 प्रोग्रामिंग भाषाएँ]] में ऑफ-साइड नियम को इस प्रकार परिभाषित किया: पिछली पंक्ति पर पहले ऐसे टोकन के बाईं ओर कोई भी गैर-व्हाट्सएप टोकन एक नई घोषणा की शुरुआत मानी जाती है।"<ref>{{cite journal |last1=Landin |first1=P. J. |author1-link=Peter Landin |date=March 1966 |title=The next 700 programming languages |doi=10.1145/365230.365257 |journal=[[Communications of the ACM]] |volume=9 |issue=3 |pages=157–166 |s2cid=13409665 |url=http://fsl.cs.uiuc.edu/images/e/ef/P157-landin.pdf}}</ref>
पीटर लैंडिन ने अपने 1966 के लेख [[अगली 700 प्रोग्रामिंग भाषाएँ|अगली 700 प्रोग्रामिंग लैंग्वेज एँ]] में ऑफ-साइड नियम को इस प्रकार परिभाषित किया: पिछली पंक्ति पर पहले ऐसे टोकन के बाईं ओर कोई भी गैर-व्हाट्सएप टोकन एक नई घोषणा का प्रारंभ माना जाता है।<ref>{{cite journal |last1=Landin |first1=P. J. |author1-link=Peter Landin |date=March 1966 |title=The next 700 programming languages |doi=10.1145/365230.365257 |journal=[[Communications of the ACM]] |volume=9 |issue=3 |pages=157–166 |s2cid=13409665 |url=http://fsl.cs.uiuc.edu/images/e/ef/P157-landin.pdf}}</ref>




==कोड उदाहरण==
==कोड उदाहरण==
निम्नलिखित एक [[पायथन (प्रोग्रामिंग भाषा)|पायथन]] में इंडेंटेशन ब्लॉक का उदाहरण है: कोलन [[पायथन (प्रोग्रामिंग भाषा)|पायथन]]भाषा की सुविधाओं में से एक हैं जो पठनीयता के लिए होते हैं; वे ऑफ-साइड नियम को लागू करने के लिए आवश्यक नहीं होते।
निम्नलिखित एक [[पायथन (प्रोग्रामिंग भाषा)|पायथन]] में इंडेंटेशन ब्लॉक का उदाहरण है: कोलन [[पायथन (प्रोग्रामिंग भाषा)|पायथन]]लैंग्वेज  की सुविधाओं में से एक हैं जो पठनीयता के लिए होते हैं; वे ऑफ-साइड नियम को लागू करने के लिए आवश्यक नहीं होते।


पायथन में, यह नियम घोषणाओं की सीमाएं परिभाषित करने के अतिरिक्त कथन की सीमाएं परिभाषित करने के लिए लागू होता है।
पायथन में, यह नियम घोषणाओं की सीमाएं परिभाषित करने के अतिरिक्त कथन की सीमाएं परिभाषित करने के लिए लागू होता है।
Line 52: Line 36:


==कार्यान्वयन==
==कार्यान्वयन==
ऑफ-साइड नियम को शाब्दिक विश्लेषण चरण में लागू किया जा सकता है, जैसे Python में, जहां इंडेंटिंग को बढ़ाने पर लेक्सर आउटपुट में एक <code>INDENT</code>  टोकन उत्पन्न होता है, और इंडेंटिंग को कम करने पर लेक्सर आउटपुट में एक <code>DEDENT</code> टोकन उत्पन्न होता है।.<ref>[https://docs.python.org/ Python Documentation], [https://docs.python.org/3/reference/lexical_analysis.html 2. Lexical analysis]: [https://docs.python.org/3/reference/lexical_analysis.html#indentation 2.1.8. Indentation]</ref> ये टोकन ब्रेस ब्लॉक के खुलने वाले ब्रेस और बंद होने वाले ब्रेस  के समानांतर होते हैं जो भाषाओं में प्रयोग होती हैं और इसका अर्थ है कि वाक्य व्याकरण इस पर निर्भर नहीं करता है कि ब्रेस या इंडेंटेशन का उपयोग किया जाता है। यह आवश्यकता होती है कि लेक्सर स्थानांतरण स्तर को मेमोराइज़ करे, अर्थात् वर्तमान इंडेंट स्तर को संग्रह करे, और इसलिए यह परिवर्तन होने पर इंडेंटेशन में परिवर्तन का पता लगा सकता है, और इस प्रकार [[औपचारिक व्याकरण]] वाक्य व्याकरण से मुक्त नहीं होता है <code>INDENT</code> और <code>DEDENT</code> पिछले इंडेंट स्तर की संदर्भिक जानकारी पर निर्भर करता है।
ऑफ-साइड नियम को शाब्दिक विश्लेषण चरण में लागू किया जा सकता है, जैसे Python में, जहां इंडेंटिंग को बढ़ाने पर लेक्सर आउटपुट में एक <code>INDENT</code>  टोकन उत्पन्न होता है, और इंडेंटिंग को कम करने पर लेक्सर आउटपुट में एक <code>DEDENT</code> टोकन उत्पन्न होता है।.<ref>[https://docs.python.org/ Python Documentation], [https://docs.python.org/3/reference/lexical_analysis.html 2. Lexical analysis]: [https://docs.python.org/3/reference/lexical_analysis.html#indentation 2.1.8. Indentation]</ref> ये टोकन ब्रेस ब्लॉक के खुलने वाले ब्रेस और बंद होने वाले ब्रेस  के समानांतर होते हैं जो लैंग्वेज ओं में प्रयोग होती हैं और इसका अर्थ है कि वाक्य व्याकरण इस पर निर्भर नहीं करता है कि ब्रेस या इंडेंटेशन का उपयोग किया जाता है। यह आवश्यकता होती है कि लेक्सर स्थानांतरण स्तर को मेमोराइज़ करे, अर्थात् वर्तमान इंडेंट स्तर को संग्रह करे, और इसलिए यह परिवर्तन होने पर इंडेंटेशन में परिवर्तन का पता लगा सकता है, और इस प्रकार [[औपचारिक व्याकरण]] वाक्य व्याकरण से मुक्त नहीं होता है <code>INDENT</code> और <code>DEDENT</code> पिछले इंडेंट स्तर की संदर्भिक जानकारी पर निर्भर करता है।


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


[[लिस्प (प्रोग्रामिंग भाषा)|लिस्प]] और अन्य [[एस-अभिव्यक्ति]]-आधारित भाषाएं कथनों को अभिव्यक्तियों से अलग नहीं करती हैं, और कोष्ठक भाषा के भीतर सभी कथनों के सीमा को नियंत्रित करने के लिए पर्याप्त हैं। घुंघराले कोष्ठक भाषाओं की तरह, रिक्त स्थान को अधिकतर पाठक द्वारा अनदेखा कर दिया जाता है। व्हाईटस्पेस का उपयोग टोकन को अलग करने के लिए किया जाता है।<ref>{{Cite web|url=http://clhs.lisp.se/Body/02_adg.htm|title = CLHS: Section 2.1.4.7}}</ref> लिस्प कोड की स्पष्ट संरचना मानव पाठकों के लिए एक दृश्य संकेत बनाने के लिए स्वचालित इंडेंटिंग की अनुमति देती है।
[[लिस्प (प्रोग्रामिंग भाषा)|लिस्प]] और अन्य [[एस-अभिव्यक्ति]]-आधारित लैंग्वेज एं कथनों को अभिव्यक्तियों से अलग नहीं करती हैं, और कोष्ठक लैंग्वेज  के भीतर सभी कथनों के सीमा को नियंत्रित करने के लिए पर्याप्त हैं। घुंघराले कोष्ठक लैंग्वेज ओं की तरह, रिक्त स्थान को अधिकतर पाठक द्वारा अनदेखा कर दिया जाता है। व्हाईटस्पेस का उपयोग टोकन को अलग करने के लिए किया जाता है।<ref>{{Cite web|url=http://clhs.lisp.se/Body/02_adg.htm|title = CLHS: Section 2.1.4.7}}</ref> लिस्प कोड की स्पष्ट संरचना मानव पाठकों के लिए एक दृश्य संकेत बनाने के लिए स्वचालित इंडेंटिंग की अनुमति देती है।


कुछ प्रोग्रामिंग भाषाओं में प्रत्येक ब्लॉक की शुरुआत और समाप्ति के लिए स्पष्ट कीवर्ड उपयोग किए जाते हैं। इस तरीके से कोड ब्लॉक की सीमाओं की परिभाषा में स्पष्टता और असंदिग्धता प्रदान करता है। [[ALGOL 60]] और उसके वंशावली [[Pascal (programming language)|पास्कल]] में ब्लॉक <code>begin</code> और "<code>end</code> [[Reserved word|कीवर्ड]] के बीच आते हैं। यह सिन्टेक्स यह सुनिश्चित करता है कि प्रत्येक ब्लॉक का प्रारंभ और समाप्ति स्पष्ट रूप से उल्लिखित होती है। यद्यपि प्रास्कल में इंडेंटेशन महत्वपूर्ण नहीं है, परंतु न्यूलाइन का उपयोग योग्यतात्मक हो सकता है। [[BASIC]]और  फोरट्रान में, ब्लॉक का प्रारंभ ब्लॉक के नाम के साथ होती है (जैसे IF) और ब्लॉक के नाम के पहले "<code>end</code>" लगाया जाता है (जैसे "END IF")।  [[source code editor|फोरट्रान]] में प्रत्येक एक ब्लॉक का अपना स्वयं का नाम हो सकता है, जो लंबे कोड में और अधिक स्पष्टता जोड़ता है। [[ALGOL 60]] और बोर्न शेल (sh, और [[Bash (Unix shell)|bash]]) में, ब्लॉक की समाप्ति सामान्यतः पलटकर लिखे गए ब्लॉक के नाम द्वारा दी जाती है। उदाहरण के लिए, बोर्न शेल में स्विच कथन <code>case</code>" से प्रारंभ होता है और "<code>esac</code>" तक चलता है। इसी तरह, [[ALGOL 60]] में <code>if</code>...<code>then</code>...[<code>elif</code>...[<code>else</code>...]]<code>fi</code> और बैश में "<code>for</code>...<code>do</code>...<code>od</code>" जैसी शर्ताधारी वाक्यांशों के द्वारा ब्लॉक का प्रारंभ और समाप्ति स्पष्टतः निर्दिष्ट की जाती है। ये स्पष्ट ब्लॉक निर्देशक ब्लॉक कोड को पठनीयता बढ़ाने में सहायक होते हैं और गलतियों के प्रति कम संवेदनशील बनाते हैं। विकाशक आसानी से प्रत्येक ब्लॉक की सीमाओं को पहचान सकते हैं, जो कोड की समझ और रखरखाव में सहायक हो सकते है।
कुछ प्रोग्रामिंग लैंग्वेज ओं में प्रत्येक ब्लॉक की शुरुआत और समाप्ति के लिए स्पष्ट कीवर्ड उपयोग किए जाते हैं। इस तरीके से कोड ब्लॉक की सीमाओं की परिलैंग्वेज  में स्पष्टता और असंदिग्धता प्रदान करता है। [[ALGOL 60]] और उसके वंशावली [[Pascal (programming language)|पास्कल]] में ब्लॉक <code>begin</code> और "<code>end</code> [[Reserved word|कीवर्ड]] के बीच आते हैं। यह सिन्टेक्स यह सुनिश्चित करता है कि प्रत्येक ब्लॉक का प्रारंभ और समाप्ति स्पष्ट रूप से उल्लिखित होती है। यद्यपि प्रास्कल में इंडेंटेशन महत्वपूर्ण नहीं है, परंतु न्यूलाइन का उपयोग योग्यतात्मक हो सकता है। [[BASIC]]और  फोरट्रान में, ब्लॉक का प्रारंभ ब्लॉक के नाम के साथ होती है (जैसे IF) और ब्लॉक के नाम के पहले "<code>end</code>" लगाया जाता है (जैसे "END IF")।  [[source code editor|फोरट्रान]] में प्रत्येक एक ब्लॉक का अपना स्वयं का नाम हो सकता है, जो लंबे कोड में और अधिक स्पष्टता जोड़ता है। [[ALGOL 60]] और बोर्न शेल (sh, और [[Bash (Unix shell)|bash]]) में, ब्लॉक की समाप्ति सामान्यतः पलटकर लिखे गए ब्लॉक के नाम द्वारा दी जाती है। उदाहरण के लिए, बोर्न शेल में स्विच कथन <code>case</code>" से प्रारंभ होता है और "<code>esac</code>" तक चलता है। इसी तरह, [[ALGOL 60]] में <code>if</code>...<code>then</code>...[<code>elif</code>...[<code>else</code>...]]<code>fi</code> और बैश में "<code>for</code>...<code>do</code>...<code>od</code>" जैसी शर्ताधारी वाक्यांशों के द्वारा ब्लॉक का प्रारंभ और समाप्ति स्पष्टतः निर्दिष्ट की जाती है। ये स्पष्ट ब्लॉक निर्देशक ब्लॉक कोड को पठनीयता बढ़ाने में सहायक होते हैं और गलतियों के प्रति कम संवेदनशील बनाते हैं। विकाशक आसानी से प्रत्येक ब्लॉक की सीमाओं को पहचान सकते हैं, जो कोड की समझ और रखरखाव में सहायक हो सकते है।


इसका एक रोचक रूप में प्राकृतिक होने वाला रूपांतर [[Modula-2|मॉड्यूल-2]] में देखा जाता है, जो एक पास्कल जैसी भाषा है जो एक और बहु-लाइन ब्लॉक के बीच का अंतर खत्म कर देती है। इससे एक्सेस करने वाले ब्लॉक के लिए ब्लॉक खोलने वाले टोकन (<code>{</code> या <code>BEGIN</code>) को सभी के लिए छोड़ा जा सकता है, केवल ब्लॉक समाप्त करने वाले टोकन (<code>}</code> या <code>END</code>) की आवश्यकता होती है। इसके अतिरिक्त  यह [[dangling else|निलंबित एल्स]]  को सुधारता है। उपयोग के लिए <code>end</code> टोकन को ब्लॉक के शेष इंडेंट स्तर पर रखना होता है, जो एक ब्लॉक संरचना को बहुत पठनीय बनाता है।
इसका एक रोचक रूप में प्राकृतिक होने वाला रूपांतर [[Modula-2|मॉड्यूल-2]] में देखा जाता है, जो एक पास्कल जैसी लैंग्वेज  है जो एक और बहु-लाइन ब्लॉक के बीच का अंतर खत्म कर देती है। इससे एक्सेस करने वाले ब्लॉक के लिए ब्लॉक खोलने वाले टोकन (<code>{</code> या <code>BEGIN</code>) को सभी के लिए छोड़ा जा सकता है, केवल ब्लॉक समाप्त करने वाले टोकन (<code>}</code> या <code>END</code>) की आवश्यकता होती है। इसके अतिरिक्त  यह [[dangling else|निलंबित एल्स]]  को सुधारता है। उपयोग के लिए <code>end</code> टोकन को ब्लॉक के शेष इंडेंट स्तर पर रखना होता है, जो एक ब्लॉक संरचना को बहुत पठनीय बनाता है।


[[source code editor|फोरट्रान]] के दृष्टिकोण से एक लाभ यह है कि यह लंबे, नेस्टेड या अन्यथा जटिल कोड की पठनीयता में सुधार करता है। एक आउटडेंट्स या समाप्ति ब्रैकेट्स का समूह केवल सांद्रत्यपूर्ण संकेत उपलब्ध कराता है कि कौन से ब्लॉक बंद हो रहे हैं, जिससे पीछे जाना और [[debugging|निलंबित]] के समय अधिक सतर्कता की आवश्यकता होती है। इसके अतिरिक्त, <code>end</code>-जैसे कीवर्ड्स के लिए सफ्फिक्स की अनुमति देने वाली भाषाएं इस तरह की संकेतों को और बेहतर बनाती हैं, जैसे <code>continue</code> और  <code>continue for x</code>। यद्यपि, आधुनिक स्रोत [[source code editor|कोड संपादक]] प्रायः विजुअल संकेतक, जैसे [[syntax highlighting|हाइलाइटिंग सिंटेक्स]], और [[code folding|कोड फोल्डिंग]] जैसी विशेषताएँ प्रदान करते हैं, जो इन दुष्प्रभावों के साथ मदद करते हैं।
[[source code editor|फोरट्रान]] के दृष्टिकोण से एक लाभ यह है कि यह लंबे, नेस्टेड या अन्यथा जटिल कोड की पठनीयता में सुधार करता है। एक आउटडेंट्स या समाप्ति ब्रैकेट्स का समूह केवल सांद्रत्यपूर्ण संकेत उपलब्ध कराता है कि कौन से ब्लॉक बंद हो रहे हैं, जिससे पीछे जाना और [[debugging|निलंबित]] के समय अधिक सतर्कता की आवश्यकता होती है। इसके अतिरिक्त, <code>end</code>-जैसे कीवर्ड्स के लिए सफ्फिक्स की अनुमति देने वाली लैंग्वेज एं इस तरह की संकेतों को और बेहतर बनाती हैं, जैसे <code>continue</code> और  <code>continue for x</code>। यद्यपि, आधुनिक स्रोत [[source code editor|कोड संपादक]] प्रायः विजुअल संकेतक, जैसे [[syntax highlighting|हाइलाइटिंग सिंटेक्स]], और [[code folding|कोड फोल्डिंग]] जैसी विशेषताएँ प्रदान करते हैं, जो इन दुष्प्रभावों के साथ मदद करते हैं।


[[Category:Articles with hatnote templates targeting a nonexistent page]]
[[Category:Articles with hatnote templates targeting a nonexistent page]]
Line 77: Line 61:


==उत्पादकता==
==उत्पादकता==
स्काला भाषा में, प्रारंभिक संस्करणों में कर्वी ब्रेसेज को ही अनुमति दी जाती थी। स्काला 3 ने एक विकल्प जोड़ा है जिससे ब्लॉक को संरचित करने के लिए इंडेंटिंग का उपयोग किया जा सकता है। डिज़ाइनर मार्टिन ओडर्स्की ने कहा है कि इससे कुल में उत्पादकता 10% तक बढ़ जाती है, यह स्काला 3 में प्रस्तुत की गई सबसे उत्पादक बदलाव होता है, और इसके उपयोग की सलाह दी जाती है।
स्काला लैंग्वेज  में, प्रारंभिक संस्करणों में कर्वी ब्रेसेज को ही अनुमति दी जाती थी। स्काला 3 ने एक विकल्प जोड़ा है जिससे ब्लॉक को संरचित करने के लिए इंडेंटिंग का उपयोग किया जा सकता है। डिज़ाइनर मार्टिन ओडर्स्की ने कहा है कि इससे कुल में उत्पादकता 10% तक बढ़ जाती है, यह स्काला 3 में प्रस्तुत की गई सबसे उत्पादक बदलाव होता है, और इसके उपयोग की सलाह दी जाती है।






==ऑफ-साइड नियम भाषाएँ==
==ऑफ-साइड नियम लैंग्वेज एँ==


===प्रोग्रामिंग भाषाएँ===
===प्रोग्रामिंग लैंग्वेज एँ===
* [[एबीसी (प्रोग्रामिंग भाषा)]]
* [[एबीसी (प्रोग्रामिंग भाषा)|एबीसी (प्रोग्रामिंग लैंग्वेज )]]
* [[बू (प्रोग्रामिंग भाषा)]]
* [[बू (प्रोग्रामिंग भाषा)|बू (प्रोग्रामिंग लैंग्वेज )]]
* बडीस्क्रिप्ट
* बडीस्क्रिप्ट
* [[कोबरा (प्रोग्रामिंग भाषा)]]
* [[कोबरा (प्रोग्रामिंग भाषा)|कोबरा (प्रोग्रामिंग लैंग्वेज )]]
* [[कॉफ़ीस्क्रिप्ट]]
* [[कॉफ़ीस्क्रिप्ट]]
* जुटना
* जुटना
* [[करी (प्रोग्रामिंग भाषा)]]
* [[करी (प्रोग्रामिंग भाषा)|करी (प्रोग्रामिंग लैंग्वेज )]]
* [[एल्म (प्रोग्रामिंग भाषा)]]
* [[एल्म (प्रोग्रामिंग भाषा)|एल्म (प्रोग्रामिंग लैंग्वेज )]]
* F (प्रारंभिक संस्करणों में, जब <code>#light</code> निर्दिष्ट किया जाता है; बाद के संस्करणों में जब <code>#light "off"</code>  नहीं होता है<ref>{{Cite web |url=https://blogs.msdn.microsoft.com/dsyme/2009/05/20/detailed-release-notes-for-the-f-may-2009-ctp-update-and-visual-studio-2010-beta1-releases/ |title=Detailed Release Notes for the F# May 2009 CTP Update and Visual Studio 2010 Beta1 releases |last=Syme |first=Don |archive-url=https://web.archive.org/web/20190121121601/https://blogs.msdn.microsoft.com/dsyme/2009/05/20/detailed-release-notes-for-the-f-may-2009-ctp-update-and-visual-studio-2010-beta1-releases/ |archive-date=2019-01-21}}</ref>)
* F (प्रारंभिक संस्करणों में, जब <code>#light</code> निर्दिष्ट किया जाता है; बाद के संस्करणों में जब <code>#light "off"</code>  नहीं होता है<ref>{{Cite web |url=https://blogs.msdn.microsoft.com/dsyme/2009/05/20/detailed-release-notes-for-the-f-may-2009-ctp-update-and-visual-studio-2010-beta1-releases/ |title=Detailed Release Notes for the F# May 2009 CTP Update and Visual Studio 2010 Beta1 releases |last=Syme |first=Don |archive-url=https://web.archive.org/web/20190121121601/https://blogs.msdn.microsoft.com/dsyme/2009/05/20/detailed-release-notes-for-the-f-may-2009-ctp-update-and-visual-studio-2010-beta1-releases/ |archive-date=2019-01-21}}</ref>)
* [[जिन्न (प्रोग्रामिंग भाषा)]]
* [[जिन्न (प्रोग्रामिंग भाषा)|जिन्न (प्रोग्रामिंग लैंग्वेज )]]
* जीडीस्क्रिप्ट (गोडोट इंजन)
* जीडीस्क्रिप्ट (गोडोट इंजन)
* [[हास्केल (प्रोग्रामिंग भाषा)]]<ref>[http://haskell.org/onlinereport/lexemes.html#sect2.7 The Haskell Report – Layout]</ref> (केवल <code>where</code>, <code>let</code>, <code>do</code>, या <code>case ... of</code> खंड जब ब्रेसिज़ छोड़े जाते हैं)
* [[हास्केल (प्रोग्रामिंग भाषा)|हास्केल (प्रोग्रामिंग लैंग्वेज )]]<ref>[http://haskell.org/onlinereport/lexemes.html#sect2.7 The Haskell Report – Layout]</ref> (केवल <code>where</code>, <code>let</code>, <code>do</code>, या <code>case ... of</code> खंड जब ब्रेसिज़ छोड़े जाते हैं)
* [[सूचित करें 7]]
* [[सूचित करें 7]]
* [[ISWIM|आईएसडब्ल्यूआईएम]], वह अमूर्त भाषा जिसने नियम प्रस्तुत किया
* [[ISWIM|आईएसडब्ल्यूआईएम]], वह अमूर्त लैंग्वेज  जिसने नियम प्रस्तुत किया
* [[लाइवस्क्रिप्ट (प्रोग्रामिंग भाषा)]]
* [[लाइवस्क्रिप्ट (प्रोग्रामिंग भाषा)|लाइवस्क्रिप्ट (प्रोग्रामिंग लैंग्वेज )]]
* [[मिरांडा (प्रोग्रामिंग भाषा)]]
* [[मिरांडा (प्रोग्रामिंग भाषा)|मिरांडा (प्रोग्रामिंग लैंग्वेज )]]
* मूनस्क्रिप्ट<ref>[https://moonscript.org MoonScript, a language that compiles to Lua]</ref><ref>[https://moonscript.org/reference/#the-language/whitespace MoonScript 0.5.0 – Language Guide]</ref>
* मूनस्क्रिप्ट<ref>[https://moonscript.org MoonScript, a language that compiles to Lua]</ref><ref>[https://moonscript.org/reference/#the-language/whitespace MoonScript 0.5.0 – Language Guide]</ref>
* [[नेमर्ले]], वैकल्पिक मोड
* [[नेमर्ले]], वैकल्पिक मोड
* [[निम (प्रोग्रामिंग भाषा)]]
* [[निम (प्रोग्रामिंग भाषा)|निम (प्रोग्रामिंग लैंग्वेज )]]
* अवसर (प्रोग्रामिंग भाषा)
* अवसर (प्रोग्रामिंग लैंग्वेज )
* [[प्रोमल]]
* [[प्रोमल]]
* पायथन (प्रोग्रामिंग भाषा)
* पायथन (प्रोग्रामिंग लैंग्वेज )
* स्काला (प्रोग्रामिंग भाषा), वैकल्पिक मोड
* स्काला (प्रोग्रामिंग लैंग्वेज ), वैकल्पिक मोड
* [[योजना (प्रोग्रामिंग भाषा)]], कार्यान्वयन के लिए कई योजना अनुरोधों में से एक का उपयोग करते समय, जिनमें से नवीनतम है
* [[योजना (प्रोग्रामिंग भाषा)|योजना (प्रोग्रामिंग लैंग्वेज )]], कार्यान्वयन के लिए कई योजना अनुरोधों में से एक का उपयोग करते समय, जिनमें से नवीनतम है
* [[स्पिन (प्रोग्रामिंग भाषा)]]
* [[स्पिन (प्रोग्रामिंग भाषा)|स्पिन (प्रोग्रामिंग लैंग्वेज )]]
*वोमा
*वोमा
* [[एक्सएल (प्रोग्रामिंग भाषा)]]
* [[एक्सएल (प्रोग्रामिंग भाषा)|एक्सएल (प्रोग्रामिंग लैंग्वेज )]]


===अन्य भाषाएँ===
===अन्य लैंग्वेज एँ===
* [[ जांघ ]]
* [[ जांघ ]]
* मेक (सॉफ़्टवेयर)
* मेक (सॉफ़्टवेयर)
* [[पुनः संरचित पाठ]]<ref>[http://docutils.sourceforge.net/docs/ref/rst/restructuredtext.html#id38 reStructuredText Markup Specification – Indentation]</ref>
* [[पुनः संरचित पाठ]]<ref>[http://docutils.sourceforge.net/docs/ref/rst/restructuredtext.html#id38 reStructuredText Markup Specification – Indentation]</ref>
* [[सैस (स्टाइलशीट भाषा)]]
* [[सैस (स्टाइलशीट भाषा)|सैस (स्टाइलशीट लैंग्वेज )]]
* [[स्टाइलस (स्टाइलशीट भाषा)]]
* [[स्टाइलस (स्टाइलशीट भाषा)|स्टाइलस (स्टाइलशीट लैंग्वेज )]]
* [[वाईएएमएल]]
* [[वाईएएमएल]]
* पग (पूर्व में जेड),  
* पग (पूर्व में जेड),  

Revision as of 17:07, 18 July 2023

एक कंप्यूटर प्रोग्रामिंग लैंग्वेज को सिंटैक्स के ऑफ-साइड नियम का पालन करने के लिए कहा जाता है, यदि उस लैंग्वेज में ब्लॉक उनके इंडेंटेशन द्वारा व्यक्त किए जाता हैं। इस शब्द का प्रयोग पीटर लैंडिन ने संभवतः फ़ुटबॉल के ऑफ़साइड नियम पर विचारशीलता के लिए एक मज़ाक के रूप में किया था। इसके विपरीत, फ्री-फॉर्म लैंग्वेजो, विशेष रूप से कर्ली-कोष्ठक प्रोग्रामिंग लैंग्वेजो के साथ, इंडेंटेशन का कोई गणनात्मक अर्थ नहीं होता है और इंडेंटेशन की शैली केवल कोडिंग संबंधी सामग्री और फॉर्मेटिंग के रूप में संदर्भित होते हैं। साथ ही, ऑफ-साइड-नियम लैंग्वेजो को भी महत्वपूर्ण इंडेंटेशन वाली लैंग्वेजो के रूप में वर्णित किया जाता है।

परिभाषा

पीटर लैंडिन ने अपने 1966 के लेख अगली 700 प्रोग्रामिंग लैंग्वेज एँ में ऑफ-साइड नियम को इस प्रकार परिभाषित किया: पिछली पंक्ति पर पहले ऐसे टोकन के बाईं ओर कोई भी गैर-व्हाट्सएप टोकन एक नई घोषणा का प्रारंभ माना जाता है।[1]


कोड उदाहरण

निम्नलिखित एक पायथन में इंडेंटेशन ब्लॉक का उदाहरण है: कोलन पायथनलैंग्वेज की सुविधाओं में से एक हैं जो पठनीयता के लिए होते हैं; वे ऑफ-साइड नियम को लागू करने के लिए आवश्यक नहीं होते।

पायथन में, यह नियम घोषणाओं की सीमाएं परिभाषित करने के अतिरिक्त कथन की सीमाएं परिभाषित करने के लिए लागू होता है।

def is_even(a: int) -> bool:
    """Determine whether number 'a' is even."""
    if a % 2 == 0:
        print('Even!')
        return True
    print('Odd!')
    return False

पायथन कोष्ठक के भीतर ऑफ-साइड नियम को निलंबित करता है। कोष्ठक के भीतर का एक कथन अपने कोष्ठक के मेल करने तक चलता रहता है।

{
    "this": True,
    "that": False,
    "them": [1, 2,
3, 4, 5, 
6, 7, 8,
9, 10, 11, 12]
}

इस शब्दकोष में, कुंजी इंडेंटेशन के साथ हैं और एक सूची चार पंक्तियों में विभाजित है।

कार्यान्वयन

ऑफ-साइड नियम को शाब्दिक विश्लेषण चरण में लागू किया जा सकता है, जैसे Python में, जहां इंडेंटिंग को बढ़ाने पर लेक्सर आउटपुट में एक INDENT टोकन उत्पन्न होता है, और इंडेंटिंग को कम करने पर लेक्सर आउटपुट में एक DEDENT टोकन उत्पन्न होता है।.[2] ये टोकन ब्रेस ब्लॉक के खुलने वाले ब्रेस और बंद होने वाले ब्रेस के समानांतर होते हैं जो लैंग्वेज ओं में प्रयोग होती हैं और इसका अर्थ है कि वाक्य व्याकरण इस पर निर्भर नहीं करता है कि ब्रेस या इंडेंटेशन का उपयोग किया जाता है। यह आवश्यकता होती है कि लेक्सर स्थानांतरण स्तर को मेमोराइज़ करे, अर्थात् वर्तमान इंडेंट स्तर को संग्रह करे, और इसलिए यह परिवर्तन होने पर इंडेंटेशन में परिवर्तन का पता लगा सकता है, और इस प्रकार औपचारिक व्याकरण वाक्य व्याकरण से मुक्त नहीं होता है INDENT और DEDENT पिछले इंडेंट स्तर की संदर्भिक जानकारी पर निर्भर करता है।

विकल्प

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

लिस्प और अन्य एस-अभिव्यक्ति-आधारित लैंग्वेज एं कथनों को अभिव्यक्तियों से अलग नहीं करती हैं, और कोष्ठक लैंग्वेज के भीतर सभी कथनों के सीमा को नियंत्रित करने के लिए पर्याप्त हैं। घुंघराले कोष्ठक लैंग्वेज ओं की तरह, रिक्त स्थान को अधिकतर पाठक द्वारा अनदेखा कर दिया जाता है। व्हाईटस्पेस का उपयोग टोकन को अलग करने के लिए किया जाता है।[3] लिस्प कोड की स्पष्ट संरचना मानव पाठकों के लिए एक दृश्य संकेत बनाने के लिए स्वचालित इंडेंटिंग की अनुमति देती है।

कुछ प्रोग्रामिंग लैंग्वेज ओं में प्रत्येक ब्लॉक की शुरुआत और समाप्ति के लिए स्पष्ट कीवर्ड उपयोग किए जाते हैं। इस तरीके से कोड ब्लॉक की सीमाओं की परिलैंग्वेज में स्पष्टता और असंदिग्धता प्रदान करता है। ALGOL 60 और उसके वंशावली पास्कल में ब्लॉक begin और "end कीवर्ड के बीच आते हैं। यह सिन्टेक्स यह सुनिश्चित करता है कि प्रत्येक ब्लॉक का प्रारंभ और समाप्ति स्पष्ट रूप से उल्लिखित होती है। यद्यपि प्रास्कल में इंडेंटेशन महत्वपूर्ण नहीं है, परंतु न्यूलाइन का उपयोग योग्यतात्मक हो सकता है। BASICऔर फोरट्रान में, ब्लॉक का प्रारंभ ब्लॉक के नाम के साथ होती है (जैसे IF) और ब्लॉक के नाम के पहले "end" लगाया जाता है (जैसे "END IF")। फोरट्रान में प्रत्येक एक ब्लॉक का अपना स्वयं का नाम हो सकता है, जो लंबे कोड में और अधिक स्पष्टता जोड़ता है। ALGOL 60 और बोर्न शेल (sh, और bash) में, ब्लॉक की समाप्ति सामान्यतः पलटकर लिखे गए ब्लॉक के नाम द्वारा दी जाती है। उदाहरण के लिए, बोर्न शेल में स्विच कथन case" से प्रारंभ होता है और "esac" तक चलता है। इसी तरह, ALGOL 60 में if...then...[elif...[else...]]fi और बैश में "for...do...od" जैसी शर्ताधारी वाक्यांशों के द्वारा ब्लॉक का प्रारंभ और समाप्ति स्पष्टतः निर्दिष्ट की जाती है। ये स्पष्ट ब्लॉक निर्देशक ब्लॉक कोड को पठनीयता बढ़ाने में सहायक होते हैं और गलतियों के प्रति कम संवेदनशील बनाते हैं। विकाशक आसानी से प्रत्येक ब्लॉक की सीमाओं को पहचान सकते हैं, जो कोड की समझ और रखरखाव में सहायक हो सकते है।

इसका एक रोचक रूप में प्राकृतिक होने वाला रूपांतर मॉड्यूल-2 में देखा जाता है, जो एक पास्कल जैसी लैंग्वेज है जो एक और बहु-लाइन ब्लॉक के बीच का अंतर खत्म कर देती है। इससे एक्सेस करने वाले ब्लॉक के लिए ब्लॉक खोलने वाले टोकन ({ या BEGIN) को सभी के लिए छोड़ा जा सकता है, केवल ब्लॉक समाप्त करने वाले टोकन (} या END) की आवश्यकता होती है। इसके अतिरिक्त यह निलंबित एल्स को सुधारता है। उपयोग के लिए end टोकन को ब्लॉक के शेष इंडेंट स्तर पर रखना होता है, जो एक ब्लॉक संरचना को बहुत पठनीय बनाता है।

फोरट्रान के दृष्टिकोण से एक लाभ यह है कि यह लंबे, नेस्टेड या अन्यथा जटिल कोड की पठनीयता में सुधार करता है। एक आउटडेंट्स या समाप्ति ब्रैकेट्स का समूह केवल सांद्रत्यपूर्ण संकेत उपलब्ध कराता है कि कौन से ब्लॉक बंद हो रहे हैं, जिससे पीछे जाना और निलंबित के समय अधिक सतर्कता की आवश्यकता होती है। इसके अतिरिक्त, end-जैसे कीवर्ड्स के लिए सफ्फिक्स की अनुमति देने वाली लैंग्वेज एं इस तरह की संकेतों को और बेहतर बनाती हैं, जैसे continue और continue for x। यद्यपि, आधुनिक स्रोत कोड संपादक प्रायः विजुअल संकेतक, जैसे हाइलाइटिंग सिंटेक्स, और कोड फोल्डिंग जैसी विशेषताएँ प्रदान करते हैं, जो इन दुष्प्रभावों के साथ मदद करते हैं।

उत्पादकता

स्काला लैंग्वेज में, प्रारंभिक संस्करणों में कर्वी ब्रेसेज को ही अनुमति दी जाती थी। स्काला 3 ने एक विकल्प जोड़ा है जिससे ब्लॉक को संरचित करने के लिए इंडेंटिंग का उपयोग किया जा सकता है। डिज़ाइनर मार्टिन ओडर्स्की ने कहा है कि इससे कुल में उत्पादकता 10% तक बढ़ जाती है, यह स्काला 3 में प्रस्तुत की गई सबसे उत्पादक बदलाव होता है, और इसके उपयोग की सलाह दी जाती है।


ऑफ-साइड नियम लैंग्वेज एँ

प्रोग्रामिंग लैंग्वेज एँ

अन्य लैंग्वेज एँ

यह भी देखें

संदर्भ

  1. Landin, P. J. (March 1966). "The next 700 programming languages" (PDF). Communications of the ACM. 9 (3): 157–166. doi:10.1145/365230.365257. S2CID 13409665.
  2. Python Documentation, 2. Lexical analysis: 2.1.8. Indentation
  3. "CLHS: Section 2.1.4.7".
  4. Syme, Don. "Detailed Release Notes for the F# May 2009 CTP Update and Visual Studio 2010 Beta1 releases". Archived from the original on 2019-01-21.
  5. The Haskell Report – Layout
  6. MoonScript, a language that compiles to Lua
  7. MoonScript 0.5.0 – Language Guide
  8. reStructuredText Markup Specification – Indentation