2009-10-29 17 views
13

जावा में क्यों (मुझे कोई अन्य प्रोग्रामिंग भाषा नहीं पता) क्या एक पहचानकर्ता संख्या से शुरू नहीं हो सकता है और निम्नलिखित घोषणाओं की अनुमति क्यों नहीं है?पहचानकर्ता एक संख्या से क्यों शुरू नहीं कर सकता है?

int :b; 
int -d; 
int e#; 
int .f; 
int 7g; 
+0

कुछ भाषाएं डैश की अनुमति देती हैं। –

उत्तर

39

आम तौर पर आप दो कारणों के लिए में सीमा उस तरह से रख:

  1. यह इलेक्ट्रॉनिक रूप से पार्स करने के लिए एक दर्द है।
  2. मनुष्यों के लिए पार्स करना दर्द है।

    int d, -d; 
    d = 3; 
    -d = 2; 
    d = -d; 
    

    तो -d एक कानूनी पहचान है, तो जो मूल्य d अंत में है:

निम्नलिखित कोड का टुकड़ा पर विचार करें? -3 या 2? यह संदिग्ध है।

भी विचार करें:

int 2e10f, f; 
2e10f = 20; 
f = 2e10f; 

क्या मूल्य f अंत में है? यह भी संदिग्ध है।

इसके अलावा, यह किसी भी तरह से पढ़ने का दर्द है। अगर कोई 2ex10 घोषित करता है, तो क्या यह दो लाख या परिवर्तनीय नाम के लिए एक टाइपो है?

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

6

ऐसा इसलिए है क्योंकि जावा भाषा विशिष्टता के section 3.8 ऐसा कहते हैं।

एक पहचानकर्ता जावा पत्र और जावा अंक, जिनमें से पहले एक जावा पत्र होना चाहिए की एक असीमित-लंबाई अनुक्रम है। एक पहचानकर्ता एक कीवर्ड (§3.9), के रूप में ही वर्तनी (यूनिकोड वर्ण अनुक्रम) नहीं हो सकता बूलियन शाब्दिक (§3.10.3), या अशक्त शाब्दिक (§3.10.7)।

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

int -d = 7; 
System.out.println("Some number: " + (8 + -d)); 

शून्य से एक पहचानकर्ता, या एकल शून्य के पहले भाग है?

इसके अलावा, अगर तुम दोनों -d और d चर के रूप में किया था, यह पूरी तरह से अस्पष्ट होगा:

int -d = 7; 
int d = 2; 
System.out.println("Some number: " + (8 + -d)); 

परिणाम 15 या 6 है?

+0

@ करल मैनस्टर: अच्छा जोड़ा। दुर्भाग्यवश हमारे संपादन पार हो गए। इसे अभी तय करें। – Stephan202

3

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

+0

बिल्कुल, खराब कंपेलरों का मतलब नहीं हो सकता है। वे बहुत मेहनत करते हैं। –

1

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

पार्सर्स (आमतौर पर) स्रोत टेक्स्ट को "टोकन" में तोड़ने के लिए लिखे जाते हैं। एक पहचानकर्ता जो किसी संख्या से शुरू होता है वह एक संख्या की तरह दिखता है। 5e3 के अलावा, कुछ भाषाओं में एक मान्य संख्या (5000.0) है।

इस बीच: और। ऑपरेटर के रूप में टोकननाइज्ड हैं। कुछ संदर्भों में एक पहचानकर्ता जो इनमें से किसी एक के साथ शुरू होता है, अस्पष्ट कोड का कारण बनता है। इत्यादि।

0

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

बिंदु यह है कि यह कुछ होना चाहिए, तो यह वही है।

2

ऐसी चीजों को किसी भी भाषा में अभी अनुमति नहीं है (मैं अभी एक के बारे में नहीं सोच सकता), ज्यादातर भ्रम को रोकने के लिए।

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

उदाहरण 7 जी एक ही बात है। अंत में अक्षरों को जोड़कर आप निश्चित आधार या प्रकार के रूप में संख्या निर्दिष्ट कर सकते हैं। संख्या 8357 जावा में एक int है, जहां 8357 एल एक लंबा है (क्योंकि अंत में 'एल' है)। यदि चर संख्याओं के साथ शुरू हो सकते हैं, तो ऐसे मामले होंगे जहां आप यह नहीं बता सकते कि क्या यह एक चर नाम या सिर्फ एक शाब्दिक होना चाहिए।

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

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

0

उदाहरण के लिए, क्या हम कई बार इन नामों के साथ वस्तुओं की इच्छा नहीं रखते हैं?

2ndInning 
3rdBase 
4thDim 
7thDay 

लेकिन कल्पना जब कोई नाम 666 के साथ एक चर के लिए कोशिश कर सकते हैं:

int 666 = 777; 
float 666F = 777F; 
char 0xFF = 0xFF; 
int a = 666; // is it 666 the variable or the literal value? 
float b = 666F // is it 666F the variable or the literal value? 

शायद, एक तरह से हमें लगता है कि हो सकता है कि चर कि एक अंक के साथ शुरू एक वर्णमाला साथ समाप्त होना चाहिए है - इतने लंबे समय के रूप में यह 0x के साथ शुरू नहीं करता है और एक hexadeciamal अंकों के रूप में इस्तेमाल एक पत्र के साथ समाप्त, या यह इस तरह एल या एफ, आदि, आदि के रूप में पात्रों के साथ अंत नहीं है

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

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

इसलिए, यह इतना आसान नहीं है कि यह कंपाइलर के लिए आसान है लेकिन प्रोग्रामर के लिए।

संबंधित मुद्दे