ऑफ-साइड नियम

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

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

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

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

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

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

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

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

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

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

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

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

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

अन्य भाषाएँ

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

यह भी देखें

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