अधिकांश प्रोग्रामिंग भाषाओं में टिप्पणियों को ब्लॉक क्यों नहीं किया जाता है?


18

कुछ लोग करते हैं, लेकिन उनमें से कोई भी लोकप्रिय नहीं है जहाँ तक मुझे पता है। क्या नेस्टिंग टिप्पणियों के बारे में कुछ बुरा है?

मैं जिस छोटी सी भाषा पर काम कर रहा हूं, उसमें घोंसला टिप्पणी करने की योजना है, लेकिन मैं यह जानना चाहूंगा कि क्या यह एक बुरा विचार है।


कुछ उत्तर दें: ओह, इसका मतलब =) मैं पूरी तरह से नेस्टेड ब्लॉक कमेंट्स कर रहा हूं; हालांकि मेरे पास एक अलग लेक्सिंग चरण है, यह वर्णित एसके-तर्क को सीमित करने वाला नहीं है।

@Vuntic: यदि आपके पास एक अलग लेक्सिंग चरण है जो नियमित अभिव्यक्ति की तुलना में अधिक जटिल सामान का उपयोग करता है, तो आपके पास प्रदर्शन समस्याएँ हो सकती हैं। डीएएफए को लागू करके आरईएस तेज और उपयोग में आसान है।
डेविड थॉर्नले

यह घोंसले के शिकार की अनुमति नहीं देने से पहले अधिक त्रुटियों को पकड़ता है

4
@ डेविड: ... बिल्कुल नहीं। यह वास्तव में बहुत तेज है।
अमारा

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

जवाबों:


6

एक बात का अभी तक किसी ने उल्लेख नहीं किया है, इसलिए मैं इसका उल्लेख करूंगा: टिप्पणी करने की इच्छा अक्सर इंगित करती है कि प्रोग्रामर डूइंग इट गलत है।

पहले, मान लें कि प्रोग्रामर को केवल "नेस्टिंग" या "नेस्टिंग नहीं" दिखाई देता है, जब प्रोग्रामर कुछ इस तरह से संरचनात्मक रूप से लिखता है:

do_something();
/* comment /* nested comment */ more comment */
do_something_else();

अब, ऐसी बात व्यवहार में कब आती है? निश्चित रूप से प्रोग्रामर नेस्टेड टिप्पणी लिखने वाला नहीं है जो कि वास्तव में उपरोक्त स्निपेट जैसा दिखता है! नहीं, व्यवहार में जब हम टिप्पणी करते हैं (या चाहें तो हम उन्हें घोंसला बना सकते हैं), ऐसा इसलिए है क्योंकि हम कुछ इस तरह लिखना चाहते हैं:

do_something();  /* do a thing */
/* [ajo] 2017-12-03 this turned out to be unnecessary
do_something_else(); /* do another thing */
*/

और यह BAD है। यह एक पैटर्न नहीं है जिसे हम (भाषा डिजाइनर के रूप में) प्रोत्साहित करना चाहते हैं! उपरोक्त स्निपेट लिखने का सही तरीका है:

do_something();  /* do a thing */

वह "गलत" कोड, वह झूठी शुरुआत या जो कुछ भी था, कोडबेस में नहीं है। यह स्रोत नियंत्रण इतिहास में, सबसे अच्छे रूप में है। आदर्श रूप में, आपने कभी भी सही के साथ शुरू करने के लिए गलत कोड नहीं लिखा होगा? और अगर गलत कोड वहाँ एक उद्देश्य की सेवा कर रहा था, तो चेतावनी बनाए रखने वाले किसी कारण के लिए इसे बहाल नहीं करने के लिए, ठीक है, कि शायद एक अच्छी तरह से लिखा और जानबूझकर कोड टिप्पणी के लिए एक नौकरी है केवल कुछ पुराने कोड को छोड़कर "एक्स नहीं करते" को व्यक्त करने की कोशिश कर रहा है, लेकिन एक्स ने टिप्पणी की, लोगों को एक्स करने से रोकने के लिए सबसे पठनीय या प्रभावी तरीका नहीं है।

यह सब अंगूठे के एक सरल नियम से उबलता है जिसे आपने पहले सुना होगा: कोड बाहर टिप्पणी न करें। (इस वाक्यांश के लिए खोज करने से समझौते में बहुत सारी राय बदल जाएगी ।)

इससे पहले कि आप पूछें: हाँ, C, C #, और C ++ जैसी भाषाएं प्रोग्रामर को कोड के बड़े ब्लॉक को "कमेंट आउट" करने के लिए पहले से ही एक और टूल देती हैं #if 0:। लेकिन यह सी प्रीप्रोसेसर का सिर्फ एक विशेष अनुप्रयोग है, जो अपने आप में एक बड़ा और उपयोगी उपकरण है। यह वास्तव में अत्यंत कठिन और विशेष भाषा के लिए सशर्त संकलन का समर्थन करने के लिए #ifऔर अभी तक समर्थन नहीं करेगा #if 0


इसलिए, हमने स्थापित किया है कि नेस्टेड टिप्पणियां तभी प्रासंगिक हैं जब प्रोग्रामर कोड टिप्पणी कर रहा हो; और हमने स्थापित किया है (बहुत सारे अनुभवी प्रोग्रामर्स की आम सहमति के माध्यम से) जो कोड को कमेंट करते हैं वह एक बैड थिंग है।

सिओलोगिज्म को पूरा करने के लिए, हमें यह स्वीकार करना चाहिए कि भाषा डिजाइनरों को अच्छी चीजों को बढ़ावा देने और बुरी चीजों को हतोत्साहित करने में रुचि है (यह मानते हुए कि बाकी सभी समान हैं)।

नेस्टेड टिप्पणी के मामले में, और सब है बराबर - आप सुरक्षित रूप से अनदेखा कर सकते हैं कम मतदान जवाब है कि दावा है कि नेस्ट पार्सिंग /*किसी भी तरह पार्सर के लिए "मुश्किल" होगा। (नेस्टेड नस्टेड की /*तुलना में कठिन नहीं हैं (, जो कि दुनिया के हर पार्सर के बारे में पहले से ही संभालने की जरूरत है।)

तो, बाकी सभी समान होने चाहिए, क्या एक भाषा डिजाइनर को टिप्पणी करने में आसान बनाना चाहिए (यानी, कोड टिप्पणी करने के लिए), या मुश्किल? याद रखें कि कोड टिप्पणी करना एक बुरी बात है।

QED


पाद लेख। ध्यान दें कि यदि आप नेस्टेड टिप्पणियों की अनुमति नहीं देते हैं, तो

hello /* foo*/bar.txt */ world

एक भ्रामक "टिप्पणी" है - यह इसके बराबर है

hello bar.txt */ world

(जो एक वाक्यविन्यास त्रुटि की संभावना है)। लेकिन अगर आप कर नेस्टेड टिप्पणियों की अनुमति है, तो

hello /* foo/*.txt */ world

एक भ्रामक "टिप्पणी" है - यह इसके बराबर है

hello

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


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

@ग्रीनॉल्डमैन: अधिकांश भाषाओं में नेस्टेबल टिप्पणियां नहीं होती हैं, लेकिन उनके पास "कोड के एक ब्लॉक को हटाने" के लिए कुछ वास्तविक सुविधा होगी जो "एक टिप्पणी छोड़ें" सुविधा की तुलना में कम उपयोग की जाती है। C का #if DEADविहित और सबसे अच्छा डिज़ाइन किया गया उदाहरण है। कई भाषाओं में आप मृत कोड को इसके बराबर में लपेट सकते हैं if (DEAD)। और कई आईडीई में, आप वास्तव में डेड कोड को हटा सकते हैं और यदि आप चाहें तो इसे वापस पाने के लिए Ctrl + Z और / या संस्करण नियंत्रण पर भरोसा कर सकते हैं। एक टिप्पणी छोड़कर, डॉकस्ट्रिंग, जो भी, जिसका पाठ मृत कोड का एक गुच्छा है, अभी भी पठनीयता के लिए सबसे खराब विकल्प है।
क्क्सप्लसोन

11

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


3
मैं आजकल 'सबसे' पर असहमत होता। निश्चित रूप से यह पारंपरिक तरीका है, लेकिन मुझे पता है कि सी के लिए, ईडीजी प्रीप्रोसेसर, लेक्सिंग और पार्सिंग को जोड़ती है, और मुझे संदेह है कि जीसीसी और माइक्रोसॉफ्ट दोनों भी करते हैं। लाभ यह है कि यह आपको उन्हें अलग से लागू करने की अनुमति देता है यदि आपको आवश्यकता है।
एंड्रयू आइलेट

क्लैंग भी यही कर रहा है। लेकिन यह अभी भी मौजूदा लोकप्रिय भाषाओं के संकलन का एक छोटा सा हिस्सा है।
एसके-लॉजिक

@ नील बटरवर्थ, mcs, javac, gcc (yep, बैक-पैच को एक लेक्सर के रूप में देखें, लेकिन फिर भी यह एक समर्पित लेक्सिंग पास है), क्लैंग (gcc) (dcc) के समान, dmd, fpc, और कई, कई और अधिक।
एसके-लॉजिक

कोई भी गैर-तुच्छ संकलक के लिए उनके लेक्सिंग में नियमित अभिव्यक्ति का उपयोग नहीं कर रहा है।
नुओजी

@Nuoji - गैर-तुच्छ के लिए - निश्चित। लेकिन जो लोग फ्लेक्स और इसी तरह के उपकरणों पर भरोसा करते हैं।
तर्क

7

यह पूरी तरह से एक लेक्सर बनाने के लिए संभव है जो नेस्टेड टिप्पणियों को संभाल सकता है। जब यह व्हॉट्सएप खा रहा होता है, जब यह देखता है कि /*यह एक गहराई काउंटर को बढ़ा सकता है */, और जब यह देखता है तो इसे घटाता है , और जब गहराई शून्य होती है तो रोक देता है। उस ने कहा, मैंने कई पार्सर्स किए हैं, और घोंसले के लिए टिप्पणियों का एक अच्छा कारण कभी नहीं मिला।

यदि टिप्पणियां घोंसला बना सकती हैं, तो एक नकारात्मक पक्ष यह है कि उनके छोर असंतुलित होना आसान है, और जब तक आपके पास एक फैंसी संपादक नहीं है, तब तक यह आपके द्वारा ग्रहण किए गए कोड को अदृश्य रूप से छिपा सकता है।

टिप्पणियों का एक उल्टा है कि घोंसला कुछ इस तरह नहीं है:

/*
some code
more code
blah blah blah
/**/

जहाँ आप पहली पंक्ति को हटाकर या जोड़कर आसानी से कोड में टिप्पणी कर सकते हैं - एक १-पंक्ति संपादित करें। बेशक, अगर उस कोड में स्वयं एक टिप्पणी है, तो यह टूट जाएगा, जब तक कि आप C ++ शैली की //टिप्पणियों को भी वहां अनुमति नहीं देते । इसलिए मैं यही करता हूं।


1
//टिप्पणियाँ भी C99 शैली हैं।
JAB

वैकल्पिक रूप से, एक भाषा एक प्रारंभिक टिप्पणी निर्दिष्ट कर सकती है /*$token, जहां identifierकोई अल्फ़ान्यूमेरिक टोकन है, और टिप्पणी का अंत है token$*/। टोकनधारक के लिए कोड को शामिल करना अपेक्षाकृत सरल होगा, यह सत्यापित करने के लिए कि हर अंतिम-टिप्पणी चिह्न में उसके मिलान शुरू-टिप्पणी ब्लॉक के लिए उचित टोकन होता है।
सुपरकैट

5

चूंकि किसी और ने इसका उल्लेख नहीं किया था, इसलिए मैं कुछ भाषाओं को सूचीबद्ध करूंगा, जो नेस्टेड टिप्पणियों का समर्थन करती हैं: Rexx, Modula-2, Modula-3, Oberon। कठिनाई और गति के मुद्दों के बारे में यहां सभी शिकायतों के बावजूद, उनमें से किसी को भी कोई बड़ी समस्या नहीं है।


4
जिसमें मैं जोड़ता हूं: हास्केल, फ्रीज
इंगो

स्काला द्वारा भी समर्थन किया गया।
मैट आर

4

ब्लॉकिंग टिप्पणियों का एक अच्छा बिंदु यह है कि आप कोड के बड़े हिस्से को आसानी से टिप्पणी कर सकते हैं (अच्छी तरह से, लगभग, जब तक कि आपके पास एक स्ट्रिंग स्थिरांक में ब्लॉक टिप्पणी अंत अनुक्रम नहीं है)।

एक वैकल्पिक विधि लाइन कमेंट स्टार्ट सीक्वेंस के साथ लाइन का एक गुच्छा प्रस्तुत करना है यदि आपके पास एक संपादक है जो इसका समर्थन करता है।

हास्केल ने ब्लॉक टिप्पणी की है, लेकिन ज्यादातर लोग न तो नोटिस करते हैं और न ही इसकी शिकायत करते हैं। मुझे लगता है कि ऐसा इसलिए है क्योंकि लोगों को उम्मीद नहीं है कि नेस्टेड टिप्पणियां उनसे बचने की कोशिश करती हैं क्योंकि यह अन्य भाषाओं में एक शाब्दिक त्रुटि होगी।


3

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

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


1
"इसे हटाने की तुलना में एक सुविधा जोड़ने के लिए आसान" के लिए +1।
आर .. गिटहब स्टॉप हेल्पिंग ICE

3
एक बार जब आप नेस्टेड टिप्पणियों को अस्वीकार कर देते हैं तो आप उन्हें अनुमति नहीं दे सकते क्योंकि यह ऐसी टिप्पणियों को तोड़ देगा:/*/**/
RiaD

2

एक संभावित कारण यह है कि नेस्टेड टिप्पणियों को पार्सर द्वारा नियंत्रित किया जाना चाहिए, क्योंकि लेक्सर्स में आमतौर पर उपयोग किए जाने वाले नियमित अभिव्यक्तियों का स्वाद पुनरावृत्ति का समर्थन नहीं करता है। साधारण लोगों को लेक्सर द्वारा व्हॉट्सएप के रूप में समाप्त किया जा सकता है, इसलिए वे उस तरीके से लागू करने के लिए सरल हैं।


3
यह "स्वाद" नहीं है। शब्द "नियमित" नियमित अभिव्यक्ति में स्वाभाविक रूप से पुनरावृत्ति को बाहर करता है।
आर .. गिटहब स्टॉप हेल्पिंग ICE

3
@ आर: गणित में, निश्चित। लेकिन प्रोग्रामिंग में, हमारे पास ऐसी चीजें हैं जिन्हें हम regexes कहते हैं जो समर्थन पुनरावृत्ति करते हैं।
अमारा

सवाल यह है: यह भी एक मुद्दा है? अधिकांश भाषाओं में पहले से ही नेस्टिंग कोष्ठकों से निपटना पड़ता है। कुछ का नाम: लिस्प, सी, जावा, पायथन, रूबी, पर्ल।
थॉमस एडिंग

नेस्टेड कोष्ठक ठीक हैं, क्योंकि कोष्ठक के अंदर की चीजें बाहर के सामान के समान हैं: सामान्य टोकन। टिप्पणियों में, आपके पास टोकन नहीं हैं, आपके पास बस पाठ है। आपको प्रारंभ और अंत टिप्पणी टोकन से मिलान करने में सक्षम होने की आवश्यकता है ताकि आप जान सकें कि 'इंट' एक टिप्पणी में एक प्रकार है या सिर्फ एक शब्द है। (खासकर अगर आप लेक्सर में टिप्पणियों को खत्म करते हैं।)
एलन शटको

2
@ ThePopMachine: मुझे यकीन है कि मैंने जो कहा था, उस नियमित का एक परिभाषित औपचारिक अर्थ है, न कि आप जिस अर्थ का उपयोग कर रहे हैं, और वह "नियमित" "नियमित अभिव्यक्ति" इस अर्थ के लिए चुना गया था। गैर-पुनरावर्ती होना इसकी परिभाषा का एक परिणाम है।
आर .. गिटहब स्टॉप हेल्पिंग आईसीई

-1

कौन जानता है? मैं अनुमान लगाता हूं क्योंकि नेस्टेड टिप्पणियों का समर्थन करना अधिक काम है - आपको किसी प्रकार का एक स्टैक बनाए रखना होगा, और क्योंकि यह भाषा व्याकरण को जटिल करता है।


-1

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


3
-1: सच नहीं है। साने पर्सर्स ऐसे काम नहीं करते।
अमारा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.