2012-02-12 6 views
6

enter link description here जावा कंपाइलर इंटर-क्लास संदर्भों को इतनी तेज़ी से कैसे हल करता है, यदि आपके पास कक्षाओं का एक गुच्छा है जो सभी एक दूसरे को संदर्भित करते हैं और एक-दूसरे के तरीकों का उपयोग करते हैं?कंपाइलर्स + इंटर-क्लास संदर्भ: जेएवीएसी जल्दी से क्या करता है सी ++ कंपाइलर धीरे-धीरे क्या करते हैं?

मुझे पता है कि सी ++ कंपाइलर्स इस संबंध में कैसे काम करते हैं: प्रत्येक .cpp फ़ाइल को अलग से संकलित किया जाता है, और वे वर्ग फ़ील्ड/विधियों को घोषित करने के लिए उन भयानक .h फ़ाइलों का उपयोग करते हैं, ताकि प्रत्येक बार फ़ाइलों का एक ही सेट फिर से विश्लेषण किया जा सके और/या कंपाइलर्स को पूर्व-संकलित शीर्षलेखों का समर्थन करना होता है।

लेकिन जावा ऐसा नहीं करता है और क्लास इंटरफेस/कार्यान्वयन के प्रोग्राम स्रोत में टर्बो पास्कल को अलग करने के तरीके में कोई अलगाव नहीं है।

मैं देख सकता हूं कि यदि आपके पास कक्षा फू है और यह कक्षा बार, बाज़, क्वाक्स को संदर्भित करता है जो सभी अलग barbazquux.jar फ़ाइल में हैं, तो चीजें सीधी होंगी: .jar फ़ाइल पहले ही संकलित हो चुकी है, इसलिए जब Foo.java संकलित हो जाता है तो यह barbazquux.jar में .class फ़ाइलों को देख सकता है।

लेकिन यदि आपके पास चक्रीय वर्ग संदर्भ हैं, और कक्षा फू क्लास बार संदर्भित करता है जो क्लास फू का संदर्भ देता है, तो यह संभवतः बार.जावा को संकलित किए बिना Foo.java को कैसे संकलित करता है और फिर निर्णय लेता है कि इसे Foo.java संकलित करना है और एक पाश में फंस जाओ?

जावा कंपाइलर इंटर-क्लास संदर्भों को संभालने के लिए क्या करता है?


संपादित करें: येर बताते जवाब है कि थोड़ा बहु compilers उल्लेख के साथ another question। ठीक है, तो कई पास हैं। प्रत्येक पास वास्तव में क्या होता है और जावा इतनी जल्दी संकलित करने का प्रबंधन कैसे करता है? क्या इसे प्रत्येक पास प्रत्येक फ़ाइल पर दोबारा पार्स करना पड़ता है, या क्या यह समय बचाने के लिए अमूर्त सिंटैक्स पेड़ को स्टोर करता है, या क्या?

+0

... और इस अवधारणा को क्या कहा जाता है, इसलिए यदि मैं कुछ कंपाइलर पुस्तकों को देखना चुनता हूं तो मैं इसके बारे में अधिक जान सकता हूं? –

+0

डुप्लिकेट प्रश्न की तरह दिखता है जिसका उत्तर दिया गया है। [यहां] देखें (http://stackoverflow.com/questions/3032874/how-does-compiling-circular- निर्भरता- कार्य)। – yair

+0

मुझे लगता है, लेकिन उस प्रश्न में वास्तव में ऐसे उत्तर नहीं हैं जो बहुत अधिक कहते हैं। –

उत्तर

-1

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

साइक्लिक कक्षा संदर्भ समस्याग्रस्त हैं। जावा में कोई पूर्व शर्त मान सकता है कि एक वर्ग मौजूद है, भले ही वह वर्ग अभी तक असम्बद्ध है। लेकिन जावा कंपाइलर एक ही समय में उन्हें संकलित करने में सक्षम होने के कारण और भी प्रभावशाली है। चक्रीय निर्भरताओं के कारण ही। JVM byte code invoke instructions विधि नामों का उपयोग करें, इसलिए कोई भी पहली कक्षा को अनुमानित रूप से संकलित कर सकता है।

public class A { 
    public static void a(int i) { 
     System.out.println("a(" + i + ")"); 
     if (i < 10) 
      B.b(i + 2); 
    } 
} 

public class B { 
    public static void b(int i) { 
     System.out.println("b(" + i + ")"); 
     if (i < 10) 
      A.a(i + 1); 
    } 
} 

public static void main(String... args) { 
    B.b(0); 
} 
+0

सवाल पार्सिंग में दक्षता के बारे में नहीं है। यह अंतर-वर्ग निर्भरताओं के संकल्प के बारे में है। – EJP

0

सी ++ को बाहरी कक्षा घोषणा के स्रोत कोड को आम तौर पर एक .hpp फ़ाइल में पार्स करना है। जावा बाह्य वर्ग घोषणाओं के ऑब्जेक्ट कोड को संसाधित करता है, जो पहले ही संकलित है। जावा क्या करता है जैसे पैकेज के साथ भाषाएं, उदाहरण के लिए एडा, मॉडुला -3, ... यही कारण है कि अधिकांश सी/सी ++ कंपाइलर्स में 'प्रीकंपिल्ड हेडर' भी होते हैं।

+0

@downvoter आपके कारण कृपया – EJP

+0

आईडीके लेकिन मैं ऊपर उठाया गया। शायद यह ".hpp" फ़ाइल है; कोई भी वास्तव में उन का उपयोग नहीं करता है, सी ++ फाइलें आम तौर पर ".h" फ़ाइलें भी होती हैं। –

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