चर नाम संख्याओं से शुरू क्यों नहीं हो सकते?


136

मैं कुछ समय पहले एक नए C ++ डेवलपर के साथ काम कर रहा था जब उसने सवाल पूछा: "वेरिएबल के नाम नंबरों से शुरू क्यों नहीं हो सकते?"

मैं इस बात का जवाब नहीं दे सकता था कि कुछ संख्याओं में उनके (123456L, 123456U) पाठ हो सकते हैं और यह संभव नहीं होगा यदि कंपाइलर कुछ मात्रा में अल्फा वर्णों के साथ सब कुछ सोच रहे हों तो यह एक परिवर्तनशील नाम था।

क्या यह सही जवाब था? क्या कोई और कारण हैं?

string 2BeOrNot2Be = "that is the question"; // Why won't this compile?

15
और उनमें स्थान क्यों नहीं हो सकता है?
टिम

4
यह समस्या कम से कम 20 वर्षों तक C ++ से पहले होती है, यदि पहले मैक्रो असेंबलरों पर वापस नहीं।
केन जेंटल

2
वैसे, FORTH में आप कर सकते हैं। AFAIK, एक शब्द है जिसे 0स्टैक पर 0 पुश किया जाता है। एक और है 0=कि जाँच करता है कि 0 स्टैक पर है या नहीं।
इंगो

12
यह प्रश्न इतना लोकप्रिय क्यों है और उत्तर इतने गलत हैं? कई भाषाएं चर को संख्या से शुरू करने की अनुमति देती हैं। C ++ नहीं है, लेकिन यह सिर्फ एक सुविधाजनक सीमा है जो कुछ अस्पष्टताओं से बचा जाता है। कभी-कभी SO मुझे सभी गलत तरीकों से परेशान करता है।
david.pfx

5
अगर यह सवाल आज एसओ से पूछा गया, तो इसे राय-आधारित और करीबी करार दिया जाएगा। यह पूछने के लिए धन्यवाद।
बून

जवाबों:


116

क्योंकि तब अंकों की एक स्ट्रिंग एक मान्य पहचानकर्ता के साथ-साथ एक मान्य संख्या होगी।

int 17 = 497;
int 42 = 6 * 9;
String 1111 = "Totally text";

37
ठीक है, क्या होगा अगर उन्होंने कहा कि चर केवल संख्या नहीं हो सकते। फिर क्या?
21

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

39
यदि इसे नंबर + अल्फा होना चाहिए था, तो आप अभी भी स्ट्रिंग 0x123 = "हैलो वर्ल्ड" कर सकते थे। जब तक आप यह नहीं बताते हैं कि चर नाम "संख्या + अल्फा हैं जो एक वैध संख्यात्मक पदनाम के बराबर नहीं हैं", और यह सिर्फ मूर्खतापूर्ण है।
ईलसन

4
कंपाइलर पर कभी ध्यान न दें: भाषा का उपयोग करने वाले लोगों को आसानी से (एक नज़र में) संख्याओं से परिवर्तनीय नामों को अलग करने में सक्षम होना चाहिए। अगर पहला चरित्र आपको नहीं बताता - इसके बजाय, यदि आपको यह बताने के लिए बाकी शब्द के माध्यम से खोज करने की आवश्यकता है कि क्या वहां एक गैर-संख्यात्मक अल्फा है - तो कोड को पढ़ना मुश्किल होगा।
आनेवाला

10
@eaolson: मैंने एक असेंबलर के साथ काम किया है, जिसने उस नियम को हेक्स संख्याओं पर लागू किया है, जो इसके साथ शुरू हुआ A- Fऔर समाप्त हुआ h। मुझे पहली बार पकड़ा मैंने बाख के दो भाग आविष्कार # (तार्किक नाम? Bach) के लिए संगीत डेटा को इंगित करने के लिए एक लेबल को परिभाषित करने की कोशिश की ।
सुपरकैट

116

इस बारे में अच्छी तरह सोचें:

int 2d = 42;
double a = 2d;

क्या है एक? 2.0? या 42?

संकेत, यदि आपको यह नहीं मिलता है, तो एक संख्या के बाद d का मतलब है कि संख्या एक डबल शाब्दिक है


11
यह वास्तव में एक [अपेक्षाकृत] देर से आने वाला अंकन ("डी" "डबल"), C89 मानक IIRC है। यदि यह निर्माण भाषा में है, तो पहचानकर्ताओं में अग्रणी संख्या संभव नहीं है, लेकिन यही कारण है कि संख्यात्मकता पहचानकर्ता शुरू नहीं कर सकता है।
केन जेंटल

1
dC ++ में मान्य फ्लोटिंग शाब्दिक प्रत्यय नहीं है। फ्लोटिंग शाब्दिक डिफ़ॉल्ट रूप से डबल्स हैं, आप उपयोग कर सकते हैं fया lयदि आपको फ्लोट या लंबे डबल शाब्दिक की आवश्यकता है।
सीबी बेली 21

1
यह जावा के लिए है, और जबकि मूल प्रश्न C ++ के लिए था, यह जावा जैसी कई अन्य भाषाओं पर भी लागू होता है। लेकिन मैं सहमत हूं। यह मूल कारण नहीं है कि पहचानकर्ता संख्याओं से शुरू नहीं कर सकते हैं।
२१:११ बजे पाइरोलॉजिकल डिक्सेस

50

अब यह एक सम्मेलन है, लेकिन यह तकनीकी आवश्यकता के रूप में शुरू हुआ।

पुराने दिनों में, FORTRAN या BASIC जैसी भाषाओं के पार्सर्स को रिक्त स्थान के उपयोग की आवश्यकता नहीं थी। तो, मूल रूप से, निम्नलिखित समान हैं:

10 V1=100
20 PRINT V1

तथा

10V1=100
20PRINTV1

अब मान लीजिए कि संख्यात्मक उपसर्गों की अनुमति थी। आप इसकी व्याख्या कैसे करेंगे?

101V=100

जैसा

10 1V = 100

या के रूप में

101 V = 100

या के रूप में

1 01V = 100

इसलिए, यह अवैध बना दिया गया था।


1
माइनर नाइट: लाइन नंबरों को 1-6 कॉलम में होना चाहिए, और निष्पादन योग्य कोड कॉलम 8 के बाद। दूसरी ओर DO 10 I=1,50अस्पष्ट रूप से पार्स किया जा सकता है DO1 0I=1,50[संयोग से, यदि कोई अल्पविराम के बजाय एक अवधि का उपयोग करता है, तो कथन एक असाइनमेंट हो जाता है। फ्लोटिंग-पॉइंट वैरिएबल नाम DO10I
सुपरकैट

दिलचस्प व्याख्या! पुरानी भाषाओं के लिए यह समझ में आता है, फिर भी मुझे आश्चर्य होता है कि हमने पायथन या जावास्क्रिप्ट या आर। जैसी भाषाओं के लिए डिज़ाइन की पसंद को क्यों जारी रखा है
चार्ल्स क्लेटन

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

42

क्योंकि संकलन करते समय लेक्सिकल विश्लेषण में बैकट्रैकिंग से बचा जाता है। एक चर की तरह:

Apple;

संकलक को पता चल जाएगा कि यह एक पहचानकर्ता है जब यह पत्र 'ए' से मिलता है।

हालांकि एक चर की तरह:

123apple;

संकलक यह तय करने में सक्षम नहीं होगा कि यह 'ए' हिट होने तक संख्या या पहचानकर्ता है या नहीं, और इसके परिणामस्वरूप बैकट्रैकिंग की आवश्यकता है।


2
मेरे संकलक डिजाइन वर्ग को याद करके उत्तर देने के लिए, यह उत्तर सीधे सही जाता है! कुडोस
नीम

15

कंपाइलर / पार्सर्स / लेक्सिकल एनालाइजर मेरे लिए बहुत पहले, एक लंबा समय था, लेकिन मुझे लगता है कि मुझे याद है कि यह स्पष्ट रूप से निर्धारित करने में कठिनाई हो रही है कि क्या संकलन इकाई में एक संख्यात्मक चरित्र एक शाब्दिक या एक पहचानकर्ता का प्रतिनिधित्व करता है।

ऐसी जगहें जहाँ जगह नगण्य है (जैसे कि ALGOL और मूल FORTRAN अगर मुझे सही से याद है) तो उस कारण के लिए पहचानकर्ता शुरू करने के लिए संख्या स्वीकार नहीं कर सकते थे।

यह स्टोरेज या न्यूमेरिक बेस को दर्शाने के लिए विशेष नोटेशन से पहले वापस जाता है।


9

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

मुझे लगता है कि समस्या का एक हिस्सा 0xdeadbeef जैसे नंबर शाब्दिक से आता है, जिससे पहचानकर्ताओं के लिए नियमों को याद रखना आसान हो जाता है जो एक अंक से शुरू हो सकते हैं। ऐसा करने का एक तरीका यह हो सकता है कि कुछ भी मिलान करने की अनुमति दी जाए [A-Za-z _] + जो कि एक कीवर्ड या नंबर शाब्दिक नहीं है। समस्या यह है कि यह 0xdeadpork जैसी अजीब चीजों को अनुमति देगा, लेकिन 0xdeadbeef नहीं। अंततः, मुझे लगता है कि हमें सभी मीट के लिए निष्पक्ष होना चाहिए: पी।

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


8
LOL - "समस्या यह है कि यह 0xdeadpork जैसी अजीब चीजों की अनुमति देगा, लेकिन 0xdeadbeef नहीं। अंततः, मुझे लगता है कि हमें सभी मीट के लिए निष्पक्ष होना चाहिए: P।"
श्री-यूरो

6

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

अन्य विकल्प यह जांचना होगा कि क्या यह शाब्दिक नहीं है और पहचानकर्ताओं के डोमेन को ब्रह्माण्ड को घटाकर शाब्दिक मान लिया जाएगा। लेकिन ऐसा करने के लिए आपको हर टोकन के हर चरित्र की जांच करनी होगी ताकि यह पता चले कि इसे कैसे वर्गीकृत किया जाए।

वहाँ भी है शैलीगत निहितार्थ पहचानकर्ता को शब्दविज्ञान माना जाता है इसलिए शब्दों को संख्याओं की तुलना में याद रखना बहुत आसान है। जब बहुत सारी मूल भाषाओं को अगले कुछ दशकों के लिए शैलियों को सेट करते हुए लिखा जा रहा था, तो वे "2" को "के लिए" प्रतिस्थापित करने के बारे में नहीं सोच रहे थे।


6

परिवर्तनीय नाम एक अंक से शुरू नहीं हो सकते, क्योंकि यह नीचे की तरह कुछ समस्याएं पैदा कर सकता है:

int a = 2;
int 2 = 5;
int c = 2 * a; 

c का मान क्या है? 4 है, या 10 है!

एक और उदाहरण:

float 5 = 25;
float b = 5.5;

पहले 5 नंबर है, या ऑब्जेक्ट है (। ऑपरेटर) दूसरी 5 के साथ भी ऐसी ही समस्या है।

हो सकता है, कुछ और कारण भी हों। इसलिए, हमें किसी चर नाम के शुरुआती भाग में किसी भी अंक का उपयोग नहीं करना चाहिए।


यहां तक ​​कि अगर एक की आवश्यकता होती है कि पहचानकर्ताओं में कम से कम एक गैर-अंक चरित्र होता है, तो किसी को या तो उस संख्यात्मक प्रारूप की आवश्यकता होगी जिसमें अक्षरों में एक गैर-अल्फ़ान्यूमेरिक वर्ण भी होना चाहिए [जैसे 0x1234 को $ 1234 के रूप में लिखा जाना चाहिए और 1% 6 लिखा जाना चाहिए। 1.E6 या 1.0E6] के रूप में या कानूनी और अवैध पहचानकर्ता नामों का एक विषम संयोजन है।
सुपरकैट

4

एक चर नाम शुरू करने के लिए एक अंक का उपयोग संकलन या इंटरपर्टेशन के दौरान त्रुटि की जाँच को और अधिक जटिल बनाता है।

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

जहां तक ​​मुझे याद है (लगभग 40 वर्ष), मुझे नहीं लगता कि मैंने कभी ऐसी भाषा का उपयोग किया है जो चर नामों को शुरू करने के लिए एक अंक का उपयोग करने की अनुमति देता है। मुझे यकीन है कि यह कम से कम एक बार किया गया था। हो सकता है, यहां किसी ने वास्तव में कहीं देखा हो।


1
यह उतना मुश्किल नहीं है। यह लेक्सिकल चरण को अधिक कठिन बनाता है, बस इतना ही। बेशक, जब मैं कंपाइलर ले गया, तो मुझे बताया गया कि लेक्सिकल स्कैनिंग कुल संकलन समय का एक चौथाई हिस्सा ले सकती है।
डेविड थॉर्नले

4

जैसा कि कई लोगों ने देखा है, चर नामों के लिए मान्य प्रारूपों के बारे में बहुत सारे ऐतिहासिक सामान हैं। और भाषा डिजाइनर हमेशा से प्रभावित होते हैं कि वे क्या जानते हैं जब वे नई भाषा बनाते हैं।

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

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

एक बहुत ही सरल HTML टेम्प्लेटिंग भाषा के उदाहरण के लिए जो संख्याओं के साथ शुरू करने और एम्बेडेड स्थान के लिए चर की अनुमति देता है, Qompose को देखें


1
दरअसल, कई भाषाएं हैं जो आपको पहचानने वाले पात्रों को चिह्नित करने की अनुमति देती हैं। उन्हें "सिगिल" कहा जाता है और आप उन्हें पर्ल और पीएचपी में हैं।
जेसन बेकर

सिवाय आपको अभी भी PHP में एक नंबर के साथ एक चर नाम शुरू करने की अनुमति नहीं है - भाषा के नियम इसे मना करते हैं। :-) लेकिन आप बिल्कुल उसी कारण से Qompose में कर सकते हैं।
स्टेटिक्सन

4

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


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

4

प्रतिबंध मनमाना है। विभिन्न लिस्प्स अंकों के नामों को अंकों के साथ शुरू करने की अनुमति देते हैं।



2

C ++ में यह नहीं हो सकता है क्योंकि भाषा डिजाइनरों ने इसे नियम बनाया है। यदि आप अपनी भाषा बनाते हैं, तो आप निश्चित रूप से इसकी अनुमति दे सकते हैं, लेकिन आप शायद उन्हीं समस्याओं में भाग लेंगे जो उन्होंने की थीं और इसे अनुमति नहीं देने का निर्णय लिया था। चर नामों के उदाहरण जो समस्याएं पैदा करेंगे:

0x, 2d, 5555


यह प्रतिबंध उन भाषाओं में है जहाँ इस प्रकार के वाक्य-विन्यास की अनुमति नहीं है।
जेसन बेकर

2

वाक्य रचना को शिथिल करने के बारे में प्रमुख समस्याओं में से एक यह है कि यह कोडिंग प्रक्रिया में संज्ञानात्मक असंगति का परिचय देती है। आप अपने कोड के बारे में कैसे सोचते हैं यह स्पष्टता की कमी से गहराई से प्रभावित हो सकता है।

क्या यह डाइकस्ट्रा नहीं था जिसने कहा था कि "किसी भी उपकरण का सबसे महत्वपूर्ण पहलू उसके उपयोगकर्ता पर इसका प्रभाव है"?


1

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

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


बात यह है कि फोर्थ वास्तव में बहुत परिष्कृत पार्सर नहीं है। वास्तव में, सभी इसकी परवाह करते हैं कि क्या एक पहचानकर्ता व्हाट्सएप के दो सेटों के बीच है।
जेसन बेकर

1

मान लीजिए कि आपने प्रतीक नामों को संख्याओं के साथ शुरू करने की अनुमति दी है। अब मान लीजिए कि आप एक वेरिएबल 12345foobar नाम रखना चाहते हैं। आप इसे 12345 से कैसे अलग करेंगे? यह वास्तव में एक नियमित अभिव्यक्ति के साथ करने के लिए बहुत मुश्किल नहीं है। समस्या वास्तव में प्रदर्शन में से एक है। मैं वास्तव में यह नहीं समझा सकता कि यह बहुत विस्तार से क्यों है, लेकिन यह अनिवार्य रूप से इस तथ्य को उबालता है कि 12345foobar को 12345 से अलग करना बैकट्रैकिंग की आवश्यकता है। यह नियमित अभिव्यक्ति को गैर-निर्धारक बनाता है।

यहाँ इसका बेहतर विवरण दिया गया है


1
कैसे एक एक रेगुलर एक्सप्रेशन डिजाइन एक चर नामित अनुमति देने के लिए होता है ifqया doublezनहीं बल्कि ifया double? पहचानकर्ताओं को अंकों के साथ शुरू करने की अनुमति देने में मूलभूत समस्या यह होगी कि हेक्स शाब्दिक और फ़्लोटिंग-पॉइंट संख्याओं के मौजूदा रूप हैं जिनमें पूरी तरह से अल्फ़ान्यूमेरिक वर्ण हैं (भाषाएं 0x3434 के बजाय $ 1234 या h'1234 जैसे कुछ का उपयोग करेंगी, और संख्याओं की आवश्यकता होगी 1E23 एक अवधि को शामिल करने के लिए, उस मुद्दे से बच सकता है)। ध्यान दें कि रेक्स-पार्सिंग सी का प्रयास पहले से ही चीजों की तरह फंस सकता है 0x12E+5
सुपरकाट

1

संकलक के लिए यह आसान है कि वह संख्या के बजाय मेमोरी स्थान पर ASCII का उपयोग करके किसी चर की पहचान करे।


1

संकलक के 7 चरण निम्नानुसार हैं:

  1. लेक्सिकल विश्लेषण
  2. सिंटेक्स विश्लेषण
  3. शब्दार्थ विश्लेषण
  4. इंटरमीडिएट कोड जनरेशन
  5. कोड अनुकूलन
  6. कोड जनरेशन
  7. प्रतीक तालिका

कोड के टुकड़े को संकलित करते समय लेक्सिकल विश्लेषण चरण में बैकट्रैकिंग से बचा जाता है। Apple जैसे चर, संकलक को इसके पहचानकर्ता को तुरंत पता चल जाएगा जब यह लेक्सिकल विश्लेषण चरण में अक्षर 'A' अक्षर से मिलता है। हालाँकि, 123apple जैसा एक वैरिएबल, कंपाइलर यह तय नहीं कर पाएगा कि इसकी संख्या या पहचानकर्ता तब तक है जब तक कि यह 'a ’हिट न हो जाए और इसकी पहचान करने के लिए इसे शाब्दिक विश्लेषण चरण में जाने के लिए बैकट्रैकिंग की आवश्यकता हो। लेकिन यह संकलक में समर्थित नहीं है।

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


0

मुझे लगता है कि इसका सरल उत्तर यह है कि प्रतिबंध भाषा आधारित है। C ++ और कई अन्य में यह नहीं हो सकता क्योंकि भाषा इसका समर्थन नहीं करती है। इसे अनुमति देने के लिए नियमों में नहीं बनाया गया है।

प्रश्न यह पूछने के समान है कि राजा शतरंज में एक समय में चार स्थान क्यों नहीं ले सकता? ऐसा इसलिए है क्योंकि शतरंज एक गैरकानूनी कदम है। यकीन है कि एक और खेल में यह कर सकते हैं। यह सिर्फ उसके द्वारा निभाए जा रहे नियमों पर निर्भर करता है।


सिवाय इसके कि C ++ का आविष्कार हाल ही में उन लोगों द्वारा किया गया था जो अभी भी जीवित हैं। हम उनसे पूछ सकते हैं कि उन्होंने जो चीजें कीं, उन्हें क्यों चुना और विकल्पों को खारिज कर दिया। वही शतरंज पर लागू नहीं होता है।
स्टीव जेसोप

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

ज़रूर, लेकिन मुझे नहीं लगता कि प्रश्नकर्ता एक ईमबाइल है। वह शायद पहले से ही खुद से दूर काम कर रहा है। प्रश्न IMO है "भाषा के नियम इसे अनुमति क्यों नहीं देते?"। वह नियमों को जानने और उन्हें समझने के बीच की खाई को पाटना चाहता है।
स्टीव जेसप

हाँ, इस पर विचार करने पर, मुझे एहसास हुआ कि आप कहाँ जा रहे थे। तुम्हारी बात तथ्य पूर्ण है। मुझे लगता है कि मैं एक स्वतंत्र रूप से थोड़े के रेजर को लागू करने के लिए स्वतंत्र था और यह मान लिया था कि कोई वास्तविक उत्तर क्यों नहीं है, सिवाय इसके कि चर संख्याओं से शुरू नहीं होते हैं, क्योंकि संख्याएं नहीं हैं।
kemiller2002 16

मैं यह नहीं कह रहा हूं कि आप गलत हैं, दिमाग, कभी-कभी C ++ मानकों के निर्णय नश्वर समझ को पार करते हैं, और आप "क्योंकि उन्हें कुछ तय करना था और उन्होंने यह फैसला किया"। लेकिन वहाँ कम से कम एक सवाल पूछा जाना है :-)
स्टीव जेसप

0

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


0

चर को कंपाइलर द्वारा संकलित समय के दौरान भी एक मूल्य के रूप में माना जा सकता है, इसलिए मान बार-बार मूल्य को कॉल कर सकता है


0

कोड के टुकड़े को संकलित करते समय लेक्सिकल विश्लेषण चरण में बैकट्रैकिंग से बचा जाता है । Apple जैसा चर; कंपाइलर को इसके पहचानकर्ता को तुरंत पता चल जाएगा, जब यह लेक्सिकल एनालिसिस चरण में 'A' अक्षर से मिलता है। हालांकि, 123apple की तरह एक चर; , संकलक यह तय करने में सक्षम नहीं होगा कि इसकी संख्या या पहचानकर्ता तब तक है जब तक कि यह 'ए' हिट नहीं करता है और यह एक चर है यह पहचानने के लिए लेक्सिकल विश्लेषण चरण में जाने के लिए बैकट्रैकिंग की आवश्यकता होती है। लेकिन यह संकलक में समर्थित नहीं है।

संदर्भ


0

परिवर्तनशील घोषित करने के दौरान इसके साथ कुछ भी गलत नहीं हो सकता है। लेकिन कुछ अस्पष्टता है जब यह उस चर को इस तरह से उपयोग करने की कोशिश करता है:

1 = "नमस्ते दुनिया!" प्रिंट (1) प्रिंट (1)

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

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