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

From Vigyanwiki
Line 55: Line 55:


==विकल्प==
==विकल्प==
इंडेंटिंग द्वारा ब्लॉकों को परिसीमित करने का प्राथमिक विकल्प, भाषा [[सी (प्रोग्रामिंग भाषा)]] के व्यापक उपयोग और प्रभाव से लोकप्रिय हुआ, व्हाइटस्पेस वर्णों को अनदेखा करना और स्पष्ट रूप से घुंघराले कोष्ठक के साथ ब्लॉक को चिह्नित करना है (यानी, <code>{</code> और <code>}</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]] और इसके वंशज [[पास्कल (प्रोग्रामिंग भाषा)]] में, ब्लॉक [[आरक्षित शब्द]] से शुरू होते हैं <code>begin</code> और कीवर्ड के साथ समाप्त करें <code>end</code>. कुछ भाषाओं में (लेकिन पास्कल नहीं), इसका मतलब है कि नई पंक्तियाँ महत्वपूर्ण हैं{{citation needed|date=June 2012}} (घुंघराले ब्रेस भाषाओं के विपरीत), लेकिन इंडेंटेशन नहीं है। [[ बुनियादी ]] और [[फोरट्रान]] में, ब्लॉक ब्लॉक नाम से शुरू होते हैं (जैसे <code>IF</code>) और ब्लॉक नाम के साथ समाप्त करें <code>END</code> (जैसे, <code>END IF</code>). फोरट्रान में, प्रत्येक ब्लॉक का अपना विशिष्ट ब्लॉक नाम भी हो सकता है, जो लंबे कोड में स्पष्टता का एक और स्तर जोड़ता है। [[ALGOL 68]] और [[बॉर्न शैल]] (sh, और [[बैश (यूनिक्स शेल)]]) समान हैं, लेकिन ब्लॉक का अंत आमतौर पर पीछे की ओर लिखे गए ब्लॉक के नाम से दिया जाता है (उदाहरण के लिए, <code>case</code> एक [[ स्विच कथन ]] प्रारंभ करता है और यह मिलान तक फैला रहता है <code>esac</code>; इसी तरह [[सशर्त (कंप्यूटर प्रोग्रामिंग)]] <code>if</code>...<code>then</code>...[<code>elif</code>...[<code>else</code>...<code>fi</code> या लूप के लिए <code>for</code>...<code>do</code>...<code>od</code> ALGOL68 में या <code>for</code>...<code>do</code>...<code>done</code> बैश में)।
एक अन्य विकल्प यह है कि प्रत्येक ब्लॉक स्पष्ट कीवर्ड के साथ प्रारंभ और समाप्त हो। उदाहरण के लिए, [[ALGOL 60]] और इसके उत्तराधिकारी [[पास्कल (प्रोग्रामिंग भाषा)|पास्कल]] में, ब्लॉक, [[आरक्षित शब्द]] <code>begin</code>से प्रारंभ होते हैं और<code>end</code> कीवर्ड के साथ समाप्त होते है । कुछ भाषाओं में (परंतु पास्कल नहीं), इसका तात्पर्य है कि नई पंक्तियाँ तो महत्वपूर्ण हैं, परंतु इंडेंटेशन नहीं है। [[ बुनियादी ]] और [[फोरट्रान]] में, ब्लॉक ब्लॉक नाम से प्रारंभ  होते हैं (जैसे <code>IF</code>) और ब्लॉक नाम के साथ समाप्त करें <code>END</code> (जैसे, <code>END IF</code>). फोरट्रान में, प्रत्येक ब्लॉक का अपना विशिष्ट ब्लॉक नाम भी हो सकता है, जो लंबे कोड में स्पष्टता का एक और स्तर जोड़ता है। [[ALGOL 68]] और [[बॉर्न शैल]] (sh, और [[बैश (यूनिक्स शेल)]]) समान हैं, लेकिन ब्लॉक का अंत आमतौर पर पीछे की ओर लिखे गए ब्लॉक के नाम से दिया जाता है (उदाहरण के लिए, <code>case</code> एक [[ स्विच कथन ]] प्रारंभ करता है और यह मिलान तक फैला रहता है <code>esac</code>; इसी तरह [[सशर्त (कंप्यूटर प्रोग्रामिंग)]] <code>if</code>...<code>then</code>...[<code>elif</code>...[<code>else</code>...<code>fi</code> या लूप के लिए <code>for</code>...<code>do</code>...<code>od</code> ALGOL68 में या <code>for</code>...<code>do</code>...<code>done</code> बैश में)।


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

Revision as of 23:57, 17 July 2023

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

परिभाषा

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


कोड उदाहरण

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

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

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 टोकन उत्पन्न होता है।.[3] ये टोकन ब्रेस ब्लॉक के खुलने वाले ब्रेस और बंद होने वाले ब्रेस के समानांतर होते हैं जो भाषाओं में प्रयोग होती हैं और इसका अर्थ है कि वाक्य व्याकरण इस पर निर्भर नहीं करता है कि ब्रेस या इंडेंटेशन का उपयोग किया जाता है। यह आवश्यकता होती है कि लेक्सर स्थानांतरण स्तर को मेमोराइज़ करे, अर्थात् वर्तमान इंडेंट स्तर को संग्रह करे, और इसलिए यह परिवर्तन होने पर इंडेंटेशन में परिवर्तन का पता लगा सकता है, और इस प्रकार औपचारिक व्याकरण वाक्य व्याकरण से मुक्त नहीं होता है INDENT और DEDENT पिछले इंडेंट स्तर की संदर्भिक जानकारी पर निर्भर करता है।

विकल्प

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

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

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

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

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

उत्पादकता

स्काला भाषा (प्रोग्रामिंग भाषा) में, शुरुआती संस्करणों में केवल घुंघराले ब्रेसिज़ की अनुमति थी। स्काला 3 ने संरचना ब्लॉकों में इंडेंटिंग का उपयोग करने के लिए एक विकल्प जोड़ा। डिज़ाइनर मार्टिन ओडरस्की ने कहा कि इससे कुल मिलाकर उत्पादकता में 10% का सुधार होता है, यह स्काला 3 में पेश किया गया सबसे अधिक उत्पादक परिवर्तन साबित होता है, और इसके उपयोग की सलाह देता है।[5]


ऑफ-साइड नियम भाषाएँ

प्रोग्रामिंग भाषाएँ

अन्य भाषाएँ

यह भी देखें

संदर्भ

  1. Hutton, G. (Dec 6, 2012). "Parsing Using Combinators". In Davis, Kei; Hughes, John (eds.). Functional Programming: Proceedings of the 1989 Glasgow Workshop 21–23 August 1989, Fraserburgh, Scotland. Springer Science & Business Media. pp. 362–364. ISBN 9781447131663. Retrieved September 3, 2015.
  2. 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.
  3. Python Documentation, 2. Lexical analysis: 2.1.8. Indentation
  4. "CLHS: Section 2.1.4.7".
  5. Odersky, Martin (17 June 2020). Martin Odersky: A Scala 3 Update (video) (in English). YouTube. Event occurs at 36:35–45:08. Archived from the original on 2021-12-21. Retrieved 2021-04-25.
  6. 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.
  7. The Haskell Report – Layout
  8. MoonScript, a language that compiles to Lua
  9. MoonScript 0.5.0 – Language Guide
  10. reStructuredText Markup Specification – Indentation