2012-05-10 25 views
15

कुछ प्रस्तुति पर जाकर, मैं निम्नलिखित दावे में आया हूं: जब JVM कक्षा को लोड करता है, तो यह इसकी सामग्री का विश्लेषण कर सकता है और सुनिश्चित कर सकता है कि ऑपरेंड स्टैक का कोई ओवरफ़्लो या अंडरफ़्लो नहीं है। मुझे a lot of sources मिल गया है जो एक ही दावा करता है, लेकिन यह निर्दिष्ट किए बिना कि यह कैसे किया जाता है।कक्षा लोड करते समय JVM सत्यापित करने के लिए कोई संभावित ऑपरेंड स्टैक ओवरफ़्लो कैसे सत्यापित कर सकता है?

यह स्पष्ट नहीं है कि स्थिर विश्लेषण का उपयोग करके ऐसा सत्यापन कैसे किया जा सकता है। मान लें कि मेरे पास एक (दुर्भावनापूर्ण) विधि है जो तर्क के रूप में कुछ मान प्राप्त करती है, और पॉप की एक श्रृंखला करने के लिए इसका उपयोग करती है। लोड समय पर, पुनरावृत्तियों की संख्या ज्ञात नहीं है, क्योंकि यह विधि के कॉलर द्वारा दिए गए तर्क पर निर्भर करती है। इसलिए, ऐसा लगता है कि केवल रनटाइम पर यह निर्धारित करना संभव है कि कोई अंडरफ्लो होगा या नहीं। मुझे यहां क्या समझ नहीं आ रहा है?

+0

वैधकर्ता लूप में पॉप करने के किसी भी प्रयास को अस्वीकार कर सकता है। –

+0

@ मार्कोटोपॉलिक, मैंने 'पॉप' को सबसे स्पष्ट उदाहरण के रूप में इस्तेमाल किया। अन्य पॉपिंग आदेशों का भी उपयोग किया जा सकता है, जैसे विभिन्न 'स्टोर'। – eran

+0

ठीक है, तो क्या आपको कोई वैध मामला दिखाई देता है जहां एक लूप चरण में धक्का देने के सापेक्ष कोड के पास पॉप (अतिरिक्त निर्देश द्वारा) होगा? –

उत्तर

10

आप Java Virtual Machine specification में बाइटकोड सत्यापनकर्ता का मूल विवरण पा सकते हैं।

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

+0

लिंक के लिए धन्यवाद (और सरल स्पष्टीकरण)। मुझे आश्चर्य है कि रनटाइम पर बाइटकोड की दक्षता पर इस सीमा का क्या प्रभाव है (उदाहरण के लिए एक लूप नहीं है जो सामान को धक्का देता है और उसके बाद उस लूप का उपयोग करता है जो इसे पॉप करते समय उपयोग करता है)। लेकिन यह इस सवाल के दायरे से बाहर है। – eran

+0

मुझे पता है कि एकमात्र मुद्दा पूंछ-रिकर्सन अनुकूलन है। लेकिन यह एक विधि स्तर पर हल करने योग्य है, इसलिए एक ही सत्यापन नियम लागू होते हैं। यदि मैं JVM में गलत काम नहीं कर रहा हूं तो इसे समर्थन देने के लिए पहले से ही किया जा रहा है। यह बाइटकोड को प्रभावित नहीं करता है, लेकिन जेआईटी कंपाइलर जो इसे देशी कोड में अनुवाद करता है। –

5

विधि का कोड निष्पादन ब्लॉक में विभाजित है। एक "ब्लॉक" निर्देशों का अनुक्रम है जिसे बाहर या अंदर कूदने के बिना निष्पादित किया जा सकता है। ब्लॉक सभी संभावित निष्पादन पथों का एक निर्देशित ग्राफ बनाते हैं।

एक ब्लॉक हमेशा इसकी शुरुआत में एक निश्चित ढेर आकार की अपेक्षा करता है और इसके अंत में एक निश्चित स्टैक आकार होता है (शुरुआत + सभी धक्का - सभी पॉप)। सत्यापनकर्ता जांच करता है कि सभी ब्लॉक 'ए' के ​​लिए जो किसी दिए गए ब्लॉक 'बी' से पहुंचा जा सकता है, बी का अंत स्टैक-आकार प्रारंभिक स्टैक-आकार से मेल खाता है।