उन लोगों के लिए जो POJ का अनुसरण नहीं कर रहे हैं (JVM पर पास्कल) एक कंपाइलर है जो सबसेट को पास्कल से JASM में बदल देता है (जावा असेंबली) ताकि हम JVM को निष्पादन वातावरण के रूप में उपयोग कर सकें।
पिछली पोस्ट में हमने पास्कल के कार्यों के लिए समर्थन लागू किया था।
इस पोस्ट में, क्या हम अच्छी चीज़ों के बारे में बात करने जा रहे हैं? इतना भी नहीं हाहाहा. इस बार हम केवल बग्स के बारे में बात करने जा रहे हैं :-)
जैसा कि हम जेवीएम के लिए संकलन कर रहे हैं, इस अविश्वसनीय वर्चुअल मशीन के विभिन्न बिंदुओं की कार्यप्रणाली का विवरण देना आवश्यक है। इसलिए, विभिन्न समयों पर मैं जेवीएम की आंतरिक कार्यप्रणाली के साथ-साथ इसके कुछ निर्देशों (opcodes) का विवरण देता हूं।
जब मैंने वेरिएबल घोषणा को लागू किया तो मैंने इस तथ्य पर ध्यान नहीं दिया कि, जेवीएम में, मुख्य फ़ंक्शन में पहला वेरिएबल आर्ग्स है, एक सरणी जिसमें प्रोग्राम को दिए गए तर्क शामिल हैं। इसलिए इस पीआर में मैं तर्कों के लिए परोक्ष रूप से पहला स्थान आरक्षित रखता हूं।
चूंकि परीक्षण पास्कल कार्यक्रमों में केवल वैश्विक चर शामिल थे, मैंने जेएएसएम पीढ़ी में कोई गंभीर त्रुटि नहीं देखी थी। जिस क्षण मैंने ऐसे प्रोग्राम बनाए जिनमें वैश्विक और स्थानीय चर शामिल थे, मुझे एहसास हुआ कि कुछ सही नहीं था।
नीचे पास्कल कार्यक्रम से:
program global_var_declaration; var globalvar : integer; begin globalvar := 123; write (globalvar); end.
POJ ने निम्नलिखित JASM उत्पन्न किया:
// Code generated by POJ 0.1 public class global_var_declaration { public static main([java/lang/String)V { ;; globalvar := 123; bipush 123 istore 1 ;; write (globalvar); getstatic java/lang/System.out java/io/PrintStream iload 1 invokevirtual java/io/PrintStream.print(I)V return } }
समस्या की पहचान करने के लिए, मैंने उपरोक्त पास्कल प्रोग्राम के समतुल्य एक जावा प्रोग्राम बनाया:
public class GlobalVarDeclaration { public static int globalVar; public static void main(String[] args) { globalVar = 123; System.out.println(globalVar); } }
जब मैंने क्लास को अलग किया तो मुझे निम्नलिखित असेंबली मिली:
1: public class GlobalVarDeclaration { 2: public static globalVar I 3: 4: public static main([java/lang/String)V { 5: bipush 123 6: putstatic GlobalVarDeclaration.globalVar I 7: 8: getstatic java/lang/System.out java/io/PrintStream 9: getstatic GlobalVarDeclaration.globalVar I 10: invokevirtual java/io/PrintStream.println(I)V 11: 12: return 13: } 14: }
इस बिंदु पर मैंने घोषणा "public staticglobalVar I" (पंक्ति 2) और निर्देश putstatic (पंक्ति 6) और getstatic (पंक्ति) देखी 9) . अब तक POJ द्वारा उपयोग किए जाने वाले निर्देश astore और istore अपेक्षित थे। जेवीएम दस्तावेज को पढ़ने से मुझे एहसास हुआ कि पीओजे वैश्विक चर घोषित कर रहा था जैसे कि वे जेवीएम के लिए किसी फ़ंक्शन के स्थानीय चर थे :-D
वैसे भी, अब तक POJ (गलत तरीके से) opcodes aload/iload/astore/ Istore का उपयोग कर रहा था वैश्विक चर के लिए, लेकिन सही विकल्प चर को सार्वजनिक घोषित करना होगा (जैसा कि पंक्ति 2 में है) और getstatic/putstatic का उपयोग करें।
परिणामस्वरूप, कोड को यहां दोबारा तैयार किया गया ताकि प्रतीक तालिका स्थानीय और वैश्विक घोषणाओं को संभाल सके। और यहां कोड को दोबारा तैयार किया गया ताकि प्रतीक तालिका स्थानीय और वैश्विक चर के लिए सही निर्देश उत्पन्न कर सके।
नए प्रतीक तालिका को संभालने के साथ-साथ किसी फ़ंक्शन या प्रक्रिया समाप्त होने के बाद स्थानीय घोषणाओं को साफ करने के लिए यहां जेएएसएम कोड जनरेशन को बदल दिया गया है।
इसके साथ, नीचे दिए गए पास्कल कार्यक्रम से:
program GlobalVarDeclaration; var globalvar : integer; begin globalvar := 123; write (globalvar); end.
POJ अब निम्नलिखित JASM को सही ढंग से उत्पन्न करता है:
// Code generated by POJ 0.1 public class global_var_declaration { public static globalvar I public static main([java/lang/String)V { ;; globalvar := 123; bipush 123 putstatic global_var_declaration.globalvar I ;; write (globalvar); getstatic java/lang/System.out java/io/PrintStream getstatic global_var_declaration.globalvar I invokevirtual java/io/PrintStream.print(I)V return } }
अगली पोस्ट में हम संदर्भों और नेस्टेड वाक्यों के बारे में बात करेंगे।
परियोजना के संपूर्ण कोड और दस्तावेज़ीकरण के साथ भंडार यहां है।
अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।
Copyright© 2022 湘ICP备2022001581号-3