ऑफ-साइड नियम

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

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

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

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

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

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

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

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

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

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

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

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

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

अन्य भाषाएँ

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

यह भी देखें

 * प्रिटीप्रिंट
 * प्रिटीप्रिंट