वैकल्पिक अर्धविराम


10

बहुधा, एक सामान्य प्रयोजन की अनिवार्य भाषा में - अर्धविराम के रूप में कथन-सीमांकक या तो आवश्यक है, या पूरी तरह से अस्वीकृत (जैसे सी और पायथन)।

हालाँकि, कुछ भाषाएं, जैसे जावास्क्रिप्ट, आपको अर्धविराम के साथ अपने बयानों का परिसीमन करने की अनुमति देती हैं, अन्य परिसीमनकर्ताओं (जैसे एक नई पंक्ति) के पक्ष में।

इसके पीछे डिजाइन के फैसले क्या हैं? मैं समझता हूं कि एक ही लाइन पर कई स्टेटमेंट लिखते समय सेमीकोलन जरूरी है, लेकिन क्या उन्हें अनिवार्य करने का एक और कारण है (सी को छोड़कर)?


1
आपको स्टेटमेंट टर्मिनेटर (पर्ल, सी), और स्टेटमेंट डेलिमिटर (जावास्क्रिप्ट, पास्कल) के बारे में सोचने की जरूरत है।

5
पायथन में, अर्धविरामों का उपयोग एक ही पंक्ति में कई कथनों को अलग करने के लिए किया जा सकता है। और चूंकि "खाली" कथन की अनुमति है, अर्धविराम का उपयोग अधिकांश कथनों के अंत में किया जा सकता है।
ग्रेग हेविल

1
I understand that semicolons are essential when writing multiple statements on the same line- भाषा पर निर्भर करता है। मेरे इष्ट ने ऐसा कोई परिसीमन नहीं किया है, अगला कथन तब शुरू होता है जब सभी फ़ंक्शन तर्क का उपयोग किया गया हो।
इज़काता

1
@MichaelT: मुझे नहीं लगता कि आपके वर्गीकरण सही हैं: पर्ल यकीनन दोनों समूहों से संबंधित हैं, और जावास्क्रिप्ट वास्तव में "स्टेटमेंट टर्मिनेटर" शिविर में है (चूंकि कार्यान्वयन से पहले }या एंड-ऑफ़-फ़ाइल में अर्धविराम लगाने की आवश्यकता होती है )।
३:३० पर रुक्ख

हां, बिल्कुल भाषा पर निर्भर करता है। मेरा व्यक्तिगत अनुमान यह होगा कि अर्धविराम आम तौर पर सहमत हुए एक प्रकार के सम्मेलन होते हैं, जिन्हें अधिकांश भाषा डिजाइनर अनुसरण करते हैं। कम से कम यह कुछ और अधिक प्राकृतिक-भाषा के दृष्टिकोण से समझ में आता है। ब्लॉकों के लिए {और} के साथ ही, वे: कई भाषाओं द्वारा उपयोग किए जाते हैं, हालांकि सभी नहीं और आपको वास्तव में ऐसा करने की आवश्यकता नहीं है। इसके पीछे कोई सार्वभौमिक कारण नहीं है।
जेन्सजी

जवाबों:


24

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

जिन भाषा डिजाइनरों ने उन्हें वैकल्पिक बनाने का विकल्प चुना है, उन्होंने अधिक संश्लिष्ट लचीलेपन के बदले अस्पष्टता के साथ रहना चुना है।


7
@RobertHarvey विधर्मी! ऐसा करने का एक, स्पष्ट तरीका और केवल एक ही होना चाहिए। संयोग से, इसे पर्ल में करने का केवल एक ही तरीका है।

1
BTW - कुछ भाषाओं में सामान्य रूप से व्याकरण में अतिरेक होता है, इसलिए अर्धविराम को वैकल्पिक बनाना कभी-कभी व्यवहार में अस्पष्ट होता है। उस ने कहा, मुझे लगता है कि अर्धविराम को छोड़ने के लिए अतिरेक की गलत बात है - मुझे हास्केल बहुत पसंद है जहां आप तर्क के लिए पार्न्स और कॉमा छोड़ते हैं। ठीक है, आप हासिकेल में अर्धविराम भी गिरा सकते हैं, लेकिन यह वास्तव में जावास्क्रिप्ट के समान नहीं है।
213 पर स्टीव 314

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

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

1
@ मैसीज पाइचोटका - बेशक, यह वास्तव में कभी भी एक सार्वभौमिक सम्मेलन नहीं था - सिर्फ इसलिए कि अल्गोल-परिवार की भाषाओं का मतलब यह नहीं है कि अन्य भाषाएं खुद को उसके सापेक्ष परिभाषित करती हैं, इसलिए मेरा "गिराया" दावा उस अर्थ में गलत है - लेकिन सभी पर सी-फैमिली लैंग्वेज इन दिनों कुछ ऐसी ही लगती है।
स्टीव 314

15

जावास्क्रिप्ट ने हमें दिखाया है कि यह एक बहुत बुरा विचार है। उदाहरण के लिए:

return
0;

C में, यह 0. का मान देता है। जावास्क्रिप्ट में, यह undefinedइसलिए लौटाता है क्योंकि एक सेमीकोलन रिटर्न स्टेटमेंट के बाद डाला जाता है, और यह तुरंत स्पष्ट नहीं है कि आपका कोड क्यों टूट रहा है जब तक कि आप स्वचालित अर्धविराम प्रविष्टि के विवरण के बारे में नहीं जानते।


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

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

4
@delnan: इसका कारण आश्चर्यजनक है कि जावास्क्रिप्ट आमतौर पर एक पंक्ति के अंत में एक अर्धविराम नहीं डालती है , सिवाय एक अन्यथा अमान्य कार्यक्रम को ठीक करने के। returnकेवल कुछ मामलों में से एक के बाद जावास्क्रिप्ट एक अर्धविराम सम्मिलित करेगा भले ही कार्यक्रम इसके बिना मान्य होगा। (लेकिन निश्चित रूप से, यह मेसन व्हीलर की बात को कम करता है। समस्या यह नहीं है कि अर्धविराम वैकल्पिक हैं, यह नियम असंगत हैं।)
बर्बाद करें

6
@TehShrike: अर्धविरामों को वैकल्पिक बनाना सभी प्रोग्रामरों के लिए नुकसान का कारण बनता है , क्योंकि यह मनमाने ढंग से टाइपो की व्याख्या करने के बजाय आपसे पूछता है कि आपका क्या मतलब है। हर कोई अब और फिर एक टाइपो बनाता है।
Jan Hudec

1
जावास्क्रिप्ट ने दिखाया है कि इसके वैकल्पिक अर्धविरामों का कार्यान्वयन त्रुटिपूर्ण है। यह नहीं दिखाता है कि वैकल्पिक अर्धविराम खराब प्रति-से हैं।
कोडइन्चोस

4

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

दूसरी ओर, एक बार जब आप पार्सर को व्हॉट्सएप के बारे में बताना चाहते हैं, तो अर्धविराम को वैकल्पिक बनाना उतना कठिन नहीं है। आप अक्सर केवल एक whitespaceटोकन के साथ उन्हें एक साथ जोड़ सकते हैं और आपका पार्सर इसे ठीक से संभाल सकता है।

उदाहरण के लिए, सी कथनों की निम्नलिखित श्रृंखला में अर्धविराम सम्मिलित करने का प्रयास करें।

functionCall(3, 4) 9 + (3 / 8) variable++ while(1) { printf("Hello, world\n") }

हालांकि कुछ अजीब चीजें हैं जो आप अब नहीं कर सकते हैं, जैसे कि while(1);, अधिकांश भाग के लिए, यह आधुनिक पार्सिंग तकनीकों के साथ अपेक्षाकृत आसान है, यह निर्धारित करने के लिए कि कथन एक विशिष्ट सीमांकक के बिना कहां समाप्त होते हैं। यहां तक ​​कि अगर आप अभी भी अजीब सामान की अनुमति देना चाहते हैं, तो यह newline_or_semicolonगैर-टर्मिनल बनाने के लिए मुश्किल नहीं है ।


जब सी को मूल रूप से 1970 के दशक में विकसित किया गया था, तो संकलक को सरल बनाने के लिए स्टेटमेंट टर्मिनेटर्स की आवश्यकता थी। 90 के दशक के मध्य तक, जब जावास्क्रिप्ट विकसित किया गया था, यह एक चिंता का विषय था।
शॉन मैकसोमरेटिंग

3

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

functionCall(3, 4) 9 + (3 / 8) variable++ while(1) { printf("Hello, world\n") }

कल्पना कीजिए कि आपने एक अतिरिक्त ओपन पार्न टाइप किया है:

functionCall((3, 4) 9 + (3 / 8) variable++ while(1) { printf("Hello, world\n") }

अब गलती कहाँ है? यदि आपके पास अर्धविराम थे, तो पार्सर के लिए पहले अर्धविराम को छोड़ना आसान है। अगर यह चाहे तो अर्धविराम के बाद भी पार्स करना जारी रख सकता है।

functionCall((3, 4);  <- something is wrong here. emit error and keep going.
                      9 + (3 / 8); variable++; while(1) { printf("Hello, world\n"); }

अब पार्सर पर त्रुटि की रिपोर्ट करना और लाइन / कॉलम का पता लगाना आसान है जहां यह हुआ।


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

2

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

--One statement per line
x = 1
y = 2

--Multiple statements per line
x = 1 y = 2

--You can add semicolons if you want but its just for clarity:
x = 1; y = 2

0

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

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