ऑफ-साइड नियम
This article needs additional citations for verification. (December 2011) (Learn how and when to remove this template message) |
कहा जाता है कि एक कंप्यूटर प्रोग्रामिंग भाषा सिंटेक्स (प्रोग्रामिंग भाषाओं) के ऑफ-साइड नियम का पालन करती है यदि उस भाषा में ब्लॉक (प्रोग्रामिंग) को उनकी इंडेंट शैली द्वारा व्यक्त किया जाता है।[1][2] यह शब्द पीटर लैंडिन द्वारा गढ़ा गया था, संभवतः फ़ुटबॉल संघ में ऑफ़साइड (एसोसिएशन फ़ुटबॉल) नियम पर एक वाक्य के रूप में। इसकी तुलना फ्री-फॉर्म भाषाओं से की जाती है, विशेष रूप से घुंघराले-ब्रैकेट प्रोग्रामिंग भाषाओं में, जहां इंडेंटेशन का कोई कम्प्यूटेशनल अर्थ नहीं होता है और इंडेंट शैली केवल कोडिंग सम्मेलनों और स्वरूपण का मामला है। ऑफ-साइड-रूल भाषाओं को भी महत्वपूर्ण इंडेंटेशन के रूप में वर्णित किया गया है।
परिभाषा
पीटर लैंडिन ने अपने 1966 के लेख अगली 700 प्रोग्रामिंग भाषाएँ में ऑफ-साइड नियम को इस प्रकार परिभाषित किया: पिछली पंक्ति पर पहले ऐसे टोकन के बाईं ओर कोई भी गैर-व्हाट्सएप टोकन एक नई घोषणा की शुरुआत के रूप में लिया जाता है।[3]
कोड उदाहरण
निम्नलिखित पायथन (प्रोग्रामिंग भाषा) में इंडेंटेशन ब्लॉक का एक उदाहरण है। पठनीयता के लिए कोलन पायथन भाषा सिंटैक्स का हिस्सा हैं; ऑफ-साइड नियम को लागू करने के लिए उनकी आवश्यकता नहीं है।
पायथन में, नियम को घोषणाओं के बजाय बयानों की सीमाओं को परिभाषित करने के लिए लिया जाता है।
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]
}
इस सहयोगी सरणी में, कुंजियाँ इंडेंट की जाती हैं, और एक सूची चार पंक्तियों के बीच विभाजित होती है।
कार्यान्वयन
ऑफ-साइड नियम को लेक्सिकल विश्लेषण चरण में लागू किया जा सकता है, जैसे कि पायथन (प्रोग्रामिंग भाषा) में, जहां इंडेंटिंग बढ़ाने से लेक्सर आउटपुट होता है INDENT
टोकन, और इंडेंटिंग को कम करने से लेक्सर आउटपुट होता है DEDENT
टोकन.[4] ये टोकन शुरुआती ब्रेस के अनुरूप हैं {
और समापन ब्रेस }
उन भाषाओं में जो ब्लॉक के लिए ब्रेसिज़ का उपयोग करते हैं, और इसका मतलब है कि वाक्यांश व्याकरण इस पर निर्भर नहीं करता है कि ब्रेसिज़ या इंडेंटेशन का उपयोग किया जाता है या नहीं। इसके लिए आवश्यक है कि लेक्सर स्थिति, अर्थात् वर्तमान इंडेंट स्तर को बनाए रखे, और इस प्रकार जब यह बदलता है तो इंडेंटेशन में परिवर्तन का पता लगा सकता है, और इस प्रकार लेक्सिकल औपचारिक व्याकरण संदर्भ-मुक्त व्याकरण नहीं है | संदर्भ-मुक्त: INDENT
और DEDENT
पूर्व इंडेंट स्तर की प्रासंगिक जानकारी पर निर्भर करें।
विकल्प
इंडेंटिंग द्वारा ब्लॉकों को परिसीमित करने का प्राथमिक विकल्प, भाषा सी (प्रोग्रामिंग भाषा) के व्यापक उपयोग और प्रभाव से लोकप्रिय हुआ, व्हाइटस्पेस वर्णों को अनदेखा करना और स्पष्ट रूप से घुंघराले ब्रैकेट के साथ ब्लॉक को चिह्नित करना है (यानी, {
और }
) या कोई अन्य सीमांकक। हालांकि यह अधिक स्वरूपण स्वतंत्रता की अनुमति देता है - एक डेवलपर नियंत्रण प्रवाह #अगले पुनरावृत्ति के साथ निरंतरता जैसे कोड के छोटे टुकड़ों को इंडेंट नहीं करने का विकल्प चुन सकता है - लापरवाही से इंडेंट किया गया कोड पाठक को भटका सकता है, जैसे कि असफल हो जाओ बग।
लिस्प (प्रोग्रामिंग भाषा) और अन्य एस-अभिव्यक्ति-आधारित भाषाएं बयानों को अभिव्यक्तियों से अलग नहीं करती हैं, और कोष्ठक भाषा के भीतर सभी बयानों के दायरे को नियंत्रित करने के लिए पर्याप्त हैं। घुंघराले ब्रैकेट भाषाओं की तरह, रिक्त स्थान को अधिकतर पाठक (यानी, रीड फ़ंक्शन) द्वारा अनदेखा कर दिया जाता है। व्हाईटस्पेस का उपयोग टोकन को अलग करने के लिए किया जाता है।[5] लिस्प कोड की स्पष्ट संरचना मानव पाठकों के लिए एक दृश्य संकेत बनाने के लिए स्वचालित इंडेंटिंग की अनुमति देती है।
एक अन्य विकल्प यह है कि प्रत्येक ब्लॉक स्पष्ट कीवर्ड के साथ शुरू और समाप्त हो। उदाहरण के लिए, ALGOL 60 और इसके वंशज पास्कल (प्रोग्रामिंग भाषा) में, ब्लॉक आरक्षित शब्द से शुरू होते हैं begin
और कीवर्ड के साथ समाप्त करें end
. कुछ भाषाओं में (लेकिन पास्कल नहीं), इसका मतलब है कि नई पंक्तियाँ महत्वपूर्ण हैं[citation needed] (घुंघराले ब्रेस भाषाओं के विपरीत), लेकिन इंडेंटेशन नहीं है। बुनियादी और फोरट्रान में, ब्लॉक ब्लॉक नाम से शुरू होते हैं (जैसे 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 में पेश किया गया सबसे अधिक उत्पादक परिवर्तन साबित होता है, और इसके उपयोग की सलाह देता है।[6]
ऑफ-साइड नियम भाषाएँ
प्रोग्रामिंग भाषाएँ
- एबीसी (प्रोग्रामिंग भाषा)
- बू (प्रोग्रामिंग भाषा)
- बडीस्क्रिप्ट
- कोबरा (प्रोग्रामिंग भाषा)
- कॉफ़ीस्क्रिप्ट
- जुटना
- करी (प्रोग्रामिंग भाषा)
- एल्म (प्रोग्रामिंग भाषा)
- एफ शार्प (प्रोग्रामिंग भाषा)|एफ# (प्रारंभिक संस्करणों में, जब
#light
निर्दिष्ट किया जाता है; बाद के संस्करणों में जब#light "off"
क्या नहीं है[7]) - जिन्न (प्रोग्रामिंग भाषा)
- गोडोट_(गेम_इंजन)#जीडीस्क्रिप्ट|जीडीस्क्रिप्ट (गोडोट इंजन)
- हास्केल (प्रोग्रामिंग भाषा)[8] (केवल
where
,let
,do
, याcase ... of
खंड जब ब्रेसिज़ छोड़े जाते हैं) - सूचित करें 7
- ISWIM, वह अमूर्त भाषा जिसने नियम प्रस्तुत किया
- लाइवस्क्रिप्ट (प्रोग्रामिंग भाषा)
- मिरांडा (प्रोग्रामिंग भाषा)
- मूनस्क्रिप्ट[9][10]
- नेमर्ले, वैकल्पिक मोड
- निम (प्रोग्रामिंग भाषा)
- अवसर (प्रोग्रामिंग भाषा)
- प्रोमल
- पायथन (प्रोग्रामिंग भाषा)
- स्काला (प्रोग्रामिंग भाषा), वैकल्पिक मोड
- योजना (प्रोग्रामिंग भाषा), कार्यान्वयन के लिए कई योजना अनुरोधों में से एक का उपयोग करते समय, जिनमें से नवीनतम है SRFI 119
- स्पिन (प्रोग्रामिंग भाषा)
- वोमा
- एक्सएल (प्रोग्रामिंग भाषा)
अन्य भाषाएँ
- जांघ
- मेक (सॉफ़्टवेयर) (बिल्ड टूल: टैब मेक रूल्स में कमांड पेश करते हैं)
- पुनः संरचित पाठ[11]
- सैस (स्टाइलशीट भाषा)
- स्टाइलस (स्टाइलशीट भाषा)
- वाईएएमएल
- पग (पूर्व में जेड), वेब टेम्पलेट इंजनों की तुलना देखें
यह भी देखें
- Python syntax and semantics § Indentation
- सुन्दरमुद्रण
संदर्भ
- ↑ Hutton, G. (December 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.
- ↑ Turner, D.A. (August 13, 2013). "Some History of Functional Programming Languages (Invited Talk)". In Loidl, Hans Wolfgang; Peña, Ricardo (eds.). Trends in Functional Programming: 13th International Symposium, TFP 2012, St Andrews, UK, June 12–14, 2012, Revised Selected Papers. Springer. p. 8. ISBN 9783642404474. Retrieved September 3, 2015.
- ↑ 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".
- ↑ Odersky, Martin (June 17, 2020). Martin Odersky: A Scala 3 Update (video) (in English). YouTube. Event occurs at 36:35–45:08. Archived from the original on December 21, 2021. Retrieved April 25, 2021.
- ↑ Syme, Don. "Detailed Release Notes for the F# May 2009 CTP Update and Visual Studio 2010 Beta1 releases". Archived from the original on January 21, 2019.
- ↑ The Haskell Report – Layout
- ↑ MoonScript, a language that compiles to Lua
- ↑ MoonScript 0.5.0 – Language Guide
- ↑ reStructuredText Markup Specification – Indentation