ऑफ-साइड नियम
एक कंप्यूटर प्रोग्रामिंग लैंग्वेज को सिंटैक्स के ऑफ-साइड नियम का पालन करने के लिए कहा जाता है, यदि उस लैंग्वेज में ब्लॉक उनके इंडेंटेशन द्वारा व्यक्त किए जाता हैं। इस शब्द का प्रयोग पीटर लैंडिन ने संभवतः फ़ुटबॉल के ऑफ़साइड नियम पर विचारशीलता के लिए एक मज़ाक के रूप में किया था। इसके विपरीत, फ्री-फॉर्म लैंग्वेजो, विशेष रूप से कर्ली-कोष्ठक प्रोग्रामिंग लैंग्वेजो के साथ, इंडेंटेशन का कोई गणनात्मक अर्थ नहीं होता है और इंडेंटेशन की शैली केवल कोडिंग संबंधी सामग्री और फॉर्मेटिंग के रूप में संदर्भित होते हैं। साथ ही, ऑफ-साइड-नियम लैंग्वेजो को भी महत्वपूर्ण इंडेंटेशन वाली लैंग्वेजो के रूप में वर्णित किया जाता है।
परिभाषा
पीटर लैंडिन ने अपने 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 में प्रस्तुत की गई सबसे उत्पादक बदलाव होता है, और इसके उपयोग की सलाह दी जाती है।
ऑफ-साइड नियम लैंग्वेज एँ
प्रोग्रामिंग लैंग्वेज एँ
- एबीसी (प्रोग्रामिंग लैंग्वेज )
- बू (प्रोग्रामिंग लैंग्वेज )
- बडीस्क्रिप्ट
- कोबरा (प्रोग्रामिंग लैंग्वेज )
- कॉफ़ीस्क्रिप्ट
- जुटना
- करी (प्रोग्रामिंग लैंग्वेज )
- एल्म (प्रोग्रामिंग लैंग्वेज )
- F (प्रारंभिक संस्करणों में, जब
#light
निर्दिष्ट किया जाता है; बाद के संस्करणों में जब#light "off"
नहीं होता है[4]) - जिन्न (प्रोग्रामिंग लैंग्वेज )
- जीडीस्क्रिप्ट (गोडोट इंजन)
- हास्केल (प्रोग्रामिंग लैंग्वेज )[5] (केवल
where
,let
,do
, याcase ... of
खंड जब ब्रेसिज़ छोड़े जाते हैं) - सूचित करें 7
- आईएसडब्ल्यूआईएम, वह अमूर्त लैंग्वेज जिसने नियम प्रस्तुत किया
- लाइवस्क्रिप्ट (प्रोग्रामिंग लैंग्वेज )
- मिरांडा (प्रोग्रामिंग लैंग्वेज )
- मूनस्क्रिप्ट[6][7]
- नेमर्ले, वैकल्पिक मोड
- निम (प्रोग्रामिंग लैंग्वेज )
- अवसर (प्रोग्रामिंग लैंग्वेज )
- प्रोमल
- पायथन (प्रोग्रामिंग लैंग्वेज )
- स्काला (प्रोग्रामिंग लैंग्वेज ), वैकल्पिक मोड
- योजना (प्रोग्रामिंग लैंग्वेज ), कार्यान्वयन के लिए कई योजना अनुरोधों में से एक का उपयोग करते समय, जिनमें से नवीनतम है
- स्पिन (प्रोग्रामिंग लैंग्वेज )
- वोमा
- एक्सएल (प्रोग्रामिंग लैंग्वेज )
अन्य लैंग्वेज एँ
- जांघ
- मेक (सॉफ़्टवेयर)
- पुनः संरचित पाठ[8]
- सैस (स्टाइलशीट लैंग्वेज )
- स्टाइलस (स्टाइलशीट लैंग्वेज )
- वाईएएमएल
- पग (पूर्व में जेड),
यह भी देखें
- पायथन सिंटैक्स और शब्दार्थ § इंडेंटेशन
- प्रिटीप्रिंट
संदर्भ
- ↑ 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.
- ↑ Python Documentation, 2. Lexical analysis: 2.1.8. Indentation
- ↑ "CLHS: Section 2.1.4.7".
- ↑ 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.
- ↑ The Haskell Report – Layout
- ↑ MoonScript, a language that compiles to Lua
- ↑ MoonScript 0.5.0 – Language Guide
- ↑ reStructuredText Markup Specification – Indentation