ऑफ-साइड नियम

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

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

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

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

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

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

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

एक अन्य विकल्प यह है कि प्रत्येक ब्लॉक स्पष्ट कीवर्ड के साथ शुरू और समाप्त हो। उदाहरण के लिए, ALGOL 60 और इसके वंशज पास्कल (प्रोग्रामिंग भाषा) में, ब्लॉक आरक्षित शब्द से शुरू होते हैं  और कीवर्ड के साथ समाप्त करें. कुछ भाषाओं में (लेकिन पास्कल नहीं), इसका मतलब है कि नई पंक्तियाँ महत्वपूर्ण हैं (घुंघराले ब्रेस भाषाओं के विपरीत), लेकिन इंडेंटेशन नहीं है। बुनियादी  और फोरट्रान में, ब्लॉक ब्लॉक नाम से शुरू होते हैं (जैसे  ) और ब्लॉक नाम के साथ समाप्त करें   (जैसे,  ). फोरट्रान में, प्रत्येक ब्लॉक का अपना विशिष्ट ब्लॉक नाम भी हो सकता है, जो लंबे कोड में स्पष्टता का एक और स्तर जोड़ता है। ALGOL 68 और बॉर्न शैल (sh, और बैश (यूनिक्स शेल)) समान हैं, लेकिन ब्लॉक का अंत आमतौर पर पीछे की ओर लिखे गए ब्लॉक के नाम से दिया जाता है (उदाहरण के लिए,  एक  स्विच कथन  प्रारंभ करता है और यह मिलान तक फैला रहता है  ; इसी तरह सशर्त (कंप्यूटर प्रोग्रामिंग)  ... ...[ ...[ ...  या लूप के लिए  ... ...  ALGOL68 में या  ... ...  बैश में)।

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

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

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

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

 * एबीसी (प्रोग्रामिंग भाषा)
 * बू (प्रोग्रामिंग भाषा)
 * बडीस्क्रिप्ट
 * कोबरा (प्रोग्रामिंग भाषा)
 * कॉफ़ीस्क्रिप्ट
 * जुटना
 * करी (प्रोग्रामिंग भाषा)
 * एल्म (प्रोग्रामिंग भाषा)
 * एफ शार्प (प्रोग्रामिंग भाषा)|एफ# (प्रारंभिक संस्करणों में, जब  निर्दिष्ट किया जाता है; बाद के संस्करणों में जब   क्या नहीं है )
 * जिन्न (प्रोग्रामिंग भाषा)
 * गोडोट_(गेम_इंजन)#जीडीस्क्रिप्ट|जीडीस्क्रिप्ट (गोडोट इंजन)
 * हास्केल (प्रोग्रामिंग भाषा) (केवल,  ,  , या   खंड जब ब्रेसिज़ छोड़े जाते हैं)
 * सूचित करें 7
 * ISWIM, वह अमूर्त भाषा जिसने नियम प्रस्तुत किया
 * लाइवस्क्रिप्ट (प्रोग्रामिंग भाषा)
 * मिरांडा (प्रोग्रामिंग भाषा)
 * मूनस्क्रिप्ट
 * नेमर्ले, वैकल्पिक मोड
 * निम (प्रोग्रामिंग भाषा)
 * अवसर (प्रोग्रामिंग भाषा)
 * प्रोमल
 * पायथन (प्रोग्रामिंग भाषा)
 * स्काला (प्रोग्रामिंग भाषा), वैकल्पिक मोड
 * योजना (प्रोग्रामिंग भाषा), कार्यान्वयन के लिए कई योजना अनुरोधों में से एक का उपयोग करते समय, जिनमें से नवीनतम है SRFI 119
 * स्पिन (प्रोग्रामिंग भाषा)
 * वोमा
 * एक्सएल (प्रोग्रामिंग भाषा)

अन्य भाषाएँ

 * जांघ
 * मेक (सॉफ़्टवेयर) (बिल्ड टूल: टैब मेक रूल्स में कमांड पेश करते हैं)
 * पुनः संरचित पाठ
 * सैस (स्टाइलशीट भाषा)
 * स्टाइलस (स्टाइलशीट भाषा)
 * वाईएएमएल
 * पग (पूर्व में जेड), वेब टेम्पलेट इंजनों की तुलना देखें

यह भी देखें

 * सुन्दरमुद्रण
 * सुन्दरमुद्रण