java - स्टैक मैप फ्रेम क्या है



jvm bytecode (1)

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

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

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

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

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

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

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

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

यदि आप जावा के लिए उपयोग किए जाते हैं, तो कुछ मामूली अंतर हैं कि कैसे विधि पैरामीटर प्रकार बाइटकोड स्तर पर काम करते हैं। सबसे पहले, वर्चुअल मेथड में पहले पैरामीटर के रूप में this निहितार्थ होता है। दूसरा, boolean , byte , char और short बायटेकोड स्तर पर मौजूद नहीं हैं। इसके बजाय, उन्हें पर्दे के पीछे सभी को लागू किया जाता है।

मैं हाल ही में जावा वर्चुअल मशीन स्पेसिफिकेशन्स (JVMS) को देखने की कोशिश कर रहा हूं ताकि यह समझने की कोशिश की जा सके कि मेरे प्रोग्राम क्या काम करते हैं, लेकिन मुझे एक सेक्शन मिला है, जो मुझे काफी पसंद नहीं आ रहा है ...

धारा ४.२.४ में StackMapTable विशेषता का वर्णन है, और उस खंड में दस्तावेज़ स्टैक मैप फ़्रेम के बारे में विवरण में जाता है। मुद्दा यह है कि यह थोड़ा चिंताजनक है और मैं उदाहरण के साथ सबसे अच्छा सीखता हूं; पढ़कर नहीं।

मैं समझता हूं कि पहला स्टैक मैप फ़्रेम विधि डिस्क्रिप्टर से लिया गया है, लेकिन मुझे समझ में नहीं आता है कि कैसे (जो माना जाता है कि here समझाया गया here ।) इसके अलावा, मैं पूरी तरह से यह नहीं समझता कि स्टैक मैप फ़्रेम क्या करते हैं। मुझे लगता है कि वे जावा में ब्लॉक के समान हैं, लेकिन ऐसा प्रतीत होता है जैसे कि आप एक दूसरे के अंदर नक्शा फ्रेम नहीं कर सकते।

वैसे भी, मेरे पास दो विशिष्ट प्रश्न हैं:

  • स्टैक मैप फ़्रेम क्या करते हैं?
  • पहला स्टैक मैप फ्रेम कैसे बनाया जाता है?

और एक सामान्य प्रश्न:

  • क्या कोई जेवीएमएस में दिए गए विवरण की तुलना में व्याख्या को कम चिंताजनक और समझने में आसान प्रदान कर सकता है?




stackframe