2015-11-26 6 views
5

मैं मूल रूप से प्रबंधित और मूल कोड और उनके difference के विचार को समझता हूं। लेकिन उनके लिए एक दूसरे के साथ संवाद करने के लिए तकनीकी रूप से संभव कैसे है? कल्पना कीजिए कि निम्न उदाहरण:मिश्रित कोड (मूल, प्रबंधित): यह कैसे (तकनीकी रूप से) इंटरऑपरेट करता है?

मैं कुछ स्थिर या गतिशील C++ पुस्तकालय जो एक विशिष्ट मंच के लिए संकलित किया गया है मिला है। अब मैं एक जावा प्रोग्राम लिखता हूं। इस कोड के अंदर मैं लाइब्रेरी फ़ंक्शंस को 'मूल' कीवर्ड से कॉल करता हूं। मैं बाइटकोड के साथ एक जार फ़ाइल बनाता हूं और सी ++ लाइब्रेरी फाइलें अलग रहेंगी। नतीजा अब मंच-स्वतंत्र नहीं होगा।

  1. लेकिन जावा प्रोग्रामम को कैसे पता चलता है कि मूल देशी विधियां मौजूद हैं या नहीं?

  2. रनटाइम के दौरान पूरे प्रोग्राममोड को कैसे निष्पादित किया जाता है? मुझे पता है कि बाइटकोड का अर्थ जेआईटी के साथ किया जाएगा या संकलित किया जाएगा।

  3. यह कैसे सैंडबॉक्सिंग प्रतिमान में सभी फिट करता है? क्या देशी कोड भी सैंडबॉक्स के अंदर निष्पादित किया गया है?

  4. यह काम करता है, क्योंकि दोनों (जावा और सी ++) कोड मशीन कोड है अंत में?

शायद यह एक बेवकूफ सवाल है। लेकिन मैं हमेशा सोच रहा था ...

संपादित करें: मुझे 3 अच्छे उत्तर मिल गए हैं। वास्तव में यह तय नहीं कर सकता कि किसने मुझे सबसे ज्यादा मदद की। लेकिन मैं इस सवाल को मेरी तरफ से इस विषय को बंद करने के उत्तर के रूप में चिह्नित करूंगा।

उत्तर

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

  2. जेआईटी द्वारा उत्पन्न कोड पूरी तरह से आत्मनिर्भर नहीं है; इसे समय-समय पर बाहरी देशी कोड (निम्न-स्तर रनटाइम रूटीन या ओएस सेवाओं दोनों के लिए) को कॉल करना होगा। आपके मूल तरीकों के लिए कोड का आह्वान करने के लिए एक ही तंत्र का उपयोग किया जाता है।

  3. नहीं। आप शुद्ध सी/सी ++ कार्यक्रम में जो कुछ भी करेंगे, वह कर सकते हैं। केवल एक चीज जो इसे किसी भी नुकसान से रोकने से रोकती है, आपके पास बाहरी सुरक्षा उपाय हैं (लॉगिन विशेषाधिकार प्रतिबंध, अन्य ओएस सुरक्षा, सुरक्षा सॉफ्टवेयर इत्यादि) लेकिन वीएम आपकी रक्षा नहीं करेगा।

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

1

यह मंच पर निर्भर करता है। लिनक्स, सोलारिस आदि पर, जेआरई dlopen का उपयोग करता है। विंडोज़ पर, यह LoadLibraryEx और GetProcAddress का उपयोग करता है। यदि जेआरई व्याख्या मोड में चल रहा है, तो वह उस फ़ंक्शन को कॉल करता है; संकलित मोड में, यह जावा बाइटकोड को देशी कोड में संकलित करता है जो उस फ़ंक्शन को कॉल करता है।

सभी JREs मैं से परिचित हूँ पर, आप सीधे एक स्थिर पुस्तकालय में एक देशी समारोह फोन नहीं कर सकते हैं; एक गतिशील पुस्तकालय में केवल एक।

मूल कोड को एक प्लेटफ़ॉर्म तक सीमित नहीं होना चाहिए; यदि यह मानक सी है, तो आप शायद प्रत्येक प्लेटफ़ॉर्म के लिए क्रॉस-कंपाइलर के साथ संकलित कर सकते हैं जिस पर एक जेआरई उपलब्ध है।

1
  1. JVM पुस्तकालयों आप परिभाषित की जाँच करें और यदि विधि वहाँ

  2. Bytecode व्याख्या की जाएगी है या JITted और मूल कोड के लिए एक कॉल जोड़ा जाता है देखेंगे। इसमें मुक्केबाजी/डिबॉक्सिंग मान और डेटा को उपयुक्त प्रारूप में बदलने के लिए आवश्यक अन्य चीजें शामिल हो सकती हैं। पुस्तकालयों में एक निश्चित इंटरफ़ेस होता है जिसे जावा कंपाइलर को समझाया जाता है और यह आवश्यक इंटरफ़ेस तर्क उत्पन्न करेगा।

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

  4. यह आपके मतलब पर निर्भर करता है। अंत में कंप्यूटर मशीन कोड करता है, लेकिन यह वास्तव में इस मामले में कोई फर्क नहीं पड़ता। अनुवाद और निष्पादन भाग क्या मायने रखता है। वह गोंद है जो सब कुछ काम करता है।

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

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